我有一个“卡住”的名称空间,我删除显示在这个永恒的“终止”状态。
当前回答
调试类似的问题。
有两件重要的事情需要考虑:
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获取命名空间 选择一个终止名称空间并查看该名称空间的内容以找出终止器。执行如下命令: Kubectl获取命名空间-o yaml 您的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
运行如下命令创建一个临时JSON文件: 获取命名空间-o json >tmp.json 编辑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"
}
}
使用实例设置临时代理IP和端口。请确保您的终端窗口一直打开,直到您删除卡住的命名空间: kubectl代理 您的代理IP和端口可能类似于以下输出: 开始在127.0.0.1:8001上播放 在一个新的终端窗口中,使用临时代理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
你的输出是这样的:
{
"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"
}
}
终结器形参被移除。现在,验证终止的命名空间已被删除,运行以下命令: Kubectl获取命名空间
完成nobar已经很棒的回答。如果您使用Rancher部署集群,则需要注意。
牧场主部署改变每一个api调用,prepending /k8s/clusters/c-XXXXX/到url。
rancher上集群的id (c-XXXXX)可以很容易地从rancher UI中获得,因为它将出现在URL中。
所以在你得到集群id c-xxxx之后,就按照nobar说的去做,只是改变api调用,包括rancher位。
(
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/k8s/clusters/c-XXXXX/api/v1/namespaces/$NAMESPACE/finalize
)
我有类似的问题与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 edit namespace ${stucked_namespace}
然后在vi模式下删除终结器并保存。
这对我来说是有效的。
在我的案例中,问题是由自定义指标引起的。
要了解导致问题的原因,只需运行以下命令:
kubectl api-resources | grep -i false
这将告诉您是哪些api资源导致了问题。一旦识别出来,就删除它:
kubectl delete apiservice v1beta1.custom.metrics.k8s.io
一旦删除,命名空间就会消失。
推荐文章
- 命名空间“卡住”作为终止,我如何删除它
- Kubernetes如何使部署更新映像
- 如何在c++中正确使用名称空间?
- 如何在gcloud和minikube之间切换kubectl集群
- 如何让容器在Kubernetes上运行?
- 如何手动触发Kubernetes计划作业?
- 如何从Kubernetes复制控制器的所有pod中获取日志?
- 删除Kubernetes pod时重新创建
- 如何正确重载ostream的<<操作符?
- 使用/healthz进行应用程序运行状况检查的约定来自哪里?
- 什么是名称空间?
- Kubernetes Service定义中targetPort和port的区别
- Kubernetes服务外部ip挂起
- 我如何强迫Kubernetes重新拉一张图片?
- 通过反射获取命名空间中的所有类型