Skip to content

Commit 76ba007

Browse files
committed
feat(nodeadm): support public ecr authenticated ipv6 pulls
1 parent a0ee120 commit 76ba007

File tree

5 files changed

+64
-21
lines changed

5 files changed

+64
-21
lines changed

nodeadm/internal/kubelet/daemon.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func (k *kubelet) Configure(cfg *api.NodeConfig) error {
3838
if err := k.writeKubeconfig(cfg); err != nil {
3939
return err
4040
}
41-
if err := k.writeImageCredentialProviderConfig(); err != nil {
41+
if err := k.writeImageCredentialProviderConfig(cfg.Status.KubeletVersion); err != nil {
4242
return err
4343
}
4444
if err := writeClusterCaCert(cfg.Spec.Cluster.CertificateAuthority); err != nil {

nodeadm/internal/kubelet/image-credential-provider.go

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"path/filepath"
99
"time"
1010

11+
"golang.org/x/mod/semver"
12+
1113
"github.com/awslabs/amazon-eks-ami/nodeadm/internal/util"
1214
"go.uber.org/zap"
1315
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -30,7 +32,7 @@ const (
3032

3133
var imageCredentialProviderConfigPath = path.Join(imageCredentialProviderRoot, imageCredentialProviderConfig)
3234

33-
func (k *kubelet) writeImageCredentialProviderConfig() error {
35+
func (k *kubelet) writeImageCredentialProviderConfig(kubeletVersion string) error {
3436
// fallback default for image credential provider binary if not overridden
3537
ecrCredentialProviderBinPath := path.Join(imageCredentialProviderRoot, "ecr-credential-provider")
3638
if binPath, set := os.LookupEnv(ecrCredentialProviderBinPathEnvironmentName); set {
@@ -41,7 +43,7 @@ func (k *kubelet) writeImageCredentialProviderConfig() error {
4143
return err
4244
}
4345

44-
config, err := generateImageCredentialProviderConfig(ecrCredentialProviderBinPath)
46+
config, err := generateImageCredentialProviderConfig(kubeletVersion, ecrCredentialProviderBinPath)
4547
if err != nil {
4648
return err
4749
}
@@ -52,25 +54,34 @@ func (k *kubelet) writeImageCredentialProviderConfig() error {
5254
return util.WriteFileWithDir(imageCredentialProviderConfigPath, config, imageCredentialProviderPerm)
5355
}
5456

55-
func generateImageCredentialProviderConfig(ecrCredentialProviderBinPath string) ([]byte, error) {
57+
func generateImageCredentialProviderConfig(kubeletVersion, ecrCredentialProviderBinPath string) ([]byte, error) {
58+
ecrMatchImages := []string{
59+
"*.dkr.ecr.*.amazonaws.com",
60+
"*.dkr-ecr.*.on.aws",
61+
"*.dkr.ecr.*.amazonaws.com.cn",
62+
"*.dkr-ecr.*.on.amazonwebservices.com.cn",
63+
"*.dkr.ecr-fips.*.amazonaws.com",
64+
"*.dkr-ecr-fips.*.on.aws",
65+
"*.dkr.ecr.*.c2s.ic.gov",
66+
"*.dkr.ecr.*.sc2s.sgov.gov",
67+
"*.dkr.ecr.*.cloud.adc-e.uk",
68+
"*.dkr.ecr.*.csp.hci.ic.gov",
69+
"*.dkr.ecr.*.amazonaws.eu",
70+
"public.ecr.aws",
71+
}
72+
if semver.Compare(kubeletVersion, "v1.32.0") >= 0 {
73+
// currently only v1.32.0+ of ecr-credential-provider supports this
74+
// https://github.com/kubernetes/cloud-provider-aws/pull/1332
75+
// it is safe to add for all versions since kubelet tries all providers
76+
// and falls back to unauthenticated on failure, but matching it
77+
// when it is known not to work adds unnecessary latency (albeit slight)
78+
ecrMatchImages = append(ecrMatchImages, "ecr-public.aws.com")
79+
}
5680
cfg := configv1.CredentialProviderConfig{
5781
Providers: []configv1.CredentialProvider{
5882
{
59-
Name: filepath.Base(ecrCredentialProviderBinPath),
60-
MatchImages: []string{
61-
"*.dkr.ecr.*.amazonaws.com",
62-
"*.dkr-ecr.*.on.aws",
63-
"*.dkr.ecr.*.amazonaws.com.cn",
64-
"*.dkr-ecr.*.on.amazonwebservices.com.cn",
65-
"*.dkr.ecr-fips.*.amazonaws.com",
66-
"*.dkr-ecr-fips.*.on.aws",
67-
"*.dkr.ecr.*.c2s.ic.gov",
68-
"*.dkr.ecr.*.sc2s.sgov.gov",
69-
"*.dkr.ecr.*.cloud.adc-e.uk",
70-
"*.dkr.ecr.*.csp.hci.ic.gov",
71-
"*.dkr.ecr.*.amazonaws.eu",
72-
"public.ecr.aws",
73-
},
83+
Name: filepath.Base(ecrCredentialProviderBinPath),
84+
MatchImages: ecrMatchImages,
7485
APIVersion: "credentialprovider.kubelet.k8s.io/v1",
7586
DefaultCacheDuration: &metav1.Duration{Duration: 12 * time.Hour},
7687
},
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"apiVersion": "kubelet.config.k8s.io/v1",
3+
"kind": "CredentialProviderConfig",
4+
"providers": [
5+
{
6+
"name": "ecr-credential-provider",
7+
"matchImages": [
8+
"*.dkr.ecr.*.amazonaws.com",
9+
"*.dkr-ecr.*.on.aws",
10+
"*.dkr.ecr.*.amazonaws.com.cn",
11+
"*.dkr-ecr.*.on.amazonwebservices.com.cn",
12+
"*.dkr.ecr-fips.*.amazonaws.com",
13+
"*.dkr-ecr-fips.*.on.aws",
14+
"*.dkr.ecr.*.c2s.ic.gov",
15+
"*.dkr.ecr.*.sc2s.sgov.gov",
16+
"*.dkr.ecr.*.cloud.adc-e.uk",
17+
"*.dkr.ecr.*.csp.hci.ic.gov",
18+
"*.dkr.ecr.*.amazonaws.eu",
19+
"public.ecr.aws"
20+
],
21+
"defaultCacheDuration": "12h0m0s",
22+
"apiVersion": "credentialprovider.kubelet.k8s.io/v1"
23+
}
24+
]
25+
}

nodeadm/test/e2e/cases/image-credential-provider/expected-image-credential-provider-config.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"*.dkr.ecr.*.cloud.adc-e.uk",
1717
"*.dkr.ecr.*.csp.hci.ic.gov",
1818
"*.dkr.ecr.*.amazonaws.eu",
19-
"public.ecr.aws"
19+
"public.ecr.aws",
20+
"ecr-public.aws.com"
2021
],
2122
"defaultCacheDuration": "12h0m0s",
2223
"apiVersion": "credentialprovider.kubelet.k8s.io/v1"

nodeadm/test/e2e/cases/image-credential-provider/run.sh

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ source /helpers.sh
99
mock::aws
1010
wait::dbus-ready
1111

12-
mock::kubelet 1.32.0
12+
mock::kubelet 1.31.0
13+
14+
nodeadm init --skip run --config-source file://config.yaml
15+
16+
assert::json-files-equal /etc/eks/image-credential-provider/config.json expected-image-credential-provider-config-1.31.json
17+
18+
mock::kubelet 1.36.0
1319

1420
nodeadm init --skip run --config-source file://config.yaml
1521

0 commit comments

Comments
 (0)