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


当前回答

我写了一个简单的脚本,删除您卡住的名称空间基于@Shreyangi Saxena的解决方案。

cat > delete_stuck_ns.sh << "EOF"
#!/usr/bin/env bash

function delete_namespace () {
    echo "Deleting namespace $1"
    kubectl get namespace $1 -o json > tmp.json
    sed -i 's/"kubernetes"//g' tmp.json
    kubectl replace --raw "/api/v1/namespaces/$1/finalize" -f ./tmp.json
    rm ./tmp.json
}

TERMINATING_NS=$(kubectl get ns | awk '$2=="Terminating" {print $1}')

for ns in $TERMINATING_NS
do
    delete_namespace $ns
done
EOF

chmod +x delete_stuck_ns.sh

该脚本可以检测到所有处于终止状态的命名空间,并将其删除。


PS:

这可能在MacOS中不起作用,因为MacOS中的本机sed与GNU sed不兼容。 你可能需要在MacOS中安装GNU sed,请参考这个答案。 请确认您可以通过命令kubectl访问您的kubernetes集群。 已在kubernetes v1.15.3版本上测试


更新

我找到了一个更简单的解决办法:

kubectl patch RESOURCE NAME -p '{"metadata":{"finalizers":[]}}' --type=merge

其他回答

kubectl edit namespace ${stucked_namespace}

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

这对我来说是有效的。

我发现删除“终止”名称空间的唯一方法是删除“终结器”部分中的条目。我试过——强制删除它和——grace-period=0没有一个工作,但是,这个方法做到了:

在命令行中显示命名空间的信息:

$ kubectl get namespace your-rogue-namespace -o yaml

这将给你yaml输出,寻找类似于这样的一行:

deletionTimestamp: 2018-09-17T13:00:10Z
  finalizers:
  - Whatever content it might be here...
  labels:

然后只需编辑名称空间配置并删除终结器容器中的项。

$ kubectl edit namespace your-rogue-namespace

这将打开一个编辑器(在我的例子中是VI),浏览我想删除的行并删除它,我按D键两次删除整行。

保存它,退出编辑器,就像变魔术一样。rogue-namespace应该消失了。

为了证实这一点:

$ kubectl get namespace your-rogue-namespace -o yaml

在我的案例中,问题是由自定义指标引起的。

要了解导致问题的原因,只需运行以下命令:

kubectl api-resources | grep -i false

这将告诉您是哪些api资源导致了问题。一旦识别出来,就删除它:

kubectl delete apiservice v1beta1.custom.metrics.k8s.io

一旦删除,命名空间就会消失。

我尝试了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 patch ns ns_to_be_deleted -p '{"metadata":{"finalizers":null}}';

then

kubectl delete ns ns_to_be_deleted;

编辑:

请先查看@Antonio Gomez Alvarado的回答。根本原因可能是答案中提到的度量服务器。