命名空间“卡住”为终止,我是如何删除它的

Namespace "stuck" as Terminating, How I removed it

提问人:ximbal 提问时间:9/17/2018 最后编辑:DrGeckoximbal 更新时间:9/20/2023 访问量:347452

问:

我有一个“卡住”的命名空间,我删除了它,以这种永恒的“终止”状态显示。

Kubernetes 命名空间

评论

0赞 Rico 9/18/2018
您的命名空间是否为空?

答:

4赞 ximbal 9/17/2018 #1

我发现删除 “” 命名空间的唯一方法是删除“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

评论

3赞 Jordan Liggitt 9/18/2018
这会缩短与命名空间关联的资源的清理,并留下与该命名空间关联的孤立资源
0赞 Paweł Prażak 2/4/2019
可能是崩溃/缺少指标 API 服务器或服务目录 API 服务器,请参阅 JordanLiggitt 和 AntonioGomezAlvarado 的答案
157赞 Jordan Liggitt 9/18/2018 #2

这是由于命名空间控制器无法删除的命名空间中仍存在的资源导致的。

此命令(使用 kubectl 1.11+)将显示命名空间中保留哪些资源:

kubectl api-resources --verbs=list --namespaced -o name \
  | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>

找到这些并解析并删除它们后,命名空间将被清理

评论

7赞 Ben Moss 1/20/2021
这显示我的集群上没有资源,我认为这并不总是解决方案。
6赞 pst 2/24/2021
但绝对最好先尝试一下。始终强制删除命名空间不是好建议。
7赞 Venryx 12/5/2021
Windows Powershell 等效项:Foreach($x in (kubectl api-resources --verbs=list --namespaced -o name)){ kubectl get --show-kind --ignore-not-found -n YOUR_NAMESPACE_HERE $x }
2赞 8675309 6/1/2022
这对我有用。我有一个与该命名空间关联的悬空 CRD。
4赞 Evan Carroll 1/18/2023
我收到错误:unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
282赞 Brent Bradburn 12/7/2018 #3

假设您已经尝试强制删除资源,例如: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

评论

1赞 ‌‌R‌‌‌. 6/11/2019
如果您将解决方案移到顶部会更好,因为它更容易并且执行相同的操作,适用于所有对象。kubectl edit
11赞 Antonio Gomez Alvarado 6/23/2019
这很糟糕,因为它会在集群中留下剩菜。它更像是欺骗自己,而不是真正解决问题。命名空间无法删除是有原因的,您最好解决这个问题,而不是寻求修饰解决方案。
5赞 Brent Bradburn 7/9/2019
@AntonioGomezAlvarado:对。这通常不会是您尝试的第一件事。但是,不幸的是,发现潜在的问题并不总是那么容易。在某些情况下,可能需要恢复命名空间,以便您可以继续完成工作,而不仅仅是外观。
1赞 Alex Punnen 8/7/2020
更好的 soln - stackoverflow.com/a/59667608/429476 请选择它作为新集群的答案 -
3赞 dmorlock 1/13/2021
您应该声明,如果您使用 .kubectl proxy
27赞 Antonio Gomez Alvarado 1/30/2019 #4

对我们来说,这是崩溃。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这里

评论

0赞 Paweł Prażak 2/4/2019
对我们来说,这是CRD剩余的服务目录:servicecatalog.k8s.io/v1beta1: the server is currently unable to handle the request
7赞 vonGohren 10/29/2019
你是做什么的?@Pawe łPrażak 删除它?或者我如何找到它?
0赞 Paweł Prażak 10/30/2019
@vonGohren AFAIR 我们删除了它 CR 来解决问题,但我不记得我们是怎么弄清楚的,对不起
0赞 imriss 12/26/2020
您可以部署最新的 (0.4.1) 版本来解决此问题:kubectl apply -f github.com/kubernetes-sigs/metrics-server/releases/download/...metrics-server;
5赞 iomv 4/28/2021
@vonGohren此时,您确实应该删除该资源。正如另一个答案中提到的,运行以找到它;然后我用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
2赞 saulR 8/30/2019 #5

完成 nobar 已经很好的答案。如果你使用 Rancher 部署了集群,则需要注意。

Rancher 部署会更改每个 API 调用,并附加到 URL。/k8s/clusters/c-XXXXX/

rancher () 上集群的 id 是你可以从 Rancher UI 中轻松获取的,因为它会出现在 URL 上。c-XXXXX

获取集群 ID

因此,在获得集群 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
)
58赞 Harsh Manvar 8/30/2019 #6

单行命令

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

查找 AVAILABLEFalse 的那些

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

  1. kubectl get namespace annoying-namespace-to-delete -o json > tmp.json

  2. 然后从终结器中编辑并删除“kubernetestmp.json

  3. 打开另一个终端 Run 命令并在 Curl 下运行kubectl proxy

curl -k -H “内容类型:application/json” -X PUT --data-binary 要删除>/完成@tmp.json https://localhost:8001/api/v1/namespaces/<命名空间名称

它应该删除你的命名空间。

分步指南

使用以下命令启动代理:

  1. kubectl proxy

kubectl 代理 & 开始服务 127.0.0.1:8001

查找命名空间

  1. kubectl get ns

{您的命名空间名称}终止 1d

把它放在文件中

  1. 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

它消失了

**

评论

4赞 Gajus 9/11/2019
不要删除终结器 github.com/kubernetes/kubernetes/issues/...
1赞 Victor Coll 5/17/2023
你就是那个男人。你在“TLDR”部分救了我:)
0赞 Harsh Manvar 5/17/2023
哈哈,很高兴知道..!
6赞 vonGohren 10/31/2019 #7

您可以运行以下几项操作。但这通常意味着,命名空间的自动删除无法完成,并且有一个进程正在运行,必须手动删除。要找到它,您可以执行以下操作:

将所有 prossesse 附加到命名空间。如果这没有导致任何结果,请继续下一个建议

$ kubectl get all -n your-namespace

某些命名空间附加了 apiserivces,删除可能会很麻烦。就此而言,这可以是您想要的任何资源。然后,如果发现任何内容,则删除该资源

$ kubectl get apiservice|grep False

但主要的收获是,可能有些东西没有被完全删除。因此,您可以查看该命名空间中最初包含的内容,然后查看使用 YAML 启动的内容以查看进程。或者你可以开始谷歌为什么服务X不会被正确删除,你会发现一些东西。

147赞 teoincontatto 1/9/2020 #8

如前所述,在此线程中,还有另一种方法可以使用kubectl未公开的API终止命名空间,方法是使用kubectl的现代版本(不确定来自哪个版本)。这样,您就不必生成进程并避免对 curl 的依赖(在某些环境中,如 busybox 不可用)。希望这能帮助其他人,我把这个留在这里:kubectl replace --rawkubectl 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 -

评论

7赞 AATHITH RAJENDRAN 4/5/2020
这个在 kubectl 版本 v1.17、k8 v1.16 中对我有用
0赞 sshow 9/1/2020
伟大。当集群中没有节点时,唯一对我们有用的东西。
0赞 N-ate 12/18/2020
在“tr”上挖掘错误。无法识别术语 tr。
1赞 neoakris 4/15/2021
export NS=istio-system && kubectl get namespace “$NS” -o json \ |tr -d “\n” |sed “s/\”终结者\“: [[^]]\+]/\”终结者\“: []/” \ |kubectl 替换 --raw /api/v1/namespaces/$NS/finalize -f -
0赞 Raz Buchnik 1/30/2022
对我不起作用...
6赞 prince 1/21/2020 #9
  1. 运行以下命令以查看停滞在“正在终止”状态的命名空间:

    kubectl get 命名空间

  2. 选择终止命名空间并查看命名空间的内容以找出终结器。运行以下命令:

    kubectl get 命名空间 -o yaml

  3. 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
  1. 执行以下命令,创建临时JSON文件。

    kubectl get namespace -o json >tmp.json

  2. 编辑您的 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"
        }
    }
  1. 若要设置临时代理 IP 和端口,请运行以下命令。请确保终端窗口保持打开状态,直到删除卡住的命名空间:

    kubectl 代理

  2. 代理 IP 和端口可能类似于以下输出:

    在 127.0.0.1:8001 上开始服务

  3. 在新的终端窗口中,使用临时代理 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"
       }
    }
  1. 删除了终结器参数。现在,验证是否删除了终止命名空间,运行以下命令:

    kubectl get 命名空间

87赞 Mohammad Ravanbakhsh 2/25/2020 #10

溶液:

使用下面的命令,不做任何更改。它就像一个魅力。

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 -

享受

评论

3赞 bazeusz 12/21/2020
不是最好的主意。这很可能会留下一些悬而未决的资源,这些资源导致了最初的终止问题。
2赞 Dentrax 3/17/2022
尝试过这个,命名空间仍然处于“正在终止”状态。
3赞 Mohammad Ravanbakhsh 4/12/2022
@Dentrax 此命令删除列表中的第一个终止命名空间。例如,如果您有 3 个命名空间,则应通过终止状态运行此 commant 3 次。如果不工作,请尝试另一种解决方法。
0赞 Mohammad Ravanbakhsh 10/18/2022
注意:如果您的 kube/config 包含用于用户授权的令牌,则可能会出现错误。您应该通过此命令从 /etc/kubernetes 复制 conf 文件并将其替换为 Config。sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
18赞 Saurav Malani 3/8/2020 #11

kubectl get apiservice

对于上面的命令,您将找到一个带有 Available Flag=Flase 的 apiservice。

因此,只需使用以下命令删除该 apiservice 即可kubectl delete apiservice <apiservice name>

执行此操作后,具有终止状态的命名空间将消失。

评论

1赞 Asu 3/26/2020
就我而言,所有 Available=True,所以这无济于事(至少并非总是如此)
1赞 nicolas-mosch 1/22/2021
使用其他描述的方法获得 404。这解决了我的问题
0赞 wind_surfer 6/9/2020 #12
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 命令。 一旦我解决了这个问题,我就使用脚本卸载集群以去除残留物并重新安装。

评论

0赞 ximbal 6/10/2020
也许您想分解您的 URL 并解释发生了什么?
90赞 Shreyangi Saxena 6/17/2020 #13

需要删除 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

你可以看到烦人的命名空间不见了。

评论

0赞 N-ate 12/18/2020
我缺少这个命名空间 api。有没有办法安装它?
10赞 SiHa 6/18/2021
这也可以通过删除“终结者”列表中的项目来实现。这样做的好处是,它可以用来删除其他卡住的资源,而不知道它们的 api 路径。我用它来去除顽固的 CRD。kubectl edit <stuck_resource>
1赞 Venryx 12/5/2021
您还可以使用基于 UI 的工具,例如 Lens,这使得此任务和许多其他任务/信息非常容易执行/访问。
3赞 Raz Buchnik 1/30/2022
对我不起作用。.
3赞 Mandy Schoep 3/2/2022
如果已安装,以下代码片段可能会帮助您删除卡住的命名空间:jqnamespace=stuck-namespace; kubectl get namespace $namespace -o json | jq '.spec.finalizers= []' | kubectl replace --raw "/api/v1/namespaces/$namespace/finalize" -f -
20赞 alex li 6/19/2020 #14

我编写了简单的脚本来删除您卡住的命名空间,具体取决于 @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 不兼容。sedsed

    您可能需要在 MacOS 中安装 GNU sed,请参阅此答案

  • 请确认您可以通过命令访问您的 kubernetes 集群。kubectl

  • 已在 kubernetes 版本 v1.15.3 上进行了测试


更新

我找到了一个更简单的解决方案:

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

评论

2赞 myuce 4/12/2021
一个非常好、简单和可行的解决方案。干得好,谢谢!
0赞 Luca 2/16/2022
不要删除终结器来强制删除,因为某些资源很可能会保持悬空状态。
12赞 Christian Altamirano Ayala 6/23/2020 #15

就我而言,问题是由自定义指标引起的。

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

kubectl api-resources | grep -i false

这应该为您提供导致问题的 api 资源。一旦确定,只需将其删除:

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

删除后,命名空间应消失。

评论

2赞 Andre Miras 8/2/2021
false在我的情况下是小写的。所以也许:kubectl api-resources | grep -i false
0赞 alex 2/4/2022
好。 工作。kubectl delete APIService v1beta1.metrics.k8s.io
59赞 dbustosp 7/24/2020 #16

我喜欢从这里提取的这个答案:它只是 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 @-

评论

3赞 bobmarksie 5/7/2021
我在这里尝试了一些,这是第一个有效的 - 谢谢!
1赞 Luca 12/5/2021
删除终结器可能会导致以后未注册的挂起资源。
3赞 Promise Preston 5/31/2022
这对我有用。如果您使用的是 Mac,请先使用以下命令安装实用程序jqbrew install jq
2赞 Sanjeev 6/28/2022
谢谢。我在删除终止 NS 时遇到了问题。这帮助我摆脱了我的终止 rook-ceph 命名空间。
4赞 George Cimpoies 8/1/2022
只有一个对我有用。
1赞 Abhi Gadroo 7/25/2020 #17

在我的情况下,类似的事情发生在我身上的是 pv & pvc ,我通过将终结器设置为 null 来强制删除它。检查是否可以对 ns 执行类似操作

kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}'

对于命名空间,它将是

kubectl patch ns <ns-name> -p '{"spec":{"finalizers":null}}'
21赞 Jossef Harush Kadouri 8/13/2020 #18

我根据这里的常见答案编写了一个单行 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'

demo


完整剧本:https://gist.github.com/jossef/a563f8651ec52ad03a243dec539b333d

评论

2赞 Antebios 1/25/2021
这奏效了!我终于能够删除卡住的命名空间!
0赞 insideClaw 7/7/2021
哇,在其他一些方法之后起作用了,包括通过编辑自己删除终结器!谢谢!
0赞 sandesh 8/20/2021
这奏效了!我终于能够删除卡住的命名空间!
0赞 Abdusoli 1/29/2022
这是更容易的答案!
0赞 Eduardo B. 1/31/2022
这也对我有用!
18赞 Luca 9/22/2020 #19

强制删除命名空间或删除终结器绝对不是要走的路,因为它可能会将资源注册到不存在的命名空间。

这通常很好,但有一天您将无法创建资源,因为它仍然在某个地方晃来晃去。

即将到来的 Kubernetes 版本 1.16 应该会提供更多关于命名空间终结器的见解,现在我将依赖识别策略。 一个很酷的脚本试图自动化这些是:https://github.com/thyarles/knsk

但是,它适用于所有命名空间,并且可能很危险。它所基于的解决方案是:https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-524772920

TL的;博士

  1. 检查是否有任何 apiservice 不可用,因此不提供其资源:kubectl get apiservice|grep False
  2. 查找仍然存在的所有资源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)

评论

2赞 bazeusz 12/21/2020
同意,绝对不是要走的路。卡住的删除通常是由于某些资源未被正确删除,从而阻止了命名空间终止。检查并删除这些内容,命名空间最终将被删除。值得一提的是,卡在“终止”中的命名空间将阻止另一个命名空间删除。至少这是发生在我身上的事情,看起来删除在 GKE 中是连续的。
5赞 imriss 11/20/2020 #20

如果命名空间停滞在“终止”状态,而该命名空间中的资源已被删除,则可以在删除命名空间之前修补该命名空间:finalizers

kubectl patch ns ns_to_be_deleted -p '{"metadata":{"finalizers":null}}';

然后

kubectl delete ns ns_to_be_deleted;

编辑:

请先检查@Antonio Gomez Alvarado 的答案。根本原因可能是该答案中提到的原因。metrics server

0赞 AnonymousX 1/21/2021 #21
kubectl edit namespace ${stucked_namespace}

然后在 vi 模式下删除并保存。finalizers

它对我的情况有效。

12赞 Ela_murugan 2/9/2021 #22

请尝试使用以下命令:

kubectl patch ns <your_namespace> -p '{"metadata":{"finalizers":null}}'

评论

1赞 sɐunıɔןɐqɐp 2/9/2021
来自评论:在 Stack Overflow 上不鼓励使用仅命令/代码的答案,因为它们没有解释它如何解决问题。请编辑您的答案,以解释此代码的作用以及它如何回答问题,以便它对 OP 以及其他有类似问题的用户有用。请参阅:我如何写出一个好的答案?谢谢
1赞 Michael Chudinov 8/20/2021
只有这个对我有用。没有其他解决方案使用 POST json 来完成 api 工作。
6赞 Kiran 2/10/2021 #23

编辑: 不建议删除终结器。 正确的方法是:

  • 删除命名空间中的所有资源。

Github 问题链接

我通常的工作区是一个小型 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
7赞 Naveen Gopalakrishna 4/28/2021 #24

将 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赞 Rotem jackoby 6/14/2021 #25

调试类似的问题。

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

1 ) 在从命名空间中删除之前请三思而后行,因为您可能不希望自动删除某些资源,或者至少了解已删除的内容以进行故障排除。finalizers

2 ) 诸如此类的命令可能不会为您提供由外部 crd 创建的资源。kubectl api-resources --verbs=list


就我而言:

我查看了我的命名空间真实状态(卡在 上),我看到我安装的一些外部 crd 无法删除,因为它们添加了一个定义的:Terminatingkubectl edit ns <ns-name>status -> conditionsfinalizers

 - 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
9赞 аlex 4/20/2022 #26

我尝试了 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

评论

0赞 Denis Trofimov 4/27/2023
这是删除所有卡住的命名空间 kubernetes 的最佳脚本。节省大量时间!谢谢!
0赞 Denis Trofimov 4/27/2023
trap "kill $proxy_pid" SIGINT SIGTERM ERR EXIT正在工作,您的单引号不:)
3赞 bgsuello 7/25/2022 #27

对于任何为更高版本的 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

评论

0赞 guettli 9/18/2023
这将替换 json 中的所有字符串。对我来说看起来很可怕。"kubernetes"
0赞 Mohammed 7/26/2022 #28

手动编辑 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 @-

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

18赞 DrGecko 7/27/2022 #29

这是一个(另一个)解决方案。这用于从 json 中删除终结器块,并且不需要jqkubectl proxy

namespaceToDelete=blah

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

评论

0赞 Sanjeev 10/24/2022
它适用于 k8 v1.24.6
0赞 Abdennour TOUMI 6/15/2023
它适用于 K8S 1.20.x ..它是唯一有效的
16赞 Jordan 7/28/2022 #30

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 中删除所有值enter image description here

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

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/

  1. 保存类似于以下内容的 JSON 文件:
export NAMESPACE=<specific-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json
  1. 编辑 JSON 文件并从 spec.finalizers 中删除所有值enter image description here
  2. 若要应用更改,请运行类似于以下内容的命令:
kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f ./tempfile.json
  1. 验证是否删除了终止命名空间:
kubectl get namespaces