我有一个“卡住”的名称空间,我删除显示在这个永恒的“终止”状态。
当前回答
解决方案:
使用下面的命令,不做任何更改。这招很管用。
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 -
享受
其他回答
这是由于名称空间控制器无法删除名称空间中仍然存在的资源。
这个命令(使用kubectl 1.11+)将显示名称空间中保留的资源:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>
一旦找到并解析并删除这些名称空间,该名称空间就会被清理
最简单的方法就是复制这个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命令中。
假设你已经尝试过强制删除资源,比如: 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编辑器进行相同的更改也没有效果,这种方法似乎仍然有效。
我有类似的问题与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
不要忘记用正确的版本重新安装它。
类似的事情发生在我身上,在我的情况下,它是pv & pvc,我通过将终结器设置为null强行删除。看看你是否可以用ns做类似的事情
kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}'
对于名称空间来说是这样
kubectl patch ns <ns-name> -p '{"spec":{"finalizers":null}}'
推荐文章
- Kubernetes支持多个环境(Staging、QA、生产等)
- CSS中*和*|*的区别是什么?
- Kubernetes API -获取特定节点上的pod
- 我如何调试“ImagePullBackOff”?
- Django:“projects”vs“apps”
- 在Kubernetes中更新configmap时重新启动pod ?
- 输入对象的datetime。Datetime没有Datetime属性
- 为部署的Kubernetes服务获取YAML ?
- 如何在kubernetes中切换命名空间
- \(反斜杠)在PHP(5.3+)中做什么?
- 位于另一个名称空间中的服务
- 命名空间“卡住”作为终止,我如何删除它
- Kubernetes如何使部署更新映像
- 如何在c++中正确使用名称空间?
- 如何在gcloud和minikube之间切换kubectl集群