序文:
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
そして、削除できないポッドをこの方法で削除できる場合もあります。後で見つけたときに追加します。