我有一个“卡住”的名称空间,我删除显示在这个永恒的“终止”状态。
当前回答
这是由于名称空间控制器无法删除名称空间中仍然存在的资源。
这个命令(使用kubectl 1.11+)将显示名称空间中保留的资源:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>
一旦找到并解析并删除这些名称空间,该名称空间就会被清理
其他回答
假设你已经尝试过强制删除资源,比如: 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代理默认在127.0.0.1:8001上创建监听器。如果您知道集群主机的主机名/IP,则可以使用该主机名/IP。 有趣的是,即使使用kubectl编辑器进行相同的更改也没有效果,这种方法似乎仍然有效。
你可以运行一些东西。但这通常意味着,命名空间的自动删除无法完成,并且有一个正在运行的进程必须手动删除。要找到它,你可以做这些事情:
把所有的资料都集中到这个名字空间。如果这没有任何结果,继续下一个建议
$ kubectl get all -n your-namespace
一些命名空间附加了apiserivces,删除起来很麻烦。这可以是你想要的任何资源。然后,如果发现任何信息,就删除该资源
$ kubectl get apiservice|grep False
但主要的收获是,可能有一些东西没有完全去除。因此,您可以看到最初在该名称空间中有什么,然后可以看到yaml旋转了哪些内容以查看进程。或者你可以开始谷歌为什么不适当删除服务X,你会发现事情。
编辑: 不建议删除终结器。 正确的做法是:
删除命名空间下的所有资源。
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
最简单的方法就是复制这个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命令中。
正如之前在这个线程中提到的,还有另一种方法可以使用kubectl没有公开的API来终止名称空间,即使用kubectl的现代版本,其中kubectl replace——raw可用(不确定从哪个版本)。通过这种方式,您将不必生成kubectl代理进程,并避免与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 -
推荐文章
- Printf与std::字符串?
- Kubectl连续日志
- 我的kubernetes豆荚不断崩溃与“CrashLoopBackOff”,但我找不到任何日志
- 如何从kubectl配置中删除集群和上下文?
- Kubernetes支持多个环境(Staging、QA、生产等)
- CSS中*和*|*的区别是什么?
- Kubernetes API -获取特定节点上的pod
- 我如何调试“ImagePullBackOff”?
- Django:“projects”vs“apps”
- 在Kubernetes中更新configmap时重新启动pod ?
- 输入对象的datetime。Datetime没有Datetime属性
- 为部署的Kubernetes服务获取YAML ?
- 如何在kubernetes中切换命名空间
- \(反斜杠)在PHP(5.3+)中做什么?
- 位于另一个名称空间中的服务