k8s删除namespace提示Terminating

在正常删除一个namespace时使用如下命令:

1
kubectl delete ns demo-namespace --force --grace-period=0

命令执行完成后查看namespace的状态发现demo-namespace一直处于Terminating状态,从官网了解到一种方式:开启代理服务,调用接口进行删除。操作步骤大致如下:

  1. 导出namespace的配置

    1
    kubectl get ns demo-namespace -o json > tmp.json
  2. 清空配置中的finalizers字段下的内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    vim tmp.json

    {
    "apiVersion": "v1",
    "kind": "Namespace",
    "metadata": {
    "creationTimestamp": "2021-04-22T01:24:03Z",
    "managedFields": [
    {
    "apiVersion": "v1",
    "fieldsType": "FieldsV1",
    "fieldsV1": {
    "f:status": {
    "f:phase": {}
    }
    },
    "manager": "kubectl-create",
    "operation": "Update",
    "time": "2021-04-22T01:24:03Z"
    }
    ],
    "name": "demo-namespace",
    "resourceVersion": "43539020",
    "uid": "d31344b1-d6ff-47db-a71a-37ac370285e5"
    },
    "spec": {
    # 清空内容
    "finalizers": []
    },
    "status": {
    "phase": "Active"
    }
    }
  3. 开启代理

    新打开一个命令窗口,执行以下语句,这是一个前台运行命令,保持命令窗口存活:

    1
    kubectl proxy
  4. 调用接口删除namespace

    1
    curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/demo-namespace/finalize
  5. 验证

    1
    kubectl get ns