@@ -124,66 +124,73 @@ jobs:
124124 # ==================================================
125125 # PHASE 3: CLEAN UP KARPENTER RESOURCES
126126 # ==================================================
127- - name : Delete Karpenter Resources
127+ - name : Delete Karpenter Resources (Legacy API)
128128 run : |
129- echo "🚗 Cleaning up Karpenter resources..."
129+ echo "Cleaning up Karpenter resources (legacy API versions) ..."
130130
131- # Delete Karpenter custom resources first
132- echo "Deleting Karpenter NodePools and EC2NodeClasses ..."
133- kubectl delete nodepool --all --ignore-not-found --timeout=60s || true
134- kubectl delete ec2nodeclass --all --ignore-not-found --timeout=60s || true
131+ # Delete LEGACY Karpenter Provisioners (v1alpha5) - THIS IS WHAT YOU'RE USING
132+ echo "Deleting legacy Karpenter Provisioners (v1alpha5) ..."
133+ kubectl delete provisioner ${{ vars.KARPENTER_NODEPOOL_NAME }} --ignore-not-found --timeout=60s || true
134+ kubectl delete provisioner --all --ignore-not-found --timeout=60s || true
135135
136- # Delete legacy Karpenter resources
137- echo "Deleting legacy Karpenter Provisioners and AWSNodeTemplates..."
138- kubectl delete provisioner ${{ vars.KARPENTER_NODEPOOL_NAME }} --ignore-not-found -n ${{ vars.KARPENTER_NAMESPACE }} --timeout=60s || true
139- kubectl delete provisioner --all -n ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found --timeout=60s || true
140- kubectl delete awsnodetemplate ${{ vars.KARPENTER_NODECLASS_NAME }} --ignore-not-found -n ${{ vars.KARPENTER_NAMESPACE }} --timeout=60s || true
141- kubectl delete awsnodetemplate --all -n ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found --timeout=60s || true
136+ # Delete LEGACY AWSNodeTemplates (v1alpha1) - THIS IS WHAT YOU'RE USING
137+ echo "Deleting legacy AWSNodeTemplates (v1alpha1)..."
138+ kubectl delete awsnodetemplate ${{ vars.KARPENTER_NODECLASS_NAME }} --ignore-not-found --timeout=60s || true
139+ kubectl delete awsnodetemplate --all --ignore-not-found --timeout=60s || true
142140
143- echo "⏳ Waiting for Karpenter resources to be cleaned up..."
144- sleep 30
145- echo "✅ Karpenter resources cleanup completed"
141+ # Remove finalizers from legacy resources if they're stuck
142+ echo "Removing finalizers from stuck Provisioners..."
143+ kubectl get provisioner -o name | xargs -r -I {} kubectl patch {} -p '{"metadata":{"finalizers":[]}}' --type=merge || true
144+
145+ echo "Removing finalizers from stuck AWSNodeTemplates..."
146+ kubectl get awsnodetemplate -o name | xargs -r -I {} kubectl patch {} -p '{"metadata":{"finalizers":[]}}' --type=merge || true
147+
148+ echo "Waiting for Karpenter resources to be cleaned up..."
149+ sleep 60
150+ echo "Karpenter resources cleanup completed"
146151 continue-on-error : true
147152
148- - name : Uninstall Karpenter Helm Release
153+ - name : Force Delete Karpenter Nodes from Kubernetes
149154 run : |
150- echo "📦 Uninstalling Karpenter Helm release..."
151- helm uninstall karpenter -n ${{ vars.KARPENTER_NAMESPACE }} --timeout=300s || true
155+ echo "Removing Karpenter-managed nodes from Kubernetes cluster..."
152156
153- echo "⏳ Waiting for Karpenter pods to terminate..."
154- kubectl wait --for=delete pod -l app.kubernetes.io/name=karpenter -n ${{ vars.KARPENTER_NAMESPACE }} --timeout=120s || true
157+ # Delete nodes that have Karpenter labels
158+ kubectl get nodes -l karpenter.sh/provisioner-name --no-headers -o custom-columns=":metadata.name" | xargs -r kubectl delete node --timeout=60s || true
159+ kubectl get nodes -l karpenter.sh/cluster=${{ vars.CLUSTER_NAME }} --no-headers -o custom-columns=":metadata.name" | xargs -r kubectl delete node --timeout=60s || true
155160
156- echo "💥 Force deleting any remaining Karpenter pods..."
157- kubectl delete pods --all -n ${{ vars.KARPENTER_NAMESPACE }} --force --grace-period=0 || true
158- echo "✅ Karpenter Helm release uninstalled"
161+ # Also try generic Karpenter node labels
162+ kubectl get nodes -l node.kubernetes.io/instance-type --no-headers -o custom-columns=":metadata.name" | while read node; do
163+ if kubectl describe node $node | grep -q "karpenter"; then
164+ echo "Deleting Karpenter node: $node"
165+ kubectl delete node $node --timeout=60s || true
166+ fi
167+ done || true
168+
169+ echo "Node cleanup completed"
159170 continue-on-error : true
160171
161- - name : Clean up Karpenter CRDs and Webhooks
172+ - name : Clean up Karpenter CRDs and Webhooks (Kubectl Only)
162173 run : |
163- echo "🧹 Cleaning up Karpenter CRDs and webhooks..."
164-
165- # Delete Karpenter CRDs
166- echo "Deleting Karpenter CRDs..."
167- kubectl delete crd provisioners.karpenter.sh --ignore-not-found --timeout=60s || true
168- kubectl delete crd awsnodetemplates.karpenter.k8s.aws --ignore-not-found --timeout=60s || true
169- kubectl delete crd nodepools.karpenter.sh --ignore-not-found --timeout=60s || true
170- kubectl delete crd ec2nodeclasses.karpenter.k8s.aws --ignore-not-found --timeout=60s || true
174+ echo "Cleaning up Karpenter CRDs and webhooks..."
171175
172- # Delete Karpenter webhooks
176+ # Delete Karpenter webhooks first (this is critical)
173177 echo "Deleting Karpenter webhooks..."
174- kubectl delete validatingwebhookconfiguration defaulting.webhook.karpenter.sh --ignore-not-found || true
175178 kubectl delete validatingwebhookconfiguration validation.webhook.karpenter.sh --ignore-not-found || true
179+ kubectl delete validatingwebhookconfiguration defaulting.webhook.karpenter.sh --ignore-not-found || true
176180 kubectl delete mutatingwebhookconfiguration defaulting.webhook.karpenter.sh --ignore-not-found || true
177181
182+ # Delete LEGACY Karpenter CRDs (what you're actually using)
183+ echo "Deleting LEGACY Karpenter CRDs..."
184+ kubectl delete crd provisioners.karpenter.sh --ignore-not-found --timeout=60s || true
185+ kubectl delete crd awsnodetemplates.karpenter.k8s.aws --ignore-not-found --timeout=60s || true
186+
178187 # Remove finalizers from stuck CRDs
179188 echo "Removing finalizers from stuck Karpenter CRDs..."
180189 kubectl patch crd provisioners.karpenter.sh -p '{"metadata":{"finalizers":[]}}' --type=merge || true
181190 kubectl patch crd awsnodetemplates.karpenter.k8s.aws -p '{"metadata":{"finalizers":[]}}' --type=merge || true
182- kubectl patch crd nodepools.karpenter.sh -p '{"metadata":{"finalizers":[]}}' --type=merge || true
183- kubectl patch crd ec2nodeclasses.karpenter.k8s.aws -p '{"metadata":{"finalizers":[]}}' --type=merge || true
184- echo "✅ Karpenter CRDs and webhooks cleanup completed"
191+
192+ echo "Karpenter CRDs and webhooks cleanup completed"
185193 continue-on-error : true
186-
187194 # ==================================================
188195 # PHASE 4: UNINSTALL HELM RELEASES
189196 # ==================================================
0 commit comments