Istio从入门到精通—— Kubernetes 删除 istio-system namesapce 时候,出现 Terminating 解决办法
Kubernetes 删除 istio-system namesapce 时候,出现 Terminating 解决办法
当你在 Kubernetes 中遇到无法删除处于 Terminating 状态的命名空间时,可能是由于该命名空间中仍有活跃的资源或服务。要解决这个问题,你可以尝试以下几个步骤:
一、常规方法
-
检查命名空间中的活跃资源:使用以下命令列出命名空间中的所有活跃资源:
1、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 状态的命名空间下的资源,并确认它们是否正在被删除。
- 删除命名空间中的服务:如果你发现有活跃的服务在命名空间中,你可以使用以下命令删除它们:
kubectl delete service <service-name> -n <namespace>
将
<service-name>
替换为要删除的服务的名称,<namespace>
替换为命名空间的名称。重复此步骤,直到删除所有活跃的服务。 - 等待资源释放:在删除活跃的服务后,Kubernetes 将开始释放相关的资源。你需要等待一段时间,以确保所有资源都被正确释放。
-
尝试再次删除命名空间:一旦所有活跃的资源都被释放,你可以尝试再次删除命名空间。使用以下命令:
kubectl 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
文件中。
[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 代理服务器。
[root@k8s-master-node1 zuoyang]# kubectl proxy --port=8088 Starting to serve on 127.0.0.1:8088
3.3、在 tmp.json
文件中删除与 finalizers
相关的部分。
{ "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 来 。
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。如:
[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)。
需要执行:
kubectl patch kiali kiali -n istio-system -p '{"metadata":{"finalizers": []}}' --type=merge