Istio从入门到精通—— Kubernetes 删除 istio-system namesapce 时候,出现 Terminating 解决办法

Kubernetes 删除 istio-system namesapce 时候,出现 Terminating 解决办法

  当你在 Kubernetes 中遇到无法删除处于 Terminating 状态的命名空间时,可能是由于该命名空间中仍有活跃的资源或服务。要解决这个问题,你可以尝试以下几个步骤:

一、常规方法

  1. 检查命名空间中的活跃资源:使用以下命令列出命名空间中的所有活跃资源:

      
      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 状态的命名空间下的资源,并确认它们是否正在被删除。

  2. 删除命名空间中的服务:如果你发现有活跃的服务在命名空间中,你可以使用以下命令删除它们:
    kubectl delete service <service-name> -n <namespace>
    

    <service-name>替换为要删除的服务的名称,<namespace>替换为命名空间的名称。重复此步骤,直到删除所有活跃的服务。

  3. 等待资源释放:在删除活跃的服务后,Kubernetes 将开始释放相关的资源。你需要等待一段时间,以确保所有资源都被正确释放。
  4. 尝试再次删除命名空间:一旦所有活跃的资源都被释放,你可以尝试再次删除命名空间。使用以下命令:

    kubectl delete namespace <namespace>

    <namespace>替换为要删除的命名空间的名称。执行命令后,等待一段时间,直到命名空间被成功删除。 

  如果以上步骤仍然无法解决问题,建议通过 Kubernetes 原生 API 删除试试,多次尝试过,均有效。

二、直接通过原生API删除

  通过 Kubernetes 原生 API 删除处于 Terminating 状态的命名空间是一种可行的方法。你可以使用 Kubernetes 的 REST API 来执行删除操作。以下是一个示例的步骤:

    1. 获取 Kubernetes API 的地址和身份验证凭据。你需要具有足够的权限来执行删除操作。
    2. 使用适当的编程语言或工具,例如 Python 的 requests 库,编写一个脚本或应用程序来调用 Kubernetes API。
    3. 构建 DELETE 请求,指定要删除的命名空间的名称。请求的 URL 格式如下:https://<Kubernetes-API-address>/api/v1/namespaces/<namespace-name>将 <Kubernetes-API-address> 替换为 Kubernetes API 的地址,<namespace-name> 替换为要删除的命名空间的名称。
    4. 在请求中设置适当的身份验证凭据,例如使用基本身份验证或令牌认证。
    5. 发送 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
posted @ 2024-01-18 10:11  左扬  阅读(151)  评论(0编辑  收藏  举报
levels of contents