@@ -5,12 +5,14 @@ package taints
55
66import (
77 "context"
8+ "fmt"
89 "strings"
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"
1416 bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1"
1517 runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
1618 ctrl "sigs.k8s.io/controller-runtime"
@@ -48,6 +50,10 @@ func newTaintsWorkerPatchHandler(
4850 }
4951}
5052
53+ type KubeletRegisterOptions struct {
54+ RegisterWithTaints []v1.Taint `json:"registerWithTaints,omitempty"`
55+ }
56+
5157func (h * taintsWorkerPatchHandler ) Mutate (
5258 ctx context.Context ,
5359 obj * unstructured.Unstructured ,
@@ -103,25 +109,36 @@ func (h *taintsWorkerPatchHandler) Mutate(
103109
104110 if err := patches .MutateIfApplicable (
105111 obj , vars , & holderRef ,
106- selectors .WorkersConfigTemplateSelector (eksbootstrapv1 .GroupVersion .String (), "EKSConfigTemplate " ), log ,
107- func (obj * eksbootstrapv1.EKSConfigTemplate ) error {
112+ selectors .WorkersConfigTemplateSelector (eksbootstrapv1 .GroupVersion .String (), "NodeadmConfigTemplate " ), log ,
113+ func (obj * eksbootstrapv1.NodeadmConfigTemplate ) error {
108114 log .WithValues (
109115 "patchedObjectKind" , obj .GetObjectKind ().GroupVersionKind ().String (),
110116 "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 )
117+ ).Info ("adding taints to worker NodeadmConfig template" )
118+ kubeletOptions := obj .Spec .Template .Spec .Kubelet
119+ var runtimeConfigFromNodeadm * runtime.RawExtension
120+ var flags []string
121+ newTaints := toEKSConfigTaints (taintsVar )
122+ hasRegisterTaintsFlag := false
123+ if kubeletOptions != nil {
124+ runtimeConfigFromNodeadm = kubeletOptions .Config
125+ for _ , flag := range kubeletOptions .Flags {
126+ if strings .HasPrefix (flag , "--register-with-taints=" ) {
127+ hasRegisterTaintsFlag = true
128+ existingTaints := strings .Split (flag , "--register-with-taints=" )
129+ flags = append (flags , fmt .Sprintf ("--register-with-taints=%s,%s" , existingTaints , newTaints ))
130+ continue
131+ }
132+ flags = append (flags , flag )
133+ }
114134 }
115-
116- existingTaintsFlagValue := obj .Spec .Template .Spec .KubeletExtraArgs ["register-with-taints" ]
117-
118- newTaintsFlagValue := toEKSConfigTaints (taintsVar )
119-
120- if existingTaintsFlagValue != "" {
121- newTaintsFlagValue = existingTaintsFlagValue + "," + newTaintsFlagValue
135+ if ! hasRegisterTaintsFlag {
136+ flags = append (flags , fmt .Sprintf ("--register-with-taints=%s" , newTaints ))
137+ }
138+ obj .Spec .Template .Spec .Kubelet = & eksbootstrapv1.KubeletOptions {
139+ Flags : flags ,
140+ Config : runtimeConfigFromNodeadm ,
122141 }
123-
124- obj .Spec .Template .Spec .KubeletExtraArgs ["register-with-taints" ] = newTaintsFlagValue
125142 return nil
126143 }); err != nil {
127144 return err
0 commit comments