@@ -5,12 +5,15 @@ package taints
55
66import  (
77	"context" 
8- 	"strings" 
8+ 	"encoding/json" 
9+ 	"fmt" 
910
1011	"github.com/samber/lo" 
1112	v1 "k8s.io/api/core/v1" 
1213	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" 
1314	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 
15+ 	"k8s.io/apimachinery/pkg/runtime" 
16+ 	kubeletconfig "k8s.io/kubelet/config/v1beta1" 
1417	bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" 
1518	runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1" 
1619	ctrl "sigs.k8s.io/controller-runtime" 
@@ -48,6 +51,10 @@ func newTaintsWorkerPatchHandler(
4851	}
4952}
5053
54+ type  KubeletRegisterOptions  struct  {
55+ 	RegisterWithTaints  []v1.Taint  `json:"registerWithTaints,omitempty"` 
56+ }
57+ 
5158func  (h  * taintsWorkerPatchHandler ) Mutate (
5259	ctx  context.Context ,
5360	obj  * unstructured.Unstructured ,
@@ -103,25 +110,56 @@ func (h *taintsWorkerPatchHandler) Mutate(
103110
104111	if  err  :=  patches .MutateIfApplicable (
105112		obj , vars , & holderRef ,
106- 		selectors .WorkersConfigTemplateSelector (eksbootstrapv1 .GroupVersion .String (), "EKSConfigTemplate " ), log ,
107- 		func (obj  * eksbootstrapv1.EKSConfigTemplate ) error  {
113+ 		selectors .WorkersConfigTemplateSelector (eksbootstrapv1 .GroupVersion .String (), "NodeadmConfigTemplate " ), log ,
114+ 		func (obj  * eksbootstrapv1.NodeadmConfigTemplate ) error  {
108115			log .WithValues (
109116				"patchedObjectKind" , obj .GetObjectKind ().GroupVersionKind ().String (),
110117				"patchedObjectName" , ctrlclient .ObjectKeyFromObject (obj ),
111- 			).Info ("adding taints to worker node EKS config template" )
112- 			if  obj .Spec .Template .Spec .KubeletExtraArgs  ==  nil  {
113- 				obj .Spec .Template .Spec .KubeletExtraArgs  =  make (map [string ]string , 1 )
118+ 			).Info ("adding taints to worker NodeadmConfig template" )
119+ 			kubeletOptions  :=  obj .Spec .Template .Spec .Kubelet 
120+ 			config  :=  & kubeletconfig.KubeletConfiguration {}
121+ 			hasKubeletConfigSet  :=  false 
122+ 			var  flags  []string 
123+ 			var  configRaw  []byte 
124+ 			// if we have config, use that 
125+ 			if  kubeletOptions  !=  nil  {
126+ 				flags  =  kubeletOptions .Flags 
127+ 				if  kubeletOptions .Config  !=  nil  {
128+ 					hasKubeletConfigSet  =  true 
129+ 					configObj  :=  kubeletOptions .Config .Object 
130+ 					var  ok  bool 
131+ 					config , ok  =  configObj .(* kubeletconfig.KubeletConfiguration )
132+ 					if  ! ok  {
133+ 						return  fmt .Errorf (
134+ 							"expected Kubelet Config object in NodeadmConfigTemplate.Spec.Template.Spec.Kubelet.Config but got %v" ,
135+ 							configObj ,
136+ 						)
137+ 					}
138+ 					config .RegisterWithTaints  =  toCoreTaints (
139+ 						config .RegisterWithTaints ,
140+ 						taintsVar ,
141+ 					)
142+ 					configRaw , err  =  json .Marshal (config )
143+ 					if  err  !=  nil  {
144+ 						return  fmt .Errorf ("failed to marshal config %w" , err )
145+ 					}
146+ 				}
114147			}
115- 
116- 			existingTaintsFlagValue  :=  obj .Spec .Template .Spec .KubeletExtraArgs ["register-with-taints" ]
117- 
118- 			newTaintsFlagValue  :=  toEKSConfigTaints (taintsVar )
119- 
120- 			if  existingTaintsFlagValue  !=  ""  {
121- 				newTaintsFlagValue  =  existingTaintsFlagValue  +  ","  +  newTaintsFlagValue 
148+ 			if  ! hasKubeletConfigSet  {
149+ 				newConfig  :=  KubeletRegisterOptions {
150+ 					toCoreTaints (nil , taintsVar ),
151+ 				}
152+ 				configRaw , err  =  json .Marshal (newConfig )
153+ 				if  err  !=  nil  {
154+ 					return  fmt .Errorf ("failed to marshal config %w" , err )
155+ 				}
156+ 			}
157+ 			obj .Spec .Template .Spec .Kubelet  =  & eksbootstrapv1.KubeletOptions {
158+ 				Config : & runtime.RawExtension {
159+ 					Raw : configRaw ,
160+ 				},
161+ 				Flags : flags ,
122162			}
123- 
124- 			obj .Spec .Template .Spec .KubeletExtraArgs ["register-with-taints" ] =  newTaintsFlagValue 
125163			return  nil 
126164		}); err  !=  nil  {
127165		return  err 
@@ -156,16 +194,3 @@ func toCoreTaints(existingTaints []v1.Taint, newTaints []v1alpha1.Taint) []v1.Ta
156194		return  append (existingTaints , newCoreTaints ... )
157195	}
158196}
159- 
160- func  toEKSConfigTaints (newTaints  []v1alpha1.Taint ) string  {
161- 	taintValues  :=  lo .Map (newTaints , func (t  v1alpha1.Taint , _  int ) string  {
162- 		taint  :=  t .Key 
163- 		if  t .Value  !=  ""  {
164- 			taint  +=  "="  +  t .Value 
165- 		}
166- 		taint  +=  ":"  +  string (t .Effect )
167- 		return  taint 
168- 	})
169- 
170- 	return  strings .Join (taintValues , "," )
171- }
0 commit comments