@@ -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