@@ -26,10 +26,18 @@ jobs:
2626 echo "APP_NAME: ${{ vars.APP_NAME }}"
2727 echo "KARPENTER_NODEPOOL_NAME: ${{ vars.KARPENTER_NODEPOOL_NAME }}"
2828 echo "KARPENTER_NODECLASS_NAME: ${{ vars.KARPENTER_NODECLASS_NAME }}"
29+ echo "KARPENTER_NODE_ROLE: ${{ vars.KARPENTER_NODE_ROLE }}"
30+ echo "KARPENTER_INSTANCE_PROFILE: ${{ vars.KARPENTER_INSTANCE_PROFILE }}"
2931 echo "KARPENTER_NAMESPACE: ${{ vars.KARPENTER_NAMESPACE }}"
3032 if [[ -z "${{ vars.KARPENTER_NODEPOOL_NAME }}" ]]; then
3133 echo "WARNING: KARPENTER_NODEPOOL_NAME variable not found. Karpenter resources may not be deployed."
3234 fi
35+ if [[ -z "${{ vars.KARPENTER_NODE_ROLE }}" ]]; then
36+ echo "WARNING: KARPENTER_NODE_ROLE variable not found. Karpenter resources may not be deployed."
37+ fi
38+ if [[ -z "${{ vars.KARPENTER_INSTANCE_PROFILE }}" ]]; then
39+ echo "WARNING: KARPENTER_INSTANCE_PROFILE variable not found. Karpenter resources may not be deployed."
40+ fi
3341 if [[ -z "${{ vars.KARPENTER_NAMESPACE }}" ]]; then
3442 echo "WARNING: KARPENTER_NAMESPACE variable not found. Karpenter resources may not be deployed."
3543 fi
@@ -73,18 +81,71 @@ jobs:
7381 continue-on-error : true
7482
7583 # ---------------------------
76- # Delete Karpenter Resources
84+ # Delete Karpenter Resources (Updated)
7785 # ---------------------------
78- - name : Delete Karpenter Resources
86+ - name : Delete Karpenter Provisioners and AWSNodeTemplates
87+ run : |
88+ echo "Deleting Karpenter Provisioners..."
89+ kubectl delete provisioner ${{ vars.KARPENTER_NODEPOOL_NAME }} --ignore-not-found -n ${{ vars.KARPENTER_NAMESPACE }} || true
90+ kubectl delete provisioner --all -n ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found || true
91+
92+ echo "Deleting Karpenter AWSNodeTemplates..."
93+ kubectl delete awsnodetemplate ${{ vars.KARPENTER_NODECLASS_NAME }} --ignore-not-found -n ${{ vars.KARPENTER_NAMESPACE }} || true
94+ kubectl delete awsnodetemplate --all -n ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found || true
95+
96+ echo "Waiting for resources to be cleaned up..."
97+ sleep 10
98+ continue-on-error : true
99+
100+ - name : Clean up Karpenter CRDs and Webhooks
101+ run : |
102+ echo "Deleting Karpenter CRDs..."
103+ kubectl delete crd provisioners.karpenter.sh --ignore-not-found || true
104+ kubectl delete crd awsnodetemplates.karpenter.k8s.aws --ignore-not-found || true
105+
106+ echo "Deleting Karpenter webhooks..."
107+ kubectl delete validatingwebhookconfiguration defaulting.webhook.karpenter.sh --ignore-not-found || true
108+ kubectl delete validatingwebhookconfiguration validation.webhook.karpenter.sh --ignore-not-found || true
109+ kubectl delete mutatingwebhookconfiguration defaulting.webhook.karpenter.sh --ignore-not-found || true
110+
111+ echo "Deleting Karpenter finalizers if stuck..."
112+ kubectl patch crd provisioners.karpenter.sh -p '{"metadata":{"finalizers":[]}}' --type=merge || true
113+ kubectl patch crd awsnodetemplates.karpenter.k8s.aws -p '{"metadata":{"finalizers":[]}}' --type=merge || true
114+ continue-on-error : true
115+
116+
117+ - name : Uninstall Karpenter Helm Release
79118 run : |
80- kubectl delete nodepool ${{ vars.KARPENTER_NODEPOOL_NAME }} -n ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found || true
81- kubectl delete ec2nodeclass ${{ vars.KARPENTER_NODECLASS_NAME }} -n ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found || true
82- helm uninstall karpenter-config -n ${{ vars.KARPENTER_NAMESPACE }} || true
119+ echo "Uninstalling Karpenter Helm release..."
83120 helm uninstall karpenter -n ${{ vars.KARPENTER_NAMESPACE }} || true
121+
122+ echo "Waiting for pods to terminate..."
123+ kubectl wait --for=delete pod -l app.kubernetes.io/name=karpenter -n ${{ vars.KARPENTER_NAMESPACE }} --timeout=120s || true
124+
125+ echo "Force deleting any remaining pods..."
126+ kubectl delete pods --all -n ${{ vars.KARPENTER_NAMESPACE }} --force --grace-period=0 || true
127+ continue-on-error : true
128+
129+ - name : Clean up Karpenter CRDs and Webhooks
130+ run : |
131+ echo "Deleting Karpenter CRDs..."
132+ kubectl delete crd nodepools.karpenter.sh --ignore-not-found || true
133+ kubectl delete crd provisioners.karpenter.sh --ignore-not-found || true
134+ kubectl delete crd awsnodetemplates.karpenter.k8s.aws --ignore-not-found || true
135+ kubectl delete crd ec2nodeclasses.karpenter.k8s.aws --ignore-not-found || true
136+
137+ echo "Deleting Karpenter webhooks..."
138+ kubectl delete validatingwebhookconfiguration defaulting.webhook.karpenter.sh --ignore-not-found || true
139+ kubectl delete validatingwebhookconfiguration validation.webhook.karpenter.sh --ignore-not-found || true
140+ kubectl delete mutatingwebhookconfiguration defaulting.webhook.karpenter.sh --ignore-not-found || true
141+
142+ echo "Deleting Karpenter finalizers if stuck..."
143+ kubectl patch crd nodepools.karpenter.sh -p '{"metadata":{"finalizers":[]}}' --type=merge || true
144+ kubectl patch crd ec2nodeclasses.karpenter.k8s.aws -p '{"metadata":{"finalizers":[]}}' --type=merge || true
84145 continue-on-error : true
85146
86147 # ---------------------------
87- # Uninstall Helm Releases
148+ # Uninstall Other Helm Releases
88149 # ---------------------------
89150 - name : Uninstall Helm Releases
90151 run : |
@@ -102,14 +163,17 @@ jobs:
102163 kubectl delete namespace ${{ vars.APP_NAMESPACE }} --ignore-not-found
103164 kubectl delete namespace ${{ vars.MONITORING_NAMESPACE }} --ignore-not-found
104165 kubectl delete namespace ${{ vars.ARGOCD_NAMESPACE }} --ignore-not-found
105- kubectl delete namespace ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found
106166 kubectl delete namespace ingress-nginx --ignore-not-found
167+
168+ # Delete Karpenter namespace last and force if needed
169+ kubectl delete namespace ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found --timeout=60s || true
170+ kubectl delete namespace ${{ vars.KARPENTER_NAMESPACE }} --force --grace-period=0 --ignore-not-found || true
107171 continue-on-error : true
108172
109173 # ---------------------------
110174 # Delete CRDs (Prometheus & Grafana)
111175 # ---------------------------
112- - name : Delete CRDs
176+ - name : Delete Monitoring CRDs
113177 run : |
114178 kubectl get crd -o name | grep -E 'prometheus|grafana|alertmanager|servicemonitor|prometheusrule' | xargs -r kubectl delete || true
115179 continue-on-error : true
@@ -123,6 +187,19 @@ jobs:
123187 kubectl delete pv --all || true
124188 continue-on-error : true
125189
190+ # ---------------------------
191+ # Final cleanup verification
192+ # ---------------------------
193+ - name : Verify Karpenter cleanup
194+ run : |
195+ echo "Verifying Karpenter cleanup..."
196+ kubectl get pods -n ${{ vars.KARPENTER_NAMESPACE }} || echo "Karpenter namespace not found (expected)"
197+ kubectl get crd | grep karpenter || echo "No Karpenter CRDs found (expected)"
198+ kubectl get validatingwebhookconfiguration | grep karpenter || echo "No Karpenter webhooks found (expected)"
199+ kubectl get mutatingwebhookconfiguration | grep karpenter || echo "No Karpenter webhooks found (expected)"
200+ helm list -n ${{ vars.KARPENTER_NAMESPACE }} || echo "No Helm releases in karpenter namespace (expected)"
201+ continue-on-error : true
202+
126203 # ---------------------------
127204 # Wait for cleanup to complete
128205 # ---------------------------
@@ -156,6 +233,8 @@ jobs:
156233 gh variable delete APP_NAME --repo $GITHUB_REPOSITORY || true
157234 gh variable delete KARPENTER_NODEPOOL_NAME --repo $GITHUB_REPOSITORY || true
158235 gh variable delete KARPENTER_NODECLASS_NAME --repo $GITHUB_REPOSITORY || true
236+ gh variable delete KARPENTER_NODE_ROLE --repo $GITHUB_REPOSITORY || true
237+ gh variable delete KARPENTER_INSTANCE_PROFILE --repo $GITHUB_REPOSITORY || true
159238 gh variable delete KARPENTER_NAMESPACE --repo $GITHUB_REPOSITORY || true
160239 env :
161240 GITHUB_TOKEN : ${{ secrets.PAT_GITHUB }}
0 commit comments