@@ -178,11 +178,12 @@ func (r *KarpenterMachinePoolReconciler) Reconcile(ctx context.Context, req reco
178
178
karpenterMachinePool .Status .Replicas = numberOfNodeClaims
179
179
karpenterMachinePool .Status .Ready = true
180
180
181
- logger .Info ("Found NodeClaims in workload cluster, patching KarpenterMachinePool" , "numberOfNodeClaims" , numberOfNodeClaims )
182
-
183
- if err := r .client .Status ().Patch (ctx , karpenterMachinePool , client .MergeFrom (karpenterMachinePoolCopy ), client .FieldOwner ("karpentermachinepool-controller" )); err != nil {
184
- logger .Error (err , "failed to patch karpenterMachinePool.status.Replicas" )
185
- return reconcile.Result {}, err
181
+ if ! karpenterMachinePoolCopy .Status .Ready || karpenterMachinePoolCopy .Status .Replicas != numberOfNodeClaims {
182
+ logger .Info ("Found NodeClaims in workload cluster, patching KarpenterMachinePool.status field" , "numberOfNodeClaims" , numberOfNodeClaims )
183
+ if err := r .client .Status ().Patch (ctx , karpenterMachinePool , client .MergeFrom (karpenterMachinePoolCopy ), client .FieldOwner ("karpentermachinepool-controller" )); err != nil {
184
+ logger .Error (err , "failed to patch karpenterMachinePool.status.Replicas" )
185
+ return reconcile.Result {}, err
186
+ }
186
187
}
187
188
188
189
karpenterMachinePool .Spec .ProviderIDList = providerIDList
@@ -193,6 +194,7 @@ func (r *KarpenterMachinePoolReconciler) Reconcile(ctx context.Context, req reco
193
194
}
194
195
195
196
if machinePool .Spec .Replicas == nil || * machinePool .Spec .Replicas != numberOfNodeClaims {
197
+ logger .Info ("Patching MachinePool.spec.replicas field" , "numberOfNodeClaims" , numberOfNodeClaims )
196
198
machinePoolCopy := machinePool .DeepCopy ()
197
199
machinePool .Spec .Replicas = & numberOfNodeClaims
198
200
if err := r .client .Patch (ctx , machinePool , client .MergeFrom (machinePoolCopy ), client .FieldOwner ("karpenter-machinepool-controller" )); err != nil {
@@ -212,22 +214,34 @@ func (r *KarpenterMachinePoolReconciler) reconcileDelete(ctx context.Context, lo
212
214
}
213
215
214
216
// Terminate EC2 instances with the karpenter.sh/nodepool tag matching the KarpenterMachinePool name
215
- logger .Info ("Terminating EC2 instances for KarpenterMachinePool" , "karpenterMachinePoolName" , karpenterMachinePool .Name )
216
- instanceIDs , err := ec2Client .TerminateInstancesByTag (ctx , logger , "karpenter.sh/nodepool" , karpenterMachinePool .Name )
217
+ _ , err = ec2Client .TerminateInstancesByTag (ctx , logger , "karpenter.sh/nodepool" , karpenterMachinePool .Name )
217
218
if err != nil {
218
219
return reconcile.Result {}, fmt .Errorf ("failed to terminate EC2 instances: %w" , err )
219
220
}
221
+ }
222
+
223
+ workloadClusterClient , err := r .clusterClientGetter (ctx , "" , r .client , client .ObjectKeyFromObject (cluster ))
224
+ if err != nil {
225
+ return reconcile.Result {}, err
226
+ }
220
227
221
- logger .Info ("Found instances" , "instanceIDs" , instanceIDs )
228
+ nodePool := & unstructured.Unstructured {}
229
+ nodePool .SetGroupVersionKind (schema.GroupVersionKind {
230
+ Group : "karpenter.sh" ,
231
+ Kind : "NodePool" ,
232
+ Version : "v1" ,
233
+ })
234
+ err = workloadClusterClient .Get (ctx , client.ObjectKey {Name : karpenterMachinePool .Name }, nodePool )
235
+ if client .IgnoreNotFound (err ) != nil {
236
+ return reconcile.Result {}, err
237
+ }
222
238
223
- // Requeue if we find instances to terminate. Once there are no instances to terminate, we proceed to remove the finalizer.
224
- // We do this when the cluster is being deleted, to avoid removing the finalizer before karpenter launches a new instance that would be left over.
225
- if len (instanceIDs ) > 0 {
226
- return reconcile.Result {RequeueAfter : 30 * time .Second }, nil
227
- }
239
+ // Requeue if we find the karpenter NodePool CR, otherwise `karpenter` may launch new instances for it
240
+ if err == nil {
241
+ return reconcile.Result {RequeueAfter : 30 * time .Second }, nil
228
242
}
229
243
230
- // Create deep copy of the reconciled object so we can change it
244
+ // Create a deep copy of the reconciled object so we can change it
231
245
karpenterMachinePoolCopy := karpenterMachinePool .DeepCopy ()
232
246
233
247
controllerutil .RemoveFinalizer (karpenterMachinePool , KarpenterFinalizer )
0 commit comments