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 yaml
Your 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.json
Edit your
tmp.json
file. Replace the value of thefinalizers
field withnull
.Your
tmp.json
file 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-path
flag, follow the recommendation. Be sure to keep your terminal window open until you delete the stuck namespace:kubectl proxy
Your 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>/finalize
Your 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
finalizer
parameter is removed. -
Verify that the terminating namespace is removed:
kubectl get namespaces