Sometimes you need to delete a namespace, but the deletion is stuck because of the finalizer. When you depleted all other options and you cannot move forward without deleting the namespace, you can consider removing it forcibly.
Solution
-
Terminating state:
kubectl get namespaces -
Select a terminating namespace and view the contents of the namespace to find out the
finalizer:kubectl get namespace <terminating-namespace> -o yamlYour YAML contents might resemble the following output:
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: 2018-11-19T18:48:30Z
deletionTimestamp: 2018-11-19T18:59:36Z
name: <terminating-namespace>
resourceVersion: "1385077"
selfLink: /api/v1/namespaces/<terminating-namespace>
uid: b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5
spec:
finalizers:
- kubernetes
status:
phase: Terminating
-
Create a temporary JSON file:
kubectl get namespace <terminating-namespace> -o json > tmp.jsonEdit your
tmp.jsonfile. Replace the value of thefinalizersfield withnull.Your
tmp.jsonfile might resemble the following output:{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2018-11-19T18:48:30Z",
"deletionTimestamp": "2018-11-19T18:59:36Z",
"name": "<terminating-namespace>",
"resourceVersion": "1385077",
"selfLink": "/api/v1/namespaces/<terminating-namespace>",
"uid": "b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5"
},
"spec": {
"finalizers": null
},
"status": {
"phase": "Terminating"
}
} -
Set a temporary proxy IP and port. If the command recommends using the
--append-server-pathflag, follow the recommendation. Be sure to keep your terminal window open until you delete the stuck namespace:kubectl proxyYour proxy IP and port might resemble the following output:
Starting to serve on 127.0.0.1:8001 -
From a new terminal window, make an API call with your temporary proxy IP and port:
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalizeYour output might resemble the following content:
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "<terminating-namespace>",
"selfLink": "/api/v1/namespaces/<terminating-namespace>/finalize",
"uid": "b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5",
"resourceVersion": "1602981",
"creationTimestamp": "2018-11-19T18:48:30Z",
"deletionTimestamp": "2018-11-19T18:59:36Z"
},
"spec": {
},
"status": {
"phase": "Terminating"
}
}Note: The
finalizerparameter is removed. -
Verify that the terminating namespace is removed:
kubectl get namespaces