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


当前回答

对我们来说,是参数服务器崩溃。

因此,要检查这是否与您的情况相关,请运行以下命令:kubectl api-resources

如果你得到

错误:无法检索服务器api的完整列表:metrics.k8s。Io /v1beta1:服务器当前无法处理请求

那可能是同一个问题

感谢@javierprovecho

其他回答

这里有一个(又一个)解决方案。它使用jq从json中移除finalisers块,并且不需要kubectl代理:

namespaceToDelete=blah

kubectl get namespace "$namespaceToDelete" -o json \
  | jq 'del(.spec.finalizers)' \
  | kubectl replace --raw /api/v1/namespaces/$namespaceToDelete/finalize -f -

我写了一个简单的脚本,删除您卡住的名称空间基于@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

1. 使用Curl命令

问题提及:https://amalgjose.com/2021/07/28/how-to-manually-delete-a-kubernetes-namespace-stuck-in-terminating-state/

export NAMESPACE=<specifice-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json

编辑JSON文件并从spec.finalizers中删除所有值

保存它,然后在单独的选项卡上应用此命令 (必须在单独的标签打开)

kubectl proxy

并在同一选项卡上运行此命令:

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tempfile.json http://127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize

检查命名空间是否删除了终止命名空间

kubectl get namespaces

2. 使用Kubectl命令

提到的问题:https://aws.amazon.com/premiumsupport/knowledge-center/eks- terminated-namespaces/

以如下格式保存JSON文件:

export NAMESPACE=<specifice-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json

编辑JSON文件并从spec.finalizers中删除所有值 要应用更改,运行如下命令:

kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f ./tempfile.json

验证终止命名空间已被删除:

kubectl get namespaces

手动编辑nsyaml对我来说不起作用,编辑时没有抛出错误,但更改没有生效。

这招对我很管用:

在一次会议中:

kubectl proxy

在另一个外壳中:

kubectl get ns <rouge-ns> -o json | jq '.spec.finalizers=[]' | curl -X PUT http://localhost:8001/api/v1/namespaces/<rouge-ns>/finalize -H "Content-Type: application/json" --data @-

来源:https://virtual-simon.co.uk/vsphere-kubernetes-force-deleting-stuck-terminating-namespaces-and-contexts/

调试类似的问题。

有两件重要的事情需要考虑:

1)在从命名空间中删除终结器之前要三思,因为可能有一些资源您不想自动删除,或者至少要了解为了排除故障而删除了哪些资源。

2)像kubectl api-resources——verbs=list这样的命令可能不会提供由外部crds创建的资源。


在我的例子中:

我用kubectl编辑ns <ns-name>,在状态->条件下,我看到我安装的一些外部crds未能被删除,因为它们添加了定义的终结器:

 - lastTransitionTime: "2021-06-14T11:14:47Z"
    message: 'Some content in the namespace has finalizers remaining: finalizer.stackinstall.crossplane.io
      in 1 resource instances, finalizer.stacks.crossplane.io in 1 resource instances'
    reason: SomeFinalizersRemain
    status: "True"
    type: NamespaceFinalizersRemaining