我有一个“卡住”的名称空间,我删除显示在这个永恒的“终止”状态。
当前回答
我尝试了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
其他回答
我写了一个简单的脚本,删除您卡住的名称空间基于@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 get all -n your-namespace
一些命名空间附加了apiserivces,删除起来很麻烦。这可以是你想要的任何资源。然后,如果发现任何信息,就删除该资源
$ kubectl get apiservice|grep False
但主要的收获是,可能有一些东西没有完全去除。因此,您可以看到最初在该名称空间中有什么,然后可以看到yaml旋转了哪些内容以查看进程。或者你可以开始谷歌为什么不适当删除服务X,你会发现事情。
我发现删除“终止”名称空间的唯一方法是删除“终结器”部分中的条目。我试过——强制删除它和——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
如果你得到
错误:无法检索服务器api的完整列表:metrics.k8s。Io /v1beta1:服务器当前无法处理请求
那可能是同一个问题
感谢@javierprovecho
我尝试了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
推荐文章
- Printf与std::字符串?
- Kubectl连续日志
- 我的kubernetes豆荚不断崩溃与“CrashLoopBackOff”,但我找不到任何日志
- 如何从kubectl配置中删除集群和上下文?
- Kubernetes支持多个环境(Staging、QA、生产等)
- CSS中*和*|*的区别是什么?
- Kubernetes API -获取特定节点上的pod
- 我如何调试“ImagePullBackOff”?
- Django:“projects”vs“apps”
- 在Kubernetes中更新configmap时重新启动pod ?
- 输入对象的datetime。Datetime没有Datetime属性
- 为部署的Kubernetes服务获取YAML ?
- 如何在kubernetes中切换命名空间
- \(反斜杠)在PHP(5.3+)中做什么?
- 位于另一个名称空间中的服务