Istio从入门到精通—— Kubernetes 删除 istio-system namesapce 时候,出现 Terminating 解决办法
Kubernetes 删除 istio-system namesapce 时候,出现 Terminating 解决办法
当你在 Kubernetes 中遇到无法删除处于 Terminating 状态的命名空间时,可能是由于该命名空间中仍有活跃的资源或服务。要解决这个问题,你可以尝试以下几个步骤:
一、常规方法
-
检查命名空间中的活跃资源:使用以下命令列出命名空间中的所有活跃资源:
12345678910111213141516171819202122232425261、kubectl get all -o custom-columns=KIND:.kind,NAMESPACE:.metadata.namespace,NAME:.metadata.name -n istio-system
2、kubectl api-resources -o name --verbs=list --namespaced |
xargs
-n 1 kubectl get --show-kind --ignore-not-found-n istio-system
[root@k8s-master-node1 zuoyang]
# kubectl get all -o custom-columns=KIND:.kind,NAMESPACE:.metadata.namespace,NAME:.metadata.name -n istio-system
KIND NAMESPACE NAME
Pod istio-system istio-cni-node-msdh5
Pod istio-system istio-cni-node-qjg8l
Pod istio-system istio-cni-node-sdrln
Pod istio-system istio-ingressgateway-fbb79b65b-j6466
Pod istio-system istiod-1-14-6-5785c57bf5-bpdwk
Pod istio-system jaeger-operator-78ff579b48-thd8j
Pod istio-system kiali-operator-6b85fb5856-hrf6l
Service istio-system istio-ingressgateway
Service istio-system istiod-1-14-6
Service istio-system jaeger-operator-metrics
DaemonSet istio-system istio-cni-node
Deployment istio-system istio-ingressgateway
Deployment istio-system istiod-1-14-6
Deployment istio-system jaeger-operator
Deployment istio-system kiali-operator
ReplicaSet istio-system istio-ingressgateway-fbb79b65b
ReplicaSet istio-system istiod-1-14-6-5785c57bf5
ReplicaSet istio-system jaeger-operator-78ff579b48
ReplicaSet istio-system kiali-operator-6b85fb5856
HorizontalPodAutoscaler istio-system istio-ingressgateway
HorizontalPodAutoscaler istio-system istiod-1-14-6
这将显示 istio-system 命名空间中的资源,包括活跃的和已删除的。查找处于 Terminating 状态的命名空间下的资源,并确认它们是否正在被删除。
- 删除命名空间中的服务:如果你发现有活跃的服务在命名空间中,你可以使用以下命令删除它们:
1
kubectl delete service <service-name> -n <namespace>
将
<service-name>
替换为要删除的服务的名称,<namespace>
替换为命名空间的名称。重复此步骤,直到删除所有活跃的服务。 - 等待资源释放:在删除活跃的服务后,Kubernetes 将开始释放相关的资源。你需要等待一段时间,以确保所有资源都被正确释放。
-
尝试再次删除命名空间:一旦所有活跃的资源都被释放,你可以尝试再次删除命名空间。使用以下命令:
1kubectl delete namespace <namespace>
将
<namespace>
替换为要删除的命名空间的名称。执行命令后,等待一段时间,直到命名空间被成功删除。
如果以上步骤仍然无法解决问题,建议通过 Kubernetes 原生 API 删除试试,多次尝试过,均有效。
二、直接通过原生API删除
通过 Kubernetes 原生 API 删除处于 Terminating 状态的命名空间是一种可行的方法。你可以使用 Kubernetes 的 REST API 来执行删除操作。以下是一个示例的步骤:
- 获取 Kubernetes API 的地址和身份验证凭据。你需要具有足够的权限来执行删除操作。
- 使用适当的编程语言或工具,例如 Python 的 requests 库,编写一个脚本或应用程序来调用 Kubernetes API。
- 构建 DELETE 请求,指定要删除的命名空间的名称。请求的 URL 格式如下:https://<Kubernetes-API-address>/api/v1/namespaces/<namespace-name>将 <Kubernetes-API-address> 替换为 Kubernetes API 的地址,<namespace-name> 替换为要删除的命名空间的名称。
- 在请求中设置适当的身份验证凭据,例如使用基本身份验证或令牌认证。
- 发送 DELETE 请求到 Kubernetes API,并等待响应。如果删除成功,你将收到一个 HTTP 200 响应。
请注意,通过原生 API 删除命名空间仍然需要遵循 Kubernetes 的安全和权限要求。确保你具有足够的权限来执行删除操作,并遵循最佳实践来处理敏感凭据和身份验证信息。
三、通过API代理,执行JSON 访问API删除
通过启动一个 API 代理来删除处于 Terminating 状态的命名空间的方法并不是 Kubernetes 原生 API 的标准用法。直接编辑 JSON 文件和通过 API 代理删除命名空间的方法涉及多个步骤,并且需要小心处理。
3.1、使用kubectl get namespace istio-system -o json > tmp.json
获取istio-system
命名空间的 JSON 表示,并将其保存到tmp.json
文件中。
1 2 | [root@k8s-master-node1 zuoyang] # kubectl get namespace istio-system -o json > tmp.json -rw-r--r--. 1 root root 0 Jan 17 20:41 tmp.json |
3.2、使用kubectl proxy --port=8088
启动一个 API 代理服务器。
1 2 | [root@k8s-master-node1 zuoyang] # kubectl proxy --port=8088 Starting to serve on 127.0.0.1:8088 |
3.3、在 tmp.json
文件中删除与 finalizers
相关的部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | { "kind" : "Namespace" , "apiVersion" : "v1" , "metadata" : { "name" : "istio-system" , "uid" : "ecce5153-9888-48f5-aa57-67b020965739" , "resourceVersion" : "3446075" , "creationTimestamp" : "2024-01-16T06:37:03Z" , "deletionTimestamp" : "2024-01-18T01:36:28Z" , "labels" : { "istio-injection" : "disabled" , "kubernetes.io/metadata.name" : "istio-system" , "kubesphere.io/namespace" : "istio-system" , "kubesphere.io/workspace" : "system-workspace" }, "ownerReferences" : [ { "apiVersion" : "tenant.kubesphere.io/v1alpha1" , "kind" : "Workspace" , "name" : "system-workspace" , "uid" : "a620f1f0-8633-4359-beff-c46b97948deb" , "controller" : true , "blockOwnerDeletion" : true } ], "managedFields" : [ { "manager" : "istioctl" , "operation" : "Update" , "apiVersion" : "v1" , "time" : "2024-01-16T06:37:03Z" , "fieldsType" : "FieldsV1" , "fieldsV1" : { "f:metadata" : { "f:labels" : { "." : {}, "f:kubernetes.io/metadata.name" : {} } } } }, { "manager" : "kubectl-label" , "operation" : "Update" , "apiVersion" : "v1" , "time" : "2024-01-17T01:21:40Z" , "fieldsType" : "FieldsV1" , "fieldsV1" : { "f:metadata" : { "f:labels" : { "f:istio-injection" : {}, "f:kubesphere.io/namespace" : {}, "f:kubesphere.io/workspace" : {} } } } }, { "manager" : "controller-manager" , "operation" : "Update" , "apiVersion" : "v1" , "time" : "2024-01-17T01:27:30Z" , "fieldsType" : "FieldsV1" , "fieldsV1" : { "f:metadata" : { "f:ownerReferences" : { "." : {}, "k:{\"uid\":\"a620f1f0-8633-4359-beff-c46b97948deb\"}" : {} } } } }, { "manager" : "kube-controller-manager" , "operation" : "Update" , "apiVersion" : "v1" , "time" : "2024-01-18T01:36:33Z" , "fieldsType" : "FieldsV1" , "fieldsV1" : { "f:status" : { "f:conditions" : { "." : {}, "k:{\"type\":\"NamespaceContentRemaining\"}" : { "." : {}, "f:lastTransitionTime" : {}, "f:message" : {}, "f:reason" : {}, "f:status" : {}, "f:type" : {} }, "k:{\"type\":\"NamespaceDeletionContentFailure\"}" : { "." : {}, "f:lastTransitionTime" : {}, "f:message" : {}, "f:reason" : {}, "f:status" : {}, "f:type" : {} }, "k:{\"type\":\"NamespaceDeletionDiscoveryFailure\"}" : { "." : {}, "f:lastTransitionTime" : {}, "f:message" : {}, "f:reason" : {}, "f:status" : {}, "f:type" : {} }, "k:{\"type\":\"NamespaceDeletionGroupVersionParsingFailure\"}" : { "." : {}, "f:lastTransitionTime" : {}, "f:message" : {}, "f:reason" : {}, "f:status" : {}, "f:type" : {} }, "k:{\"type\":\"NamespaceFinalizersRemaining\"}" : { "." : {}, "f:lastTransitionTime" : {}, "f:message" : {}, "f:reason" : {}, "f:status" : {}, "f:type" : {} } } } }, "subresource" : "status" } ] }, ####井号的部分需要删除掉 ####"spec": { #### "finalizers": [ #### "kubernetes" #### ] ####}, "status" : { "phase" : "Terminating" , "conditions" : [ { "type" : "NamespaceDeletionDiscoveryFailure" , "status" : "False" , "lastTransitionTime" : "2024-01-18T01:36:33Z" , "reason" : "ResourcesDiscovered" , "message" : "All resources successfully discovered" }, { "type" : "NamespaceDeletionGroupVersionParsingFailure" , "status" : "False" , "lastTransitionTime" : "2024-01-18T01:36:33Z" , "reason" : "ParsedGroupVersions" , "message" : "All legacy kube types successfully parsed" }, { "type" : "NamespaceDeletionContentFailure" , "status" : "False" , "lastTransitionTime" : "2024-01-18T01:36:33Z" , "reason" : "ContentDeleted" , "message" : "All content successfully deleted, may be waiting on finalization" }, { "type" : "NamespaceContentRemaining" , "status" : "True" , "lastTransitionTime" : "2024-01-18T01:36:33Z" , "reason" : "SomeResourcesRemain" , "message" : "Some resources are remaining: kialis.kiali.io has 1 resource instances" }, { "type" : "NamespaceFinalizersRemaining" , "status" : "True" , "lastTransitionTime" : "2024-01-18T01:36:33Z" , "reason" : "SomeFinalizersRemain" , "message" : "Some content in the namespace has finalizers remaining: kiali.io/finalizer in 1 resource instances" } ] } } |
3.3、使用curl
命令将修改后的 JSON 数据发送到 API 代理服务器,以执行删除操作,请注意,我给的例子里是 namespace 是 istio-system/finalize,你要根据实际的 namespace 来 。
1 | curl -k -H "Content-Type:application/json" -X PUT --data-binary @tmp.json http: //127 .0.0.1:8088 /api/v1/namespaces/istio-system/finalize |
四、最佳删除 istio-system 的办法
在卸载istio相关组件的时候,最暴力的方法,就是直接把这个ns删除掉,同时删除webhook。如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [root@k8s-master-node1 istio-1.14.6] # kubectl get mutatingwebhookconfigurations NAME WEBHOOKS AGE cert-manager-webhook 1 7d21h istio-sidecar-injector 4 101m ks-events-admission-mutate 1 27h logsidecar-injector-admission-mutate 1 27h mutating-webhook-configuration 1 27h rulegroups.alerting.kubesphere.io 3 27h [root@k8s-master-node1 istio-1.14.6] # kubectl get validatingwebhookconfigurations NAME WEBHOOKS AGE cert-manager-webhook 1 7d21h cluster.kubesphere.io 1 27h istio-validator-istio-system 1 101m ks-events-admission-validate 1 27h network.kubesphere.io 1 27h notification-manager-validating-webhook 4 27h resourcesquotas. quota .kubesphere.io 1 27h rulegroups.alerting.kubesphere.io 3 27h storageclass-accessor.storage.kubesphere.io 1 27h users .iam.kubesphere.io 1 27h validating-webhook-configuration 3 27h [root@k8s-master-node1 istio-1.14.6] # kubectl delete mutatingwebhookconfigurations istio-sidecar-injector mutatingwebhookconfiguration.admissionregistration.k8s.io "istio-sidecar-injector" deleted [root@k8s-master-node1 istio-1.14.6] # kubectl delete validatingwebhookconfigurations istio-validator-istio-system validatingwebhookconfiguration.admissionregistration.k8s.io "istio-validator-istio-system" deleted |
但是在删除 ns 的时候,istio-system 会一直 terminating 中。原因是 kiali 的 cr 没有删除干净,这个是已知的 issue (https://github.com/kiali/kiali/discussions/3989#discussioncomment-709675)。
需要执行:
1 | kubectl patch kiali kiali -n istio-system -p '{"metadata":{"finalizers": []}}' -- type =merge |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性