提问人:ximbal 提问时间:9/17/2018 最后编辑:DrGeckoximbal 更新时间:9/20/2023 访问量:347452
命名空间“卡住”为终止,我是如何删除它的
Namespace "stuck" as Terminating, How I removed it
答:
我发现删除 “” 命名空间的唯一方法是删除“finalizers”部分中的条目。我试图删除它,但没有一个有效,但是,这种方法确实如此:terminating
--force
--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 1.11+)将显示命名空间中保留哪些资源:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>
找到这些并解析并删除它们后,命名空间将被清理
评论
Foreach($x in (kubectl api-resources --verbs=list --namespaced -o name)){ kubectl get --show-kind --ignore-not-found -n YOUR_NAMESPACE_HERE $x }
unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
假设您已经尝试强制删除资源,例如:Pods 卡在终止状态,而您在尝试恢复命名空间时处于智慧的尽头......
您可以强制删除命名空间(可能留下悬空的资源):
(
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/api/v1/namespaces/$NAMESPACE/finalize
)
这是对此处答案的改进,基于此处的评论。
我正在使用该实用程序以编程方式删除终结器部分中的元素。您可以手动执行此操作。
jq
kubectl proxy
默认情况下,在 AT 创建侦听器。如果您知道集群主节点的主机名/IP,则可以改用它。127.0.0.1:8001
有趣的是,即使使用相同的更改没有效果,这种方法似乎也有效。
kubectl edit
评论
kubectl edit
kubectl proxy
对我们来说,这是崩溃。metrics-server
因此,要检查这是否与您的情况相关,请运行以下操作:kubectl api-resources
如果你得到
error: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
那么它可能是同样的问题
积分归@javierprovecho这里
评论
servicecatalog.k8s.io/v1beta1: the server is currently unable to handle the request
metrics-server
;
kubectl api-resources --verbs=list --namespaced -o name \ | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>
kubectl delete APIService v1beta1.custom.metrics.k8s.io
完成 nobar 已经很好的答案。如果你使用 Rancher 部署了集群,则需要注意。
Rancher 部署会更改每个 API 调用,并附加到 URL。/k8s/clusters/c-XXXXX/
rancher () 上集群的 id 是你可以从 Rancher UI 中轻松获取的,因为它会出现在 URL 上。c-XXXXX
因此,在获得集群 ID c-xxxx 后,只需按照 nobar 所说的操作,只需更改包含该 rancher 位的 api 调用即可。
(
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 patch ns <Namespace_to_delete> -p '{"metadata":{"finalizers":null}}'
选项 : 2
如果修补不起作用,请检查错误是否处于状态
kubectl get ns <namespace-name>
某些组的发现失败,1 个失败:无法检索 22 个组 服务器 API 的完整列表: metrics.k8s.io/v1beta1:服务器是 目前有 23 个无法处理请求
您得到错误详细信息或 API 详细信息,但该详细信息对您来说失败了,请列出可用的 apiservice
kubectl get apiservice
查找 AVAILABLE 为 False 的那些
kubectl delete apiservice <apiservice-name>
例
kubectl delete apiservice metrics.k8s.io/v1beta1
并再次运行上面的 patch 命令或等待 while 命名空间将被删除。
阅读更多文章:https://medium.com/@harsh.manvar111/kubernetes-namespace-stuck-on-terminating-state-25d0cda8e3ff
额外 - 简单的技巧
您只能在控制台上编辑命名空间,从终结器部分(应如)中删除/删除“Kubernetes”,然后按回车键或保存/应用更改。kubectl edit <namespace name>
"finalizers": [ ]
一步到位,你也可以做到。
技巧 : 1
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
然后从终结器中编辑并删除“kubernetes”
tmp.json
打开另一个终端 Run 命令并在 Curl 下运行
kubectl proxy
curl -k -H “内容类型:application/json” -X PUT --data-binary
要删除>/完成@tmp.json https://localhost:8001/api/v1/namespaces/<命名空间名称
它应该删除你的命名空间。
分步指南
使用以下命令启动代理:
kubectl proxy
kubectl 代理 & 开始服务 127.0.0.1:8001
查找命名空间
kubectl get ns
{您的命名空间名称}终止 1d
把它放在文件中
kubectl get namespace {Your namespace name} -o json > tmp.json
编辑文件并删除终结器tmp.json
}, “spec”: { “finalizers”: [ “kubernetes” ] },
编辑后,它应该看起来像这样
}, “spec”: { “finalizers”: [ ] },
我们差不多了,现在只需运行带有更新命名空间值的 curl
curl -k -H “内容类型:application/json” -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/{您的命名空间 名称}/finalize
它消失了
**
评论
您可以运行以下几项操作。但这通常意味着,命名空间的自动删除无法完成,并且有一个进程正在运行,必须手动删除。要找到它,您可以执行以下操作:
将所有 prossesse 附加到命名空间。如果这没有导致任何结果,请继续下一个建议
$ kubectl get all -n your-namespace
某些命名空间附加了 apiserivces,删除可能会很麻烦。就此而言,这可以是您想要的任何资源。然后,如果发现任何内容,则删除该资源
$ kubectl get apiservice|grep False
但主要的收获是,可能有些东西没有被完全删除。因此,您可以查看该命名空间中最初包含的内容,然后查看使用 YAML 启动的内容以查看进程。或者你可以开始谷歌为什么服务X不会被正确删除,你会发现一些东西。
如前所述,在此线程中,还有另一种方法可以使用kubectl未公开的API终止命名空间,方法是使用kubectl的现代版本(不确定来自哪个版本)。这样,您就不必生成进程并避免对 curl 的依赖(在某些环境中,如 busybox 不可用)。希望这能帮助其他人,我把这个留在这里:kubectl replace --raw
kubectl proxy
kubectl get namespace "stucked-namespace" -o json \
| tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
| kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -
评论
运行以下命令以查看停滞在“正在终止”状态的命名空间:
kubectl get 命名空间
选择终止命名空间并查看命名空间的内容以找出终结器。运行以下命令:
kubectl get 命名空间 -o yaml
YAML 内容可能类似于以下输出:
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: 2019-12-25T17:38:32Z
deletionTimestamp: 2019-12-25T17:51:34Z
name: <terminating-namespace>
resourceVersion: "4779875"
selfLink: /api/v1/namespaces/<terminating-namespace>
uid: ******-****-****-****-fa1dfgerz5
spec:
finalizers:
- kubernetes
status:
phase: Terminating
执行以下命令,创建临时JSON文件。
kubectl get namespace -o json >tmp.json
编辑您的 tmp.json 文件。从终结器字段中删除 kubernetes 值并保存文件。输出如下所示:
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2018-11-19T18:48:30Z",
"deletionTimestamp": "2018-11-19T18:59:36Z",
"name": "<terminating-namespace>",
"resourceVersion": "1385077",
"selfLink": "/api/v1/namespaces/<terminating-namespace>",
"uid": "b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5"
},
"spec": {
},
"status": {
"phase": "Terminating"
}
}
若要设置临时代理 IP 和端口,请运行以下命令。请确保终端窗口保持打开状态,直到删除卡住的命名空间:
kubectl 代理
代理 IP 和端口可能类似于以下输出:
在 127.0.0.1:8001 上开始服务
在新的终端窗口中,使用临时代理 IP 和端口进行 API 调用:
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/your_terminating_namespace/finalize
您的输出将如下所示:
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "<terminating-namespace>",
"selfLink": "/api/v1/namespaces/<terminating-namespace>/finalize",
"uid": "b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5",
"resourceVersion": "1602981",
"creationTimestamp": "2018-11-19T18:48:30Z",
"deletionTimestamp": "2018-11-19T18:59:36Z"
},
"spec": {
},
"status": {
"phase": "Terminating"
}
}
删除了终结器参数。现在,验证是否删除了终止命名空间,运行以下命令:
kubectl get 命名空间
溶液:
使用下面的命令,不做任何更改。它就像一个魅力。
NS=`kubectl get ns |grep Terminating | awk 'NR==1 {print $1}'` && kubectl get namespace "$NS" -o json | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" | kubectl replace --raw /api/v1/namespaces/$NS/finalize -f -
享受
评论
跑kubectl get apiservice
对于上面的命令,您将找到一个带有 Available Flag=Flase 的 apiservice。
因此,只需使用以下命令删除该 apiservice 即可kubectl delete apiservice <apiservice name>
执行此操作后,具有终止状态的命名空间将消失。
评论
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
这对我有用,命名空间消失了。
详细说明可以在链接 https://github.com/rook/rook/blob/master/Documentation/ceph-teardown.md 中找到。
当我中断 kubernetes 安装(Armory Minnaker)时,就发生了这种情况。然后我继续删除命名空间并重新安装它。由于终结器,我被困在 pod 的终止状态。我将命名空间放入tmp.json,从tmp.json文件中删除终结器并执行 curl 命令。 一旦我解决了这个问题,我就使用脚本卸载集群以去除残留物并重新安装。
评论
需要删除 kubernetes 的终结器。
步骤1:
kubectl get namespace <YOUR_NAMESPACE> -o json > <YOUR_NAMESPACE>.json
- 从符合规范的终结器阵列中删除 Kubernetes
步骤2:
kubectl replace --raw "/api/v1/namespaces/<YOUR_NAMESPACE>/finalize" -f ./<YOUR_NAMESPACE>.json
步骤3:
kubectl get namespace
你可以看到烦人的命名空间不见了。
评论
kubectl edit <stuck_resource>
jq
namespace=stuck-namespace; kubectl get namespace $namespace -o json | jq '.spec.finalizers= []' | kubectl replace --raw "/api/v1/namespaces/$namespace/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
此脚本可以检测处于“正在终止
”状态的所有命名空间,并将其删除。
附言:
这在 MacOS 中可能不起作用,因为 macos 中的本机与 GNU 不兼容。
sed
sed
您可能需要在 MacOS 中安装 GNU sed,请参阅此答案。
请确认您可以通过命令访问您的 kubernetes 集群。
kubectl
已在 kubernetes 版本
v1.15.3
上进行了测试
更新
我找到了一个更简单的解决方案:
kubectl patch RESOURCE NAME -p '{"metadata":{"finalizers":[]}}' --type=merge
评论
就我而言,问题是由自定义指标引起的。
要了解导致问题的原因,只需运行以下命令:
kubectl api-resources | grep -i false
这应该为您提供导致问题的 api 资源。一旦确定,只需将其删除:
kubectl delete apiservice v1beta1.custom.metrics.k8s.io
删除后,命名空间应消失。
评论
false
在我的情况下是小写的。所以也许:kubectl api-resources | grep -i false
kubectl delete APIService v1beta1.metrics.k8s.io
我喜欢从这里提取的这个答案:它只是 2 个命令。
在一个终端中:
kubectl proxy
在另一个终端:
kubectl get ns delete-me -o json | \
jq '.spec.finalizers=[]' | \
curl -X PUT http://localhost:8001/api/v1/namespaces/delete-me/finalize -H "Content-Type: application/json" --data @-
评论
jq
brew install jq
在我的情况下,类似的事情发生在我身上的是 pv & pvc ,我通过将终结器设置为 null 来强制删除它。检查是否可以对 ns 执行类似操作
kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}'
对于命名空间,它将是
kubectl patch ns <ns-name> -p '{"spec":{"finalizers":null}}'
我根据这里的常见答案编写了一个单行 Python3 脚本。此脚本删除有问题的命名空间中的 。finalizers
python3 -c "namespace='<my-namespace>';import atexit,subprocess,json,requests,sys;proxy_process = subprocess.Popen(['kubectl', 'proxy']);atexit.register(proxy_process.kill);p = subprocess.Popen(['kubectl', 'get', 'namespace', namespace, '-o', 'json'], stdout=subprocess.PIPE);p.wait();data = json.load(p.stdout);data['spec']['finalizers'] = [];requests.put('http://127.0.0.1:8001/api/v1/namespaces/{}/finalize'.format(namespace), json=data).raise_for_status()"
💡 使用命名空间重命名。 例如:
namespace='<my-namespace>'
namespace='trust'
完整剧本:https://gist.github.com/jossef/a563f8651ec52ad03a243dec539b333d
评论
强制删除命名空间或删除终结器绝对不是要走的路,因为它可能会将资源注册到不存在的命名空间。
这通常很好,但有一天您将无法创建资源,因为它仍然在某个地方晃来晃去。
即将到来的 Kubernetes 版本 1.16 应该会提供更多关于命名空间终结器的见解,现在我将依赖识别策略。 一个很酷的脚本试图自动化这些是:https://github.com/thyarles/knsk
但是,它适用于所有命名空间,并且可能很危险。它所基于的解决方案是:https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-524772920
TL的;博士
- 检查是否有任何 apiservice 不可用,因此不提供其资源:
kubectl get apiservice|grep False
- 查找仍然存在的所有资源
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
(图片来源:https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-524772920)
评论
如果命名空间停滞在“终止”状态,而该命名空间中的资源已被删除,则可以在删除命名空间之前修补该命名空间:finalizers
kubectl patch ns ns_to_be_deleted -p '{"metadata":{"finalizers":null}}';
然后
kubectl delete ns ns_to_be_deleted;
编辑:
请先检查@Antonio Gomez Alvarado 的答案。根本原因可能是该答案中提到的原因。metrics server
kubectl edit namespace ${stucked_namespace}
然后在 vi 模式下删除并保存。finalizers
它对我的情况有效。
请尝试使用以下命令:
kubectl patch ns <your_namespace> -p '{"metadata":{"finalizers":null}}'
评论
编辑: 不建议删除终结器。 正确的方法是:
- 删除命名空间中的所有资源。
我通常的工作区是一个小型 k8s 集群,我经常销毁它并重建它,这就是为什么删除终结器方法对我有用的原因。
原答案:我经常遇到同样的问题。
这就是我所做的
kubectl get ns your-namespace -o json > ns-without-finalizers.json
编辑ns-without-finalizers.json。将所有终结器替换为空数组。
运行 kubectl proxy(通常在另一个终端上运行)
然后curl这个命令
curl -X PUT http://localhost:8001/api/v1/namespaces/your-namespace/finalize -H "Content-Type: application/json" --data @ns-without-finalizers.json
将 ambassador 替换为命名空间
检查命名空间是否卡住
kubectl get ns ambassador
NAME STATUS AGE
ambassador Terminating 110d
这是很长一段时间以来的卡顿
打开管理终端/cmd 提示符或 powershell 并运行
kubectl 代理
这将启动本地 Web 服务器:Starting to serve on 127.0.0.1:8001
打开另一个终端并运行
kubectl get ns ambassador -o json >tmp.json
使用 VI 或 Nano 编辑tmp.json
从这里
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"ambassador\"}}\n"
},
"creationTimestamp": "2021-01-07T18:23:28Z",
"deletionTimestamp": "2021-04-28T06:43:41Z",
"name": "ambassador",
"resourceVersion": "14572382",
"selfLink": "/api/v1/namespaces/ambassador",
"uid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"conditions": [
{
"lastTransitionTime": "2021-04-28T06:43:46Z",
"message": "Discovery failed for some groups, 3 failing: unable to retrieve the complete list of server APIs: compose.docker.com/v1alpha3: an error on the server (\"Internal Server Error: \\\"/apis/compose.docker.com/v1alpha3?timeout=32s\\\": Post https://0.0.0.1:443/apis/authorization.k8s.io/v1beta1/subjectaccessreviews: write tcp 0.0.0.0:53284-\u0026gt;0.0.0.0:443: write: broken pipe\") has prevented the request from succeeding, compose.docker.com/v1beta1: an error on the server (\"Internal Server Error: \\\"/apis/compose.docker.com/v1beta1?timeout=32s\\\": Post https://10.96.0.1:443/apis/authorization.k8s.io/v1beta1/subjectaccessreviews: write tcp 0.0.0.0:5284-\u0026gt;10.96.0.1:443: write: broken pipe\") has prevented the request from succeeding, compose.docker.com/v1beta2: an error on the server (\"Internal Server Error: \\\"/apis/compose.docker.com/v1beta2?timeout=32s\\\": Post https://0.0.0.0:443/apis/authorization.k8s.io/v1beta1/subjectaccessreviews: write tcp 1.1.1.1:2284-\u0026gt;0.0.0.0:443: write: broken pipe\") has prevented the request from succeeding",
"reason": "DiscoveryFailed",
"status": "True",
"type": "NamespaceDeletionDiscoveryFailure"
},
{
"lastTransitionTime": "2021-04-28T06:43:49Z",
"message": "All legacy kube types successfully parsed",
"reason": "ParsedGroupVersions",
"status": "False",
"type": "NamespaceDeletionGroupVersionParsingFailure"
},
{
"lastTransitionTime": "2021-04-28T06:43:49Z",
"message": "All content successfully deleted",
"reason": "ContentDeleted",
"status": "False",
"type": "NamespaceDeletionContentFailure"
}
],
"phase": "Terminating"
}
}
自
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"ambassador\"}}\n"
},
"creationTimestamp": "2021-01-07T18:23:28Z",
"deletionTimestamp": "2021-04-28T06:43:41Z",
"name": "ambassador",
"resourceVersion": "14572382",
"selfLink": "/api/v1/namespaces/ambassador",
"uid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"spec": {
"finalizers": []
}
}
通过在终结器中删除状态和 kubernetes
现在使用命令并将 ambassador 替换为您的命名空间
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/ambassador/finalize
您将看到另一个 JSON,就像之前一样,然后运行
然后运行命令
kubectl get ns ambassador
Error from server (NotFound): namespaces "ambassador" not found
如果它仍然显示终止或任何其他错误,请确保以正确的方式格式化 json,然后再次尝试这些步骤。
调试类似的问题。
需要考虑的两件重要事情:
1 ) 在从命名空间中删除之前请三思而后行,因为您可能不希望自动删除某些资源,或者至少了解已删除的内容以进行故障排除。finalizers
2 ) 诸如此类的命令可能不会为您提供由外部 crd 创建的资源。kubectl api-resources --verbs=list
就我而言:
我查看了我的命名空间真实状态(卡在 上),我看到我安装的一些外部 crd 无法删除,因为它们添加了一个定义的:Terminating
kubectl edit ns <ns-name>
status -> conditions
finalizers
- 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
我尝试了 3-5 个选项来删除 ns,但只有这个对我有用。
此 sh 文件将删除所有状态为 Terminating 的命名空间
$ vi 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
评论
trap "kill $proxy_pid" SIGINT SIGTERM ERR EXIT
正在工作,您的单引号不:)
对于任何为更高版本的 Kubernetes 寻找少量命令的人来说,这对我有帮助。
NAMESPACE=mynamespace
kubectl get namespace $NAMESPACE -o json | sed 's/"kubernetes"//' | kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f -
经测试Kubernetes v1.24.1
注意:该命令替换了json中的所有字符串,请谨慎使用kubernetes
评论
"kubernetes"
手动编辑 NS yaml 对我不起作用,编辑时没有出现错误,但更改没有生效。
这对我有用:
在一次会话中:
kubectl proxy
在另一个 shell 中:
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 @-
这是一个(另一个)解决方案。这用于从 json 中删除终结器块,并且不需要:jq
kubectl proxy
namespaceToDelete=blah
kubectl get namespace "$namespaceToDelete" -o json \
| jq 'del(.spec.finalizers)' \
| kubectl replace --raw /api/v1/namespaces/$namespaceToDelete/finalize -f -
评论
1.使用 curl 命令
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=<specific-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json
kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f ./tempfile.json
- 验证是否删除了终止命名空间:
kubectl get namespaces
评论