我有一个“卡住”的名称空间,我删除显示在这个永恒的“终止”状态。


当前回答

完成nobar已经很棒的回答。如果您使用Rancher部署集群,则需要注意。

牧场主部署改变每一个api调用,prepending /k8s/clusters/c-XXXXX/到url。

rancher上集群的id (c-XXXXX)可以很容易地从rancher UI中获得,因为它将出现在URL中。

所以在你得到集群id c-xxxx之后,就按照nobar说的去做,只是改变api调用,包括rancher位。

(
NAMESPACE=your-rogue-namespace
kubectl proxy &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" \
  -X PUT --data-binary @temp.json \
  127.0.0.1:8001/k8s/clusters/c-XXXXX/api/v1/namespaces/$NAMESPACE/finalize
)

其他回答

kubectl edit namespace ${stucked_namespace}

然后在vi模式下删除终结器并保存。

这对我来说是有效的。

我尝试了3-5个选项来删除ns,但只有这一个对我有用。

这个sh文件将删除所有处于终止状态的名称空间

$ 我们 force-delete-namespaces.sh

$chmod +x force-delete-namespaces.sh

美元。/ force-delete-namespaces.sh

#!/usr/bin/env bash

set -e
set -o pipefail

kubectl proxy &
proxy_pid="$!"
trap 'kill "$proxy_pid"' EXIT

for ns in $(kubectl get namespace --field-selector=status.phase=Terminating --output=jsonpath="{.items[*].metadata.name}"); do
    echo "Removing finalizers from namespace '$ns'..."
    curl -H "Content-Type: application/json" -X PUT "127.0.0.1:8001/api/v1/namespaces/$ns/finalize" -d @- \
        < <(kubectl get namespace "$ns" --output=json | jq '.spec = { "finalizers": [] }')

    echo
    echo "Force-deleting namespace '$ns'..."
    kubectl delete namespace "$ns" --force --grace-period=0 --ignore-not-found=true
done

你可以运行一些东西。但这通常意味着,命名空间的自动删除无法完成,并且有一个正在运行的进程必须手动删除。要找到它,你可以做这些事情:

把所有的资料都集中到这个名字空间。如果这没有任何结果,继续下一个建议

$ kubectl get all -n your-namespace

一些命名空间附加了apiserivces,删除起来很麻烦。这可以是你想要的任何资源。然后,如果发现任何信息,就删除该资源

$ kubectl get apiservice|grep False

但主要的收获是,可能有一些东西没有完全去除。因此,您可以看到最初在该名称空间中有什么,然后可以看到yaml旋转了哪些内容以查看进程。或者你可以开始谷歌为什么不适当删除服务X,你会发现事情。

编辑: 不建议删除终结器。 正确的做法是:

删除命名空间下的所有资源。

Github问题链接

我通常的工作空间是一个小的k8s集群,我经常破坏并重新构建它,这就是为什么删除终结器方法适合我。

原来的答案:我经常遇到同样的问题。

这就是我的工作

kubectl get ns your-namespace -o json > ns-without-finalizers.json

编辑ns-without-finalizers.json。将所有终结器替换为空数组。

运行kubectl代理(通常在另一个终端上运行)

然后curl这个命令

curl -X PUT http://localhost:8001/api/v1/namespaces/your-namespace/finalize -H "Content-Type: application/json" --data @ns-without-finalizers.json

类似的事情发生在我身上,在我的情况下,它是pv & pvc,我通过将终结器设置为null强行删除。看看你是否可以用ns做类似的事情

kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}'

对于名称空间来说是这样

kubectl patch ns <ns-name> -p '{"spec":{"finalizers":null}}'