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


当前回答

最简单的方法就是复制这个bash脚本

#!/bin/bash

###############################################################################
# Copyright (c) 2018 Red Hat Inc
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0
#
# SPDX-License-Identifier: EPL-2.0
###############################################################################

set -eo pipefail

die() { echo "$*" 1>&2 ; exit 1; }

need() {
    which "$1" &>/dev/null || die "Binary '$1' is missing but required"
}

# checking pre-reqs

need "jq"
need "curl"
need "kubectl"

PROJECT="$1"
shift

test -n "$PROJECT" || die "Missing arguments: kill-ns <namespace>"

kubectl proxy &>/dev/null &
PROXY_PID=$!
killproxy () {
    kill $PROXY_PID
}
trap killproxy EXIT

sleep 1 # give the proxy a second

kubectl get namespace "$PROJECT" -o json | jq 'del(.spec.finalizers[] | select("kubernetes"))' | curl -s -k -H "Content-Type: application/json" -X PUT -o /dev/null --data-binary @- http://localhost:8001/api/v1/namespaces/$PROJECT/finalize && echo "Killed namespace: $PROJECT"

# proxy will get killed by the trap

在deletenamepsace.sh文件中添加上述代码。

然后通过提供命名空间作为参数执行它(linkerd是我想在这里删除的命名空间)

➜ kubectl get namespaces
linkerd           Terminating   11d

➜ sh deletenamepsace.sh linkerd
Killed namespace: linkerd

➜ kubectl get namespaces

上面的建议对我很有效。

老实说,我认为 删除命名空间mynamespace——grace-period=0——force 根本不值得一试。

特别感谢Jens Reimann!我认为这个脚本应该被合并到kubectl命令中。

其他回答

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

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

Github问题链接

我通常的工作空间是一个小的k8s集群,我经常破坏并重新构建它,这就是为什么删除终结器方法适合我。

原来的答案:我经常遇到同样的问题。

这就是我的工作

kubectl get ns your-namespace -o json > ns-without-finalizers.json

编辑ns-without-finalizers.json。将所有终结器替换为空数组。

运行kubectl代理(通常在另一个终端上运行)

然后curl这个命令

curl -X PUT http://localhost:8001/api/v1/namespaces/your-namespace/finalize -H "Content-Type: application/json" --data @ns-without-finalizers.json

强制删除名称空间或删除终结器绝对不是正确的方法,因为这可能会使资源注册到一个不存在的名称空间。

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

即将发布的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)

调试类似的问题。

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

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

单行命令

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

简单的技巧

你只能在控制台编辑命名空间kubectl编辑<命名空间名称>删除/删除“Kubernetes”从终结器部分(应该像“finalizers”:[])并按enter或保存/应用更改。

你也可以一步完成。

诀窍:1

Kubectl获取命名空间烦扰-命名空间-删除-o json > tmp.json 然后编辑tmp。从终结器中删除“kubernetes 打开另一个终端运行命令kubectl代理,在Curl下面运行

curl -k -H "Content-Type: application/json" -X PUT——data-二进制 @tmp。json https://localhost:8001/api/v1/namespaces/<NAMESPACE NAME TO DELETE>/finalize . json

它应该删除您的名称空间。

循序渐进指南

使用命令启动代理:

kubectl代理

kubectl代理&开始服务 127.0.0.1:8001

找到名称空间

Kubectl得到ns

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

把它归档

kubectl获取命名空间{您的命名空间名称}-o json > tmp.json

编辑tmp文件。Json并删除终结器

"spec" "finalizers" "kubernetes"

编辑之后,它应该是这样的

,“规范”:{“终结者”:[]},

我们现在只需运行curl并更新其中的名称空间值就差不多了

curl -k -H "Content-Type: application/json" -X PUT——data-二进制 @tmp。json http://127.0.0.1:8001/api/v1/namespaces/{Your namespace 名称}/完成

它消失了

**

我发现删除“终止”名称空间的唯一方法是删除“终结器”部分中的条目。我试过——强制删除它和——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