Skip to content

Commit b8ad31c

Browse files
authored
Merge pull request #5009 from jas-nik/vpc-cni-helm
🐛 Remove Helm condition for AWS VPC CNI deletion
2 parents 8d68d03 + 02198d3 commit b8ad31c

File tree

3 files changed

+39
-17
lines changed

3 files changed

+39
-17
lines changed

docs/book/src/topics/eks/pod-networking.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,26 @@ spec:
9797
disableVPCCNI: true
9898
```
9999

100+
If you are replacing Amazon VPC CNI with your own helm managed instance, you will need to set `AWSManagedControlPlane.spec.disableVPCCNI` to `true` and add `"prevent-deletion": "true"` label on the Daemonset. This label is needed so `aws-node` daemonset is not reaped during CNI reconciliation.
101+
102+
The following example shows how to label your aws-node Daemonset.
103+
104+
```yaml
105+
apiVersion: apps/v1
106+
kind: DaemonSet
107+
metadata:
108+
annotations:
109+
...
110+
generation: 1
111+
labels:
112+
app.kubernetes.io/instance: aws-vpc-cni
113+
app.kubernetes.io/managed-by: Helm
114+
app.kubernetes.io/name: aws-node
115+
app.kubernetes.io/version: v1.15.1
116+
helm.sh/chart: aws-vpc-cni-1.15.1
117+
prevent-deletion: true
118+
```
119+
100120
> You cannot set **disableVPCCNI** to true if you are using the VPC CNI addon.
101121

102122
Some alternative CNIs provide for the replacement of kube-proxy, such as in [Calico](https://projectcalico.docs.tigera.io/maintenance/ebpf/enabling-ebpf#configure-kube-proxy) and [Cilium](https://docs.cilium.io/en/stable/gettingstarted/kubeproxy-free/). When enabling the kube-proxy alternative, the kube-proxy installed by EKS must be deleted. This can be done via the **disable** property of **kubeProxy** in **AWSManagedControlPlane**:

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ require (
5757
sigs.k8s.io/cluster-api v1.7.1
5858
sigs.k8s.io/cluster-api/test v1.7.1
5959
sigs.k8s.io/controller-runtime v0.17.3
60-
sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3
6160
sigs.k8s.io/yaml v1.4.0
6261
)
6362

@@ -226,6 +225,7 @@ require (
226225
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect
227226
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
228227
sigs.k8s.io/kind v0.22.0 // indirect
228+
sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect
229229
sigs.k8s.io/kustomize/kustomize/v5 v5.0.4-0.20230601165947-6ce0bf390ce3 // indirect
230230
sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect
231231
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect

pkg/cloud/services/awsnode/cni.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import (
3131
"k8s.io/apimachinery/pkg/types"
3232
"k8s.io/klog/v2"
3333
"sigs.k8s.io/controller-runtime/pkg/client"
34-
"sigs.k8s.io/kustomize/api/konfig"
3534

3635
infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
3736
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/awserrors"
@@ -272,22 +271,25 @@ func (s *Service) deleteResource(ctx context.Context, remoteClient client.Client
272271
return fmt.Errorf("deleting resource %s: %w", key, err)
273272
}
274273
s.scope.Debug(fmt.Sprintf("resource %s was not found, no action", key))
275-
} else {
276-
// resource found, delete if no label or not managed by helm
277-
if val, ok := obj.GetLabels()[konfig.ManagedbyLabelKey]; !ok || val != "Helm" {
278-
if err := remoteClient.Delete(ctx, obj, &client.DeleteOptions{}); err != nil {
279-
if !apierrors.IsNotFound(err) {
280-
return fmt.Errorf("deleting %s: %w", key, err)
281-
}
282-
s.scope.Debug(fmt.Sprintf(
283-
"resource %s was not found, not deleted", key))
284-
} else {
285-
s.scope.Debug(fmt.Sprintf("resource %s was deleted", key))
286-
}
287-
} else {
288-
s.scope.Debug(fmt.Sprintf("resource %s is managed by helm, not deleted", key))
274+
return nil
275+
}
276+
// Don't delete if the `prevent-deletion` label exists. It could be there because CAPA added it (see below),
277+
// or because it was added externally, for example if a custom version of AWS CNI was already installed.
278+
// Either way, CAPA should not delete such a labelled CNI installation.
279+
labels := obj.GetLabels()
280+
if _, exists := labels["prevent-deletion"]; exists {
281+
s.scope.Debug(fmt.Sprintf("resource %s has 'prevent-deletion' label, skipping deletion", key))
282+
return nil
283+
}
284+
// Delete the resource
285+
if err := remoteClient.Delete(ctx, obj, &client.DeleteOptions{}); err != nil {
286+
if !apierrors.IsNotFound(err) {
287+
return fmt.Errorf("failed to delete %s: %w", key, err)
289288
}
289+
s.scope.Debug(fmt.Sprintf(
290+
"resource %s was not found, not deleted", key))
291+
} else {
292+
s.scope.Debug(fmt.Sprintf("resource %s was deleted", key))
290293
}
291-
292294
return nil
293295
}

0 commit comments

Comments
 (0)