小智 40
正如之前在此线程中提到的,还有另一种方法可以使用 kubectl 未公开的 API 终止命名空间,方法是使用可用的现代版本的 kubectl kubectl replace --raw(不确定来自哪个版本)。这样您就不必生成kubectl proxy进程并避免依赖 curl (在某些环境中,例如 busybox 不可用)。希望这能帮助其他人,我把它留在这里:
kubectl get namespace "stucked-namespace" -o json \
| tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
| kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -
Run Code Online (Sandbox Code Playgroud)
小智 30
需要删除 kubernetes 的终结器。
第1步:
kubectl get namespace <YOUR_NAMESPACE> -o json > <YOUR_NAMESPACE>.json
Run Code Online (Sandbox Code Playgroud)
第2步:
kubectl replace --raw "/api/v1/namespaces/<YOUR_NAMESPACE>/finalize" -f ./<YOUR_NAMESPACE>.json
Run Code Online (Sandbox Code Playgroud)
第 3 步:
kubectl get namespace
Run Code Online (Sandbox Code Playgroud)
可以看到烦人的命名空间消失了。
Har*_*var 28
简单的把戏
您只能在控制台上编辑命名空间,从终结器部分中kubectl edit <namespace name>删除/删除“ Kubernetes ” ,然后按 Enter 或保存/应用更改。
一步也可以做到。
招数:1
kubectl get namespace 烦人的命名空间到删除 -o json > tmp.json
然后编辑tmp.json并删除“kubernetes”
打开另一个终端并运行 kubectl proxy
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://localhost:8001/api/v1/namespaces/<NAMESPACE NAME TO DELETE> /finalize
它应该删除您的命名空间。
招数:2
检查 kubectl 集群信息
1. kubectl cluster-info
Run Code Online (Sandbox Code Playgroud)
Kubernetes master 运行在 https://localhost:6443
KubeDNS 运行在 https://localhost:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
要进一步调试和诊断集群问题,请使用
2. kubectl cluster-info dump
现在使用命令启动代理:
3. kubectl proxy
kubectl 代理 & 开始服务于 127.0.0.1:8001
查找命名空间
4. `kubectl get ns`
Run Code Online (Sandbox Code Playgroud)
{您的命名空间名称} 终止 1d
把它放在文件里
5. kubectl get namespace {Your namespace name} -o json > tmp.json
编辑文件tmp.json并删除终结器
}, "spec": { "finalizers": [ "kubernetes" ] },
编辑后它应该是这样的
}, "spec": { "finalizers": [ ] },
我们快到了,现在只需运行命令
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/{Your namespace name}/finalize
Run Code Online (Sandbox Code Playgroud)
它不见了
**
Jos*_*ush 21
我根据此处的常见答案编写了一个单行 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()"
Run Code Online (Sandbox Code Playgroud)
使用您的名称空间重命名
namespace='<my-namespace>'。例如namespace='trust'
完整脚本: https://gist.github.com/jossef/a563f8651ec52ad03a243dec539b333d
DrG*_*cko 20
这是一个(又一个)解决方案。这用于jq从 json 中删除终结器块,并且不需要:kubectl proxy
namespaceToDelete=blah
kubectl get namespace "$namespaceToDelete" -o json \
| jq 'del(.spec.finalizers)' \
| kubectl replace --raw /api/v1/namespaces/$namespaceToDelete/finalize -f -
Run Code Online (Sandbox Code Playgroud)
nob*_*bar 18
假设您已经尝试过强制删除资源,例如: Pod处于终止状态,而您的智慧尽力尝试恢复名称空间...
您可以强制删除名称空间(也许留下悬挂的资源):
(
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
)
Run Code Online (Sandbox Code Playgroud)
我正在使用该jq实用程序以编程方式删除终结器部分中的元素。您可以手动执行此操作。
kubectl proxy127.0.0.1:8001 默认情况下创建监听器。如果知道群集主服务器的主机名/ IP,则可以使用它。
有趣的是,即使使用kubectl edit相同的更改无效,这种方法似乎仍然有效。
mir*_*aig 17
1.使用curl命令
export NAMESPACE=<specifice-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json
Run Code Online (Sandbox Code Playgroud)
编辑 JSON 文件并从 spec.finalizers 中删除所有值

保存它,然后在单独的选项卡上应用此命令(必须在单独的选项卡中打开)
kubectl proxy
Run Code Online (Sandbox Code Playgroud)
并在同一选项卡上运行此命令:
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tempfile.json http://127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
Run Code Online (Sandbox Code Playgroud)
检查命名空间是否删除了终止命名空间
kubectl get namespaces
Run Code Online (Sandbox Code Playgroud)
2. 使用Kubectl命令
提到的问题:https://aws.amazon.com/premiumsupport/knowledge-center/eks-termied-namespaces/
export NAMESPACE=<specific-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json
Run Code Online (Sandbox Code Playgroud)
kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f ./tempfile.json
Run Code Online (Sandbox Code Playgroud)
kubectl get namespaces
Run Code Online (Sandbox Code Playgroud)
Luk*_*uke 14
强行删除命名空间或移除终结器绝对不是可行的方法,因为它可能会将资源注册到不存在的命名空间。
这通常很好,但总有一天你将无法创建资源,因为它仍然悬在某个地方。
即将发布的 Kubernetes 1.16 版应该会更深入地了解命名空间终结器,目前我将依赖识别策略。一个尝试自动化这些很酷的脚本是:https : //github.com/thyarles/knsk
但是,它适用于所有命名空间,并且可能很危险。它基于的解决方案是:https : //github.com/kubernetes/kubernetes/issues/60807#issuecomment-524772920
tl;博士
kubectl get apiservice|grep Falsekubectl 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)
Chr*_*ala 12
就我而言,问题是由自定义指标引起的。
要了解导致问题的原因,只需运行以下命令:
kubectl api-resources | grep -i false
Run Code Online (Sandbox Code Playgroud)
这应该可以告诉您哪些 api 资源导致了问题。一旦识别,只需将其删除:
kubectl delete apiservice v1beta1.custom.metrics.k8s.io
Run Code Online (Sandbox Code Playgroud)
一旦删除,命名空间就会消失。
dbu*_*osp 12
我喜欢从这里提取的这个答案 它只是 2 个命令。
在一个终端中:
kubectl proxy
Run Code Online (Sandbox Code Playgroud)
在另一个终端:
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 @-
Run Code Online (Sandbox Code Playgroud)
Moh*_*hsh 10
第 1 步:在一个终端中运行以下命令:
kubectl 代理
第 2 步:打开另一个终端,然后将描述符作为 JSON 转储到文件中
kubectl get namespace YOURNAMESPACE -o json > logging.json
使用文本编辑器打开文件:
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2019-05-14T13:55:20Z",
"labels": {
"name": "logging"
},
"name": "logging",
"resourceVersion": "29571918",
"selfLink": "/api/v1/namespaces/logging",
"uid": "e9516a8b-764f-11e9-9621-0a9c41ba9af6"
},
"spec": {
"finalizers": [
**"kubernetes"**
]
},
"status": {
"phase": "Terminating"
}
}
Run Code Online (Sandbox Code Playgroud)
删除终结器数组的内容并将其留空,如下例所示:
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2019-05-14T13:55:20Z",
"labels": {
"name": "logging"
},
"name": "logging",
"resourceVersion": "29571918",
"selfLink": "/api/v1/namespaces/logging",
"uid": "e9516a8b-764f-11e9-9621-0a9c41ba9af6"
},
"spec": {
"finalizers": [
]
},
"status": {
"phase": "Terminating"
}
}
Run Code Online (Sandbox Code Playgroud)
第 3 步:执行清理命令以摆脱烦人的命名空间:
curl -k -H "Content-Type: application/json" -X PUT --data-binary @logging.json http://127.0.0.1:8001/api/v1/namespaces/YOURNAMESPACE/finalize
Run Code Online (Sandbox Code Playgroud)
享受
对我们来说,那是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
我尝试了 3-5 个选项来删除 ns,但只有这个对我有用。
此 sh 文件将删除所有处于终止状态的命名空间
$ 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
Run Code Online (Sandbox Code Playgroud)
这是由于名称空间控制器无法删除的名称空间中仍存在的资源引起的。
此命令(带有kubectl 1.11+)将向您显示名称空间中剩余哪些资源:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>
Run Code Online (Sandbox Code Playgroud)
找到并解决并删除它们后,名称空间将被清理
小智 8
跑 kubectl get apiservice
对于上述命令,您将找到一个带有可用标志 = Flase 的 apiservice。
因此,只需使用删除该 apiservice kubectl delete apiservice <apiservice name>
这样做后,具有终止状态的命名空间将消失。
小智 8
请尝试使用以下命令:
kubectl patch ns <your_namespace> -p '{"metadata":{"finalizers":null}}'
Run Code Online (Sandbox Code Playgroud)
我编写了简单的脚本来根据 @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
Run Code Online (Sandbox Code Playgroud)
该脚本可以检测所有处于Terminating状态的命名空间,并删除它。
PS:
这在 MacOS 中可能不起作用,因为sedmacos 中的本机与 GNU 不兼容sed。
您可能需要在 MacOS 中安装 GNU sed,请参阅此答案。
请确认您可以通过命令访问您的 kubernetes 集群kubectl。
已经在 kubernetes 版本上测试过 v1.15.3
将ambassador替换为你的命名空间
检查命名空间是否卡住
kubectl get ns ambassador
NAME STATUS AGE
ambassador Terminating 110d
Run Code Online (Sandbox Code Playgroud)
这个卡了很久了
打开管理终端/cmd 提示符或 powershell 并运行
kubectl 代理
这将启动本地 Web 服务器:Starting to serve on 127.0.0.1:8001
打开另一个终端并运行
kubectl get ns ambassador -o json >tmp.json
Run Code Online (Sandbox Code Playgroud)
使用 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"
}
Run Code Online (Sandbox Code Playgroud)
}
到
{
"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": []
}
}
Run Code Online (Sandbox Code Playgroud)
通过删除终结器中的状态和 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
Run Code Online (Sandbox Code Playgroud)
你会看到另一个像之前一样的 json 然后运行
然后运行命令
kubectl get ns ambassador
Error from server (NotFound): namespaces "ambassador" not found
Run Code Online (Sandbox Code Playgroud)
如果它仍然显示终止或任何其他错误,请确保以正确的方式格式化 json,然后重试这些步骤。
您可以运行几项操作。但这通常意味着命名空间的自动删除无法完成,并且有一个正在运行的进程必须手动删除。要找到它,您可以执行以下操作:
将所有程序附加到名称空间。如果这没有产生任何结果,请继续执行下一个建议
$ kubectl get all -n your-namespace
Run Code Online (Sandbox Code Playgroud)
有些命名空间附加了 API 服务,删除起来可能很麻烦。就此而言,这可以是您想要的任何资源。如果发现任何内容,则删除该资源
$ kubectl get apiservice|grep False
Run Code Online (Sandbox Code Playgroud)
但主要的结论是,可能有些东西没有完全删除。因此,您可以查看该命名空间中最初的内容,然后查看 YAML 启动了哪些内容以查看进程。或者你可以开始谷歌为什么服务X不能被正确删除,你会发现一些东西。
编辑:不建议删除终结器。正确的做法是:
我通常的工作空间是一个小型 k8s 集群,我经常销毁它并重建它,这就是为什么删除终结器方法对我有用。
原始答案:我通常会遇到同样的问题。
这就是我所做的
kubectl get ns your-namespace -o json > ns-without-finalizers.json
Run Code Online (Sandbox Code Playgroud)
编辑 ns-without-finalizers.json。将所有终结器替换为空数组。
运行 kubectl proxy (通常在另一个终端上运行)
然后卷曲这个命令
curl -X PUT http://localhost:8001/api/v1/namespaces/your-namespace/finalize -H "Content-Type: application/json" --data @ns-without-finalizers.json
Run Code Online (Sandbox Code Playgroud)
我发现删除“ terminating”命名空间的唯一方法是删除“终结器”部分内的条目。我尝试--force删除它,但--grace-period=0没有一个起作用,但是,此方法确实有效:
在命令行上显示命名空间中的信息:
$ kubectl get namespace your-rogue-namespace -o yaml
Run Code Online (Sandbox Code Playgroud)
这将为您提供 yaml 输出,查找类似于以下内容的行:
deletionTimestamp: 2018-09-17T13:00:10Z
finalizers:
- Whatever content it might be here...
labels:
Run Code Online (Sandbox Code Playgroud)
然后只需编辑命名空间配置并删除终结器容器内的项目即可。
$ kubectl edit namespace your-rogue-namespace
Run Code Online (Sandbox Code Playgroud)
这将打开一个编辑器(在我的例子中为 VI),浏览我想要删除的行并删除它,我按 D 键两次删除整行。
保存它,退出编辑器,就像变魔术一样。流氓命名空间应该消失。
并确认一下:
$ kubectl get namespace your-rogue-namespace -o yaml
Run Code Online (Sandbox Code Playgroud)
小智 5
运行以下命令查看卡在 Terminating 状态的命名空间:
kubectl 获取命名空间
选择一个终止命名空间并查看命名空间的内容以找出终结器。运行以下命令:
kubectl 获取命名空间 -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
Run Code Online (Sandbox Code Playgroud)
运行以下命令以创建临时 JSON 文件:
kubectl get namespace -o json >tmp.json
编辑您的 tmp.json 文件。从 finalizers 字段中删除 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"
}
}
Run Code Online (Sandbox Code Playgroud)
要设置临时代理 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
Run Code Online (Sandbox Code Playgroud)
你的输出会是这样的:
{
"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"
}
}
Run Code Online (Sandbox Code Playgroud)
终结器参数被删除。现在验证终止命名空间已删除,运行以下命令:
kubectl 获取命名空间
如果命名空间陷入终止状态,而该命名空间中的资源已被删除,您可以finalizers在删除命名空间之前修补该命名空间:
kubectl patch ns ns_to_be_deleted -p '{"metadata":{"finalizers":null}}';
Run Code Online (Sandbox Code Playgroud)
然后
kubectl delete ns ns_to_be_deleted;
Run Code Online (Sandbox Code Playgroud)
编辑:
请先查看@Antonio Gomez Alvarado 的回答。根本原因可能是metrics server该答案中提到的。
| 归档时间: |
|
| 查看次数: |
15791 次 |
| 最近记录: |