クラウド ネイティブ | kubernetes | 削除できない名前空間の解決策は常に終了状態になります

序文:

kubesphereのデプロイ処理中に、kubernetesクラスターのバージョンとkubesphereのバージョンが一致しないため、ロールバックして再デプロイしたいのですが、使用する名前空間kubesphere-systemの通常の削除方法が無効であることがわかり、終了状態になっています

[root@centos1 ~]# kubectl get ns
NAME                STATUS        AGE
default             Active        12h
kube-flannel        Active        95m
kube-node-lease     Active        12h
kube-public         Active        12h
kube-system         Active        12h
kubesphere-system   Terminating   27m

名前空間が削除されているため、新しいデプロイメントを続行できません。

[root@centos1 ~]# kubectl apply -f kubesphere-installer.yaml 
customresourcedefinition.apiextensions.k8s.io/clusterconfigurations.installer.kubesphere.io created
Warning: Detected changes to resource kubesphere-system which is currently being deleted.
namespace/kubesphere-system unchanged
clusterrole.rbac.authorization.k8s.io/ks-installer configured
clusterrolebinding.rbac.authorization.k8s.io/ks-installer unchanged
Error from server (Forbidden): error when creating "kubesphere-installer.yaml": serviceaccounts "ks-installer" is forbidden: unable to create new content in namespace kubesphere-system because it is being terminated
Error from server (Forbidden): error when creating "kubesphere-installer.yaml": deployments.apps "ks-installer" is forbidden: unable to create new content in namespace kubesphere-system because it is being terminated

 

具体的なパフォーマンスは、削除インターフェイスでハングしていることです。

[root@centos1 ~]# kubectl delete ns kubesphere-system 
namespace "kubesphere-system" deleted
^C
[root@centos1 ~]# kubectl delete ns kubesphere-system 
namespace "kubesphere-system" deleted
^C

以下に、撮影エラーと最終的な解決策について詳しく説明します。

一、

解決策 1

恥ずかしい話ですが、エラーの 90% はサービスの再起動で解決でき、エラーの 99% はサーバーの再起動で解決できるため、比較的日常的なことですが、残念ながら、名前空間の異常な状態がこれに該当します。時間はその1パーセントです

サービスを再起動します。サーバーの再起動については何も言う必要はありません。解決策は無効です。

二、

解決策 2

delete コマンドは必須の削除パラメータを追加します

kubectl delete ns kubesphere-system --force --grace-period=0

実際の効果は期待したほど良くなく、削除はまだ完了していません。

コマンドが密接に (無駄に) 警告を発したことがわかりますが、現在はすぐに削除され、終了状態がすぐに終了するのを待ちませんが、役に立ちません。

[root@centos1 ~]# kubectl delete ns kubesphere-system --force --grace-period=0
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
namespace "kubesphere-system" force deleted

三つ、

解決策 3

実は共通の方法では削除できないことが判明しており、現在はetcd経由で直接削除する方法と、apiserverが提供するAPI経由で削除する方法の2つが存在します。

では、etcdを直接削除するのは危険なので、ここではAPIを使って削除します。

1、

名前空間の最上位ファイルを取得します。形式は json です。

kubectl get ns kubesphere-system -o json > /tmp/kubesphere.json

ファイルの主な内容は次のとおりです。

    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },

「ファイナライズ」フィールドの説明:

Finalizers フィールドは Kubernetes GC ガベージ コレクターに属しており、コントローラーが非同期の削除前コールバックを実装できるようにする削除インターセプト メカニズムです。これは、k8s ソース コードで []string として宣言されている任意のリソース オブジェクトのメタに存在し、スライスの内容は実行されるインターセプターの名前です。
Finalizer を使用したオブジェクトの最初の削除リクエストでは、metadata.deletionTimestamp の値が設定されますが、実際にはオブジェクトは削除されません。この値が設定されると、ファイナライザー リストの値は削除のみ可能になります。
metadata.deletionTimestamp フィールドが設定されている場合、オブジェクトの監視を担当する個々のコントローラーは、オブジェクトの更新リクエストをポーリングすることによって、処理するすべてのファイナライザーを実行します。すべてのファイナライザーが実行されると、リソースは削除されます。
metadata.deletionGracePeriodSeconds の値は、更新のポーリング期間を制御します。
各コントローラーは、リストからファイナライザーを削除する責任があります。
ファイナライザが実行されるたびに、ファイナライザが空になるまでファイナライザから 1 つが削除され、その後、そのホスト リソースは実際には削除されません。

したがって、ファイナライザーフィールドを削除するだけです。変更された部分は次のとおりです。

   "spec": {
    },

2、

json ファイルをルート ディレクトリに配置し、apiserver のプロキシを有効にします。

[root@centos1 ~]# kubectl proxy --port=8001
Starting to serve on 127.0.0.1:8001

3、

シェル ウィンドウを再度開き、API を呼び出して削除を開始します。コマンドは次のとおりです。

curl -k -H "Content-Type: application/json" -X PUT --data-binary @kubesphere.json http://127.0.0.1:8001/api/v1/namespaces/kubesphere-system/finalize

次の出力は、削除が成功したことを示しています。

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "kubesphere-system",
    "uid": "7a1c9fed-dbe3-4d65-9f57-db93f7a358f7",
    "resourceVersion": "18113",
    "creationTimestamp": "2023-06-24T02:27:18Z",
    "deletionTimestamp": "2023-06-24T02:28:29Z",
    "labels": {
      "kubernetes.io/metadata.name": "kubesphere-system"
    },
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"kubesphere-system\"}}\n"
    },
    "managedFields": [
      {
        "manager": "kubectl-client-side-apply",
        "operation": "Update",
        "apiVersion": "v1",
        "time": "2023-06-24T02:27:18Z",
        "fieldsType": "FieldsV1",
        "fieldsV1": {"f:metadata":{"f:annotations":{".":{},"f:kubectl.kubernetes.io/last-applied-configuration":{}},"f:labels":{".":{},"f:kubernetes.io/metadata.name":{}}}}
      },
      {
        "manager": "kube-controller-manager",
        "operation": "Update",
        "apiVersion": "v1",
        "time": "2023-06-24T02:28:35Z",
        "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": {
    
  },
  "status": {
    "phase": "Terminating",
    "conditions": [
      {
        "type": "NamespaceDeletionDiscoveryFailure",
        "status": "True",
        "lastTransitionTime": "2023-06-24T02:28:34Z",
        "reason": "DiscoveryFailed",
        "message": "Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request"
      },
      {
        "type": "NamespaceDeletionGroupVersionParsingFailure",
        "status": "False",
        "lastTransitionTime": "2023-06-24T02:28:35Z",
        "reason": "ParsedGroupVersions",
        "message": "All legacy kube types successfully parsed"
      },
      {
        "type": "NamespaceDeletionContentFailure",
        "status": "False",
        "lastTransitionTime": "2023-06-24T02:28:35Z",
        "reason": "ContentDeleted",
        "message": "All content successfully deleted, may be waiting on finalization"
      },
      {
        "type": "NamespaceContentRemaining",
        "status": "False",
        "lastTransitionTime": "2023-06-24T02:28:35Z",
        "reason": "ContentRemoved",
        "message": "All content successfully removed"
      },
      {
        "type": "NamespaceFinalizersRemaining",
        "status": "False",
        "lastTransitionTime": "2023-06-24T02:28:35Z",
        "reason": "ContentHasNoFinalizers",
        "message": "All content-preserving finalizers finished"
      }
    ]
  }
}

終了状態の名前空間 kubesphere-system が削除されているかどうかを確認します。

root@centos1 ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   13h
kube-flannel      Active   104m
kube-node-lease   Active   13h
kube-public       Active   13h
kube-system       Active   13h

注: 間違った名前空間呼び出し API (興奮、kubesphere-system は kubespheer-system と呼ばれます):
[root@centos1 ~]# curl -k -H "Content-Type: application/json" -X PUT --data-binary @kubesphere.json http://127.0.0.1:8001/api/v1/namespaces/kubespheer-system/finalize
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "the name of the object (kubesphere-system) does not match the name on the URL (kubespheer-system)",
  "reason": "BadRequest",
  "code": 400

そして、削除できないポッドをこの方法で削除できる場合もあります。後で見つけたときに追加します。

おすすめ

転載: blog.csdn.net/alwaysbefine/article/details/131359937