Namespaces may be stuck in a terminating state due to finalizers. Follow these steps to delete them.
- First, you need to retrieve the full definition of the stuck namespace in JSON format.
kubectl get namespace user-d7gnp -o json > user-d7gnp.json
- Edit the JSON to Remove Finalizers.
Before
{
"apiVersion": "v1",
"items": [
{
"apiVersion": "v1",
"kind": "Namespace",
"creationTimestamp": "2024-06-19T04:23:56Z",
"deletionTimestamp": "2025-07-23T13:25:02Z",
"finalizers": [
"controller.cattle.io/namespace-auth"
],
"labels": {
"kubernetes.io/metadata.name": "user-d7gnp"
},
After
{
"apiVersion": "v1",
"items": [
{
"apiVersion": "v1",
"kind": "Namespace",
"creationTimestamp": "2024-06-19T04:23:56Z",
"deletionTimestamp": "2025-07-23T13:25:02Z",
"labels": {
"kubernetes.io/metadata.name": "user-d7gnp"
},
- Apply the Modified JSON via kubectl replace.
kubectl replace --raw "/api/v1/namespaces/user-d7gnp/finalize" -f ./user-d7gnp.json
- Verify Deletion.
k get ns user-d7gnp
A shortcut to do all this.
k delete ns user-d7gnp
kubectl get namespace user-d7gnp -o json > user-d7gnp.json
jq 'del(.metadata.finalizers) | del(.spec.finalizers)' user-d7gnp.json > user-d7gnp.json.tmp && mv user-d7gnp.json.tmp user-d7gnp.json
kubectl replace --raw "/api/v1/namespaces/user-d7gnp/finalize" -f ./user-d7gnp.json
k get ns user-d7gnp
To delete several namespaces.
k delete ns cert-manager grafana
namespaces=(
grafana
abc
)
for ns in "${namespaces[@]}"; do
echo ""
echo "Processing namespace: $ns"
echo ""
kubectl get namespace "$ns" -o json > "${ns}.json"
jq 'del(.metadata.finalizers) | del(.spec.finalizers)' "${ns}.json" > "${ns}.json.tmp" && mv "${ns}.json.tmp" "${ns}.json"
kubectl replace --raw "/api/v1/namespaces/${ns}/finalize" -f "${ns}.json"
kubectl get ns "$ns"
echo ""
echo "---------------------------------------------"
done
Top comments (0)