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
3133var 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 },
0 commit comments