@@ -26,12 +26,15 @@ import (
2626 "path"
2727 "path/filepath"
2828 "strings"
29+ "time"
2930
3031 awsconfig "github.com/aws/aws-sdk-go-v2/config"
3132 "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
3233 ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
34+ v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3335 "k8s.io/apimachinery/pkg/runtime"
3436 "k8s.io/apimachinery/pkg/runtime/serializer"
37+
3538 "k8s.io/klog/v2"
3639 "k8s.io/kops/pkg/apis/kops"
3740 "k8s.io/kops/pkg/flagbuilder"
@@ -41,6 +44,7 @@ import (
4144 "k8s.io/kops/upup/pkg/fi/cloudup/awsup"
4245 "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
4346 "k8s.io/kops/util/pkg/distributions"
47+ kubeletv1 "k8s.io/kubelet/config/v1"
4448 kubelet "k8s.io/kubelet/config/v1beta1"
4549)
4650
@@ -467,25 +471,65 @@ func (b *KubeletBuilder) addECRCredentialProvider(c *fi.NodeupModelBuilderContex
467471 }
468472
469473 {
470- configContent := `apiVersion: kubelet.config.k8s.io/v1
471- kind: CredentialProviderConfig
472- providers:
473- - name: ecr-credential-provider
474- matchImages:
475- - "*.dkr.ecr.*.amazonaws.com"
476- - "*.dkr.ecr.*.amazonaws.com.cn"
477- - "*.dkr.ecr-fips.*.amazonaws.com"
478- - "*.dkr.ecr.us-iso-east-1.c2s.ic.gov"
479- - "*.dkr.ecr.us-isob-east-1.sc2s.sgov.gov"
480- defaultCacheDuration: "12h"
481- apiVersion: credentialprovider.kubelet.k8s.io/v1
482- args:
483- - get-credentials
484- `
474+
475+ providerConfig := & kubeletv1.CredentialProviderConfig {}
476+
477+ // Build the list of container registry globs to match
478+ registryList := []string {
479+ "*.dkr.ecr.*.amazonaws.com" ,
480+ "*.dkr.ecr.*.amazonaws.com.cn" ,
481+ "*.dkr.ecr-fips.*.amazonaws.com" ,
482+ "*.dkr.ecr.us-iso-east-1.c2s.ic.gov" ,
483+ }
484+
485+ containerd := b .NodeupConfig .ContainerdConfig
486+ if containerd .UseECRCredentialsForMirrors {
487+ for name := range containerd .RegistryMirrors {
488+ registryList = append (registryList , name )
489+ }
490+ }
491+
492+ cacheDuration , err := time .ParseDuration ("12h" )
493+ if err != nil {
494+ return err
495+ }
496+
497+ providerConfig .Providers = []kubeletv1.CredentialProvider {
498+ {
499+ APIVersion : "credentialprovider.kubelet.k8s.io/v1" ,
500+ Name : "ecr-credential-provider" ,
501+ MatchImages : registryList ,
502+ DefaultCacheDuration : & v1.Duration {Duration : cacheDuration },
503+ Args : []string {"get-credentials" },
504+ Env : []kubeletv1.ExecEnvVar {
505+ {
506+ Name : "AWS_REGION" ,
507+ Value : b .Cloud .Region (),
508+ },
509+ },
510+ },
511+ }
512+
513+ sch := runtime .NewScheme ()
514+ if err := kubeletv1 .AddToScheme (sch ); err != nil {
515+ return err
516+ }
517+
518+ gv := kubeletv1 .SchemeGroupVersion
519+ codecFactory := serializer .NewCodecFactory (sch )
520+ info , ok := runtime .SerializerInfoForMediaType (codecFactory .SupportedMediaTypes (), "application/yaml" )
521+ if ! ok {
522+ return fmt .Errorf ("failed to find serializer" )
523+ }
524+ encoder := codecFactory .EncoderForVersion (info .Serializer , gv )
525+ var w bytes.Buffer
526+ if err := encoder .Encode (providerConfig , & w ); err != nil {
527+ return err
528+ }
485529
486530 t := & nodetasks.File {
487531 Path : credentialProviderConfigFilePath ,
488- Contents : fi .NewStringResource ( configContent ),
532+ Contents : fi .NewBytesResource ( w . Bytes () ),
489533 Type : nodetasks .FileType_File ,
490534 Mode : s ("0644" ),
491535 }
0 commit comments