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

xim*_*bal 14 namespaces kubernetes

我已经删除了一个“卡住”的名称空间,并以这种永恒的“终止”状态显示。

小智 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)

  • 这个在 kubectl 版本 v1.17、k8 v1.16 中为我工作 (3认同)
  • 这个在 Azure 中为我工作 (2认同)

小智 30

需要删除 kubernetes 的终结器。

第1步:

kubectl get namespace <YOUR_NAMESPACE> -o json > <YOUR_NAMESPACE>.json
Run Code Online (Sandbox Code Playgroud)
  • 从符合规范的终结器数组中删除 kubernetes

第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)

可以看到烦人的命名空间消失了。

  • 这也可以通过“kubectl edit &lt;stuck_resource&gt;”来实现,并删除“finalizers”列表中的项目。这样做的好处是,它可以用来删除其他卡住的资源,而无需知道它们的 api 路径。我用它来删除顽固的 CRD。 (11认同)
  • 如果您安装了“jq”,以下代码片段可能会帮助您删除卡住的命名空间:“namespace=stuck-namespace;” kubectl 获取命名空间 $namespace -o json | jq '.spec.finalizers= []' | jq '.spec.finalizers= []' | kubectl 替换 --raw "/api/v1/namespaces/$namespace/finalize" -f -` (4认同)
  • 对我不起作用.. (3认同)

Har*_*var 28

简单的把戏

您只能在控制台上编辑命名空间,从终结器部分中kubectl edit <namespace name>删除/删除“ Kubernetes ” ,然后按 Enter 或保存/应用更改。

一步也可以做到。

招数:1

  1. kubectl get namespace 烦人的命名空间到删除 -o json > tmp.json

  2. 然后编辑tmp.json并删除“kubernetes”

  3. 打开另一个终端并运行 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)

它不见了

**

  • 不要删除终结器 https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-524772920 (3认同)

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

  • 这有效!我终于能够删除卡住的命名空间了! (2认同)

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相同的更改无效,这种方法似乎仍然有效。

  • 这很不好,因为它将剩余的钱留在了集群中。这实际上是在欺骗自己,而不是真正解决问题。原因是无法删除名称空间,因此最好解决此问题,而不要使用外观上的解决方案。 (3认同)
  • 您应该声明,如果您使用“kubectl proxy”,则可以使用curl绕过API身份验证。 (3认同)
  • @AntonioGomezAlvarado:对。这通常不会是您尝试的第一件事。但不幸的是,发现根本问题并不总是那么容易。在某些情况下,恢复命名空间的需要可能是为了让您能够继续完成工作——而不仅仅是装饰性的。 (2认同)
  • 更好的解决方案 - /sf/answers/4176732591/ 请选择它作为新集群的答案 - (2认同)

mir*_*aig 17

1.使用curl命令

提到的问题:https://amalgjose.com/2021/07/28/how-to-manually-delete-a-kubernetes-namespace-stuck-in-termination-state/

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/

  1. 保存类似于以下内容的 JSON 文件:
export NAMESPACE=<specific-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json
Run Code Online (Sandbox Code Playgroud)
  1. 编辑 JSON 文件并从 spec.finalizers 中删除所有值 在此输入图像描述
  2. 要应用更改,请运行类似于以下内容的命令:
kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f ./tempfile.json
Run Code Online (Sandbox Code Playgroud)
  1. 验证终止命名空间是否已删除:
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;博士

  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

  • 同意,绝对不是要走的路。卡住删除最常见的原因是某些资源未正确删除,从而阻止了命名空间终止。检查并删除它们,命名空间最终将被删除。值得一提的是,陷入“终止”状态的命名空间将阻止另一个命名空间删除。至少这就是发生在我身上的事情,看起来在 GKE 中删除是连续的。 (2认同)

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)

一旦删除,命名空间就会消失。

  • 在我的例子中,“false”是小写的。所以也许:`kubectl api-resources | grep -i 假` (2认同)

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)

  • 只有一个对我有用。 (4认同)
  • 我在这里尝试了一些,这是第一个有效的 - 谢谢! (3认同)
  • 这对我有用。如果您是 Mac,请首先使用命令“brew install jq”安装“jq”实用程序 (3认同)
  • 谢谢。我在删除终止 NS 时遇到问题。这帮助我摆脱了终止的 rook-ceph 命名空间。 (2认同)

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)

享受

  • 这不是最好的主意。这很可能会留下一些悬空资源,从而导致最初的终止问题。 (3认同)
  • @Dentrax 此命令删除列表中的第一个终止命名空间。例如,如果您通过终止状态拥有 3 个命名空间,则应运行此命令 3 次。如果不起作用尝试其他方法来解决。 (3认同)
  • 尝试过此操作,命名空间仍处于“终止”状态。 (2认同)

Ant*_*ado 9

对我们来说,那是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

  • 还有你做什么的?@PawełPrażak 删除它吗?或者我怎样才能找到它? (6认同)
  • @vonGohren 那时你确实应该删除该资源。正如另一个答案中提到的,运行 `kubectl api-resources --verbs=list --namespaced -o name \ | xargs -n 1 kubectl get --show-kind --ignore-not-found -n &lt;namespace&gt;` 来查找它;然后我用“kubectl delete APIService v1beta1.custom.metrics.k8s.io”删除了它 (3认同)

аle*_*kyі 9

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


Jor*_*itt 8

这是由于名称空间控制器无法删除的名称空间中仍存在的资源引起的。

此命令(带有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认同)
  • 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 }` (7认同)
  • 我收到错误:“无法检索服务器 API 的完整列表:metrics.k8s.io/v1beta1:服务器当前无法处理请求” (5认同)
  • 但绝对最好先尝试一下。总是强制删除命名空间并不是一个好建议。 (4认同)
  • 这对我有用。我有一个与该命名空间关联的悬空 CRD。 (2认同)
  • 如果您收到有关“metrics.k8s.io/v1beta1”的错误,这可能意味着您已经删除了具有自定义指标 apiresource(例如监控或 prometheus)的命名空间。这里的其他一些答案解释了如何解决这个问题,其中涉及运行“kubectl delete apiservice/v1beta1.metrics.k8s.io” (2认同)

小智 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)


ale*_* li 7

我编写了简单的脚本来根据 @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

  • 一个非常好的、简单且有效的解决方案。干得好,谢谢! (2认同)

Nav*_*hna 7

将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,然后重试这些步骤。


von*_*ren 6

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

将所有程序附加到名称空间。如果这没有产生任何结果,请继续执行下一个建议

$ 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不能被正确删除,你会发现一些东西。


Kir*_*ran 6

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

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

Github问题链接

我通常的工作空间是一个小型 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)


xim*_*bal 5

我发现删除“ 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)

  • 这会短路与命名空间关联的资源的清理,并留下与该命名空间关联的孤立资源 (3认同)

小智 5

  1. 运行以下命令查看卡在 Terminating 状态的命名空间:

    kubectl 获取命名空间

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

    kubectl 获取命名空间 -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
Run Code Online (Sandbox Code Playgroud)
  1. 运行以下命令以创建临时 JSON 文件:

    kubectl get namespace -o json >tmp.json

  2. 编辑您的 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)
  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
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)
  1. 终结器参数被删除。现在验证终止命名空间已删除,运行以下命令:

    kubectl 获取命名空间


imr*_*iss 5

如果命名空间陷入终止状态,而该命名空间中的资源已被删除,您可以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该答案中提到的。