我有一个“卡住”的名称空间,我删除显示在这个永恒的“终止”状态。
当前回答
我有类似的问题与metric -server,执行kubectl获得namespace < namespace - here > -o json后,我发现这条消息:
"某些组的发现失败,1失败:无法检索 服务器api的完整列表:Io /v1beta1:错误 服务器("内部服务器错误: \ " / api / metrics.k8s.io / v1beta1吗?timeout=32s\":未经授权")已经生效 阻止请求成功
我在这个集群上安装了旧版本的metrics-server。我只是删除了这些资源。因为它是安装在:
kubectl apply -f metrics-server-0.3.7/deploy/1.8+/ --dry-run -o yaml | kubectl apply -f -
这个命令删除了所有这些:
kubectl apply -f metrics-server-0.3.7/deploy/1.8+/ --dry-run -o yaml | kubectl delete -f -
最后,该名称空间在几秒钟后消失。
我假设,如果你有一个最新的版本,你可以删除:
1. YAML安装(此处):
kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/download/<VERSION-HERE>/components.yaml
2. 舵图安装(此处)
helm uninstall metrics-server
不要忘记用正确的版本重新安装它。
其他回答
正如之前在这个线程中提到的,还有另一种方法可以使用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 -
假设你已经尝试过强制删除资源,比如: 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编辑器进行相同的更改也没有效果,这种方法似乎仍然有效。
我写了一个简单的脚本,删除您卡住的名称空间基于@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
该脚本可以检测到所有处于终止状态的命名空间,并将其删除。
PS:
这可能在MacOS中不起作用,因为MacOS中的本机sed与GNU sed不兼容。 你可能需要在MacOS中安装GNU sed,请参考这个答案。 请确认您可以通过命令kubectl访问您的kubernetes集群。 已在kubernetes v1.15.3版本上测试
更新
我找到了一个更简单的解决办法:
kubectl patch RESOURCE NAME -p '{"metadata":{"finalizers":[]}}' --type=merge
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中删除所有值
保存它,然后在单独的选项卡上应用此命令 (必须在单独的标签打开)
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/
以如下格式保存JSON文件:
export NAMESPACE=<specifice-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json
编辑JSON文件并从spec.finalizers中删除所有值 要应用更改,运行如下命令:
kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f ./tempfile.json
验证终止命名空间已被删除:
kubectl get namespaces
这是由于名称空间控制器无法删除名称空间中仍然存在的资源。
这个命令(使用kubectl 1.11+)将显示名称空间中保留的资源:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>
一旦找到并解析并删除这些名称空间,该名称空间就会被清理
推荐文章
- 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+)中做什么?
- 位于另一个名称空间中的服务