DEV Community

leroykayanda
leroykayanda

Posted on • Edited on

Deleting Stuck Kubernetes Namespaces

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"
                },
Enter fullscreen mode Exit fullscreen mode

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"
                },
Enter fullscreen mode Exit fullscreen mode
  • 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Top comments (0)