5.3. 障害復旧
5.3.1. 障害復旧について リンクのコピーリンクがクリップボードにコピーされました!
この障害復旧ドキュメントでは、OpenShift Container Platform クラスターで発生する可能性のある複数の障害のある状態からの復旧方法に関する管理者向けの情報を提供しています。管理者は、クラスターの状態を機能する状態に戻すために、以下の 1 つまたは複数の手順を実行する必要がある場合があります。
障害復旧には、少なくとも 1 つの正常なコントロールプレーンホストが必要です。
- クラスターの直前の状態への復元
このソリューションは、管理者が重要なものを削除した場合など、クラスターを直前の状態に復元する必要がある状態に対応します。これには、大多数のコントロールプレーンホストが失われたために etcd クォーラム (定足数) が失われ、クラスターがオフラインになる状態も含まれます。etcd バックアップを取得している限り、以下の手順に従ってクラスターを直前の状態に復元できます。
該当する場合は、コントロールプレーン証明書の期限切れの状態からのリカバリーが必要になる場合もあります。
警告以前のクラスター状態に復元することは、実行中のクラスターを不安定な状態にする破壊的な操作です。この手順は、最後の手段としてのみ使用してください。
復元の実行前に、クラスターへの影響の詳細についてクラスターの復元を参照してください。
注記大多数のマスターが依然として利用可能であり、etcd のクォーラムがある場合は、手順に従って単一の正常でない etcd メンバーの置き換えを実行します。
- コントロールプレーン証明書の期限切れの状態からのリカバリー
- このソリューションは、コントロールプレーン証明書の期限が切れた状態に対応します。たとえば、インストールの 24 時間後に行われる最初の証明書のローテーション前にクラスターをシャットダウンする場合、証明書はローテーションされず、期限切れになります。以下の手順に従って、コントロールプレーン証明書の期限切れの状態からのリカバリーを実行できます。
5.3.2. 以前のクラスター状態への復元 リンクのコピーリンクがクリップボードにコピーされました!
クラスターを以前の状態に復元するには、スナップショットを作成して etcd データを事前にバックアップしておく必要があります。このスナップショットを使用して、クラスターの状態を復元します。詳細は、「etcd データのバックアップ」を参照してください。
5.3.2.1. クラスターの状態の復元について リンクのコピーリンクがクリップボードにコピーされました!
etcd バックアップを使用して、クラスターを直前の状態に復元できます。これは、以下の状況から回復するために使用できます。
- クラスターは、大多数のコントロールプレーンホストを失いました (クォーラムの喪失)。
- 管理者が重要なものを削除し、クラスターを復旧するために復元する必要があります。
以前のクラスター状態に復元することは、実行中のクラスターを不安定な状態にする破壊的な操作です。これは、最後の手段としてのみ使用してください。
Kubernetes API サーバーを使用してデータを取得できる場合は、etcd が利用できるため、etcd バックアップを使用して復元することはできません。
etcd を効果的に復元すると、クラスターが時間内に元に戻され、すべてのクライアントは競合する並列履歴が発生します。これは、kubelet、Kubernetes コントローラーマネージャー、永続ボリュームコントローラー、ネットワーク Operator を含む OpenShift Operator などの監視コンポーネントの動作に影響を与える可能性があります。
etcd のコンテンツがディスク上の実際のコンテンツと一致しないと、Operator チャーンが発生し、ディスク上のファイルが etcd のコンテンツと競合すると、Kubernetes API サーバー、Kubernetes コントローラーマネージャー、Kubernetes スケジューラーなどの Operator が停止する場合があります。この場合は、問題の解決に手動のアクションが必要になる場合があります。
極端な場合、クラスターは永続ボリュームを追跡できなくなり、存在しなくなった重要なワークロードを削除し、マシンのイメージを再作成し、期限切れの証明書を使用して CA バンドルを書き換えることができます。
5.3.2.2. クラスターの直前の状態への復元 リンクのコピーリンクがクリップボードにコピーされました!
保存された etcd のバックアップを使用して、クラスターの以前の状態を復元したり、大多数のコントロールプレーンホストが失われたクラスターを復元したりできます。
クラスターがコントロールプレーンマシンセットを使用している場合は、「コントロールプレーンマシンセットのトラブルシューティング」の「劣化した etcd Operator のリカバリー」で etcd のリカバリー手順を参照してください。
クラスターを復元する際に、同じ z-stream リリースから取得した etcd バックアップを使用する必要があります。たとえば、OpenShift Container Platform 4.7.2 クラスターは、4.7.2 から取得した etcd バックアップを使用する必要があります。
前提条件
-
インストール時に使用したものと同様、証明書ベースの
kubeconfigファイルを介して、cluster-adminロールを持つユーザーとしてクラスターにアクセスします。 - リカバリーホストとして使用する正常なコントロールプレーンホストがあること。
- コントロールプレーンホストへの SSH アクセス。
-
etcdスナップショットと静的 Pod のリソースの両方を含むバックアップディレクトリー (同じバックアップから取られるもの)。ディレクトリー内のファイル名は、snapshot_<datetimestamp>.dbおよびstatic_kuberesources_<datetimestamp>.tar.gzの形式にする必要があります。 - ノードはアクセス可能またはブート可能である。
非リカバリーコントロールプレーンノードの場合は、SSH 接続を確立したり、静的 Pod を停止したりする必要はありません。他のリカバリー以外のコントロールプレーンマシンを 1 つずつ削除し、再作成します。
手順
- リカバリーホストとして使用するコントロールプレーンホストを選択します。これは、復元操作を実行するホストです。
リカバリーホストを含む、各コントロールプレーンノードへの SSH 接続を確立します。別のターミナルを使用して、各コントロールプレーンノードの SSH 接続を確立します。
Kubernetes API サーバーは復元プロセスの開始後にアクセスできなくなるため、
oc debugメソッドを使用してコントロールプレーンノードにアクセスすることはできません。このため、別のターミナルで各コントロールプレーンホストへの SSH 接続を確立します。重要この手順を完了しないと、復元手順を完了するためにコントロールプレーンホストにアクセスすることができなくなり、この状態からクラスターを回復できなくなります。
etcdバックアップディレクトリーをリカバリーコントロールプレーンホストにコピーします。この手順では、
etcdスナップショットおよび静的 Pod のリソースを含むbackupディレクトリーを、リカバリーコントロールプレーンホストの/home/core/ディレクトリーにコピーしていることを前提としています。他のすべてのコントロールプレーンノードで静的 Pod を停止します。
注記リカバリーホストで静的 Pod を停止する必要はありません。
- リカバリーホストではないコントロールプレーンホストにアクセスします。
次のコマンドを実行して、既存の etcd Pod ファイルを kubelet マニフェストディレクトリーから移動します。
$ sudo mv -v /etc/kubernetes/manifests/etcd-pod.yaml /tmp次のコマンドを実行して、
etcdPod が停止していることを確認します。$ sudo crictl ps | grep etcd | egrep -v "operator|etcd-guard"このコマンドの出力が空でない場合は、数分待ってからもう一度確認してください。
以下のコマンドを実行して、既存の
kube-apiserverファイルを kubelet マニフェストディレクトリーから移動します。$ sudo mv -v /etc/kubernetes/manifests/kube-apiserver-pod.yaml /tmp以下のコマンドを実行して、
kube-apiserverコンテナーが停止していることを確認します。$ sudo crictl ps | grep kube-apiserver | egrep -v "operator|guard"このコマンドの出力が空でない場合は、数分待ってからもう一度確認してください。
次のコマンドを実行して、既存の
kube-controller-managerファイルを kubelet マニフェストディレクトリーから移動します。$ sudo mv -v /etc/kubernetes/manifests/kube-controller-manager-pod.yaml /tmp以下のコマンドを実行して、
kube-controller-managerコンテナーが停止していることを確認します。$ sudo crictl ps | grep kube-controller-manager | egrep -v "operator|guard"このコマンドの出力が空でない場合は、数分待ってからもう一度確認してください。
次のコマンドを実行して、既存の
kube-schedulerファイルを kubelet マニフェストディレクトリーから移動します。$ sudo mv -v /etc/kubernetes/manifests/kube-scheduler-pod.yaml /tmp以下のコマンドを実行して、
kube-schedulerコンテナーが停止していることを確認します。$ sudo crictl ps | grep kube-scheduler | egrep -v "operator|guard"このコマンドの出力が空でない場合は、数分待ってからもう一度確認してください。
次の例を使用して、
etcdデータディレクトリーを別の場所に移動します。$ sudo mv -v /var/lib/etcd/ /tmp/etc/kubernetes/manifests/keepalived.yamlファイルが存在する場合は、以下の手順を実行します。これらの手順は、API IP アドレスがリカバリーホストでリッスンしていることを確認するために必要です。次のコマンドを実行して、
/etc/kubernetes/manifests/keepalived.yamlファイルを kubelet マニフェストディレクトリーから移動します。$ sudo mv -v /etc/kubernetes/manifests/keepalived.yaml /home/core/注記このファイルは、手順の完了後に元の場所に復元する必要があります。
keepalivedデーモンによって管理されているコンテナーが停止していることを確認します。$ sudo crictl ps --name keepalivedコマンドの出力は空であるはずです。空でない場合は、数分待機してから再度確認します。
コントロールプレーンに仮想 IP (VIP) が割り当てられているかどうかを確認します。
$ ip -o address | egrep '<api_vip>|<ingress_vip>'報告された仮想 IP ごとに、次のコマンドを実行して仮想 IP を削除します。
$ sudo ip address del <reported_vip> dev <reported_vip_device>
- リカバリーホストではない他のコントロールプレーンホストでこの手順を繰り返します。
- リカバリーコントロールプレーンホストにアクセスします。
keepalivedデーモンが使用されている場合は、リカバリーコントロールプレーンノードが仮想 IP を所有していることを確認します。それ以外の場合は、手順 4.xi を繰り返します。$ ip -o address | grep <api_vip>仮想 IP のアドレスが存在する場合、出力内で強調表示されます。仮想 IP が設定されていないか、正しく設定されていない場合、このコマンドは空の文字列を返します。
クラスター全体のプロキシーが有効になっている場合は、
NO_PROXY、HTTP_PROXY、およびHTTPS_PROXY環境変数をエクスポートしていることを確認します。ヒントoc get proxy cluster -o yamlの出力を確認して、プロキシーが有効にされているかどうかを確認できます。プロキシーは、httpProxy、httpsProxy、およびnoProxyフィールドに値が設定されている場合に有効にされます。リカバリーコントロールプレーンホストで復元スクリプトを実行し、パスを
etcdバックアップディレクトリーに渡します。$ sudo -E /usr/local/bin/cluster-restore.sh /home/core/assets/backupスクリプトの出力例
...stopping kube-scheduler-pod.yaml ...stopping kube-controller-manager-pod.yaml ...stopping etcd-pod.yaml ...stopping kube-apiserver-pod.yaml Waiting for container etcd to stop .complete Waiting for container etcdctl to stop .............................complete Waiting for container etcd-metrics to stop complete Waiting for container kube-controller-manager to stop complete Waiting for container kube-apiserver to stop ..........................................................................................complete Waiting for container kube-scheduler to stop complete Moving etcd data-dir /var/lib/etcd/member to /var/lib/etcd-backup starting restore-etcd static pod starting kube-apiserver-pod.yaml static-pod-resources/kube-apiserver-pod-7/kube-apiserver-pod.yaml starting kube-controller-manager-pod.yaml static-pod-resources/kube-controller-manager-pod-7/kube-controller-manager-pod.yaml starting kube-scheduler-pod.yaml static-pod-resources/kube-scheduler-pod-8/kube-scheduler-pod.yamlcluster-restore.sh スクリプトは、
etcd、kube-apiserver、kube-controller-manager、およびkube-schedulerPod が停止され、復元プロセスの最後に開始されたことを示す必要があります。注記最後の
etcdバックアップの後にノード証明書が更新された場合、復元プロセスによってノードがNotReady状態になる可能性があります。ノードをチェックして、
Ready状態であることを確認します。ノードを確認するには、bastion ホストまたはリカバリーホストのいずれかを使用できます。リカバリーホストを使用する場合は、次のコマンドを実行します。
$ export KUBECONFIG=/etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/localhost-recovery.kubeconfig$ oc get nodes -wbastion ホストを使用する場合は、以下の手順を実行します。
以下のコマンドを実行します。
$ oc get nodes -w出力例
NAME STATUS ROLES AGE VERSION host-172-25-75-28 Ready master 3d20h v1.30.3 host-172-25-75-38 Ready infra,worker 3d20h v1.30.3 host-172-25-75-40 Ready master 3d20h v1.30.3 host-172-25-75-65 Ready master 3d20h v1.30.3 host-172-25-75-74 Ready infra,worker 3d20h v1.30.3 host-172-25-75-79 Ready worker 3d20h v1.30.3 host-172-25-75-86 Ready worker 3d20h v1.30.3 host-172-25-75-98 Ready infra,worker 3d20h v1.30.3すべてのノードが状態を報告するのに数分かかる場合があります。
NotReady状態のノードがある場合は、ノードにログインし、各ノードの/var/lib/kubelet/pkiディレクトリーからすべての PEM ファイルを削除します。ノードに SSH 接続するか、Web コンソールのターミナルウィンドウを使用できます。$ ssh -i <ssh-key-path> core@<master-hostname>サンプル
pkiディレクトリーsh-4.4# pwd /var/lib/kubelet/pki sh-4.4# ls kubelet-client-2022-04-28-11-24-09.pem kubelet-server-2022-04-28-11-24-15.pem kubelet-client-current.pem kubelet-server-current.pem
すべてのコントロールプレーンホストで kubelet サービスを再起動します。
リカバリーホストから以下のコマンドを実行します。
$ sudo systemctl restart kubelet.service- 他のすべてのコントロールプレーンホストでこの手順を繰り返します。
保留中の証明書署名要求 (CSR) を承認します。
注記単一ノードクラスターや 3 つのスケジュール可能なコントロールプレーンノードで構成されるクラスターなど、ワーカーノードを持たないクラスターには、承認する保留中の CSR はありません。この手順にリストされているすべてのコマンドをスキップできます。
次のコマンドを実行して、現在の CSR のリストを取得します。
$ oc get csr出力例
NAME AGE SIGNERNAME REQUESTOR CONDITION csr-2s94x 8m3s kubernetes.io/kubelet-serving system:node:<node_name> Pending1 csr-4bd6t 8m3s kubernetes.io/kubelet-serving system:node:<node_name> Pending2 csr-4hl85 13m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending3 csr-zhhhp 3m8s kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending4 ...以下のコマンドを実行して CSR の詳細をレビューし、これが有効であることを確認します。
$ oc describe csr <csr_name>1 - 1
<csr_name>は、現行の CSR のリストからの CSR の名前です。
次のコマンドを実行して、それぞれの有効な
node-bootstrapperCSR を承認します。$ oc adm certificate approve <csr_name>ユーザーによってプロビジョニングされるインストールの場合は、以下のコマンドを実行してそれぞれの有効な kubelet サービス CSR を承認します。
$ oc adm certificate approve <csr_name>
単一メンバーのコントロールプレーンが正常に起動していることを確認します。
リカバリーホストから、次のコマンドを入力して、
etcdコンテナーが実行されていることを確認します。$ sudo crictl ps | grep etcd | egrep -v "operator|etcd-guard"出力例
3ad41b7908e32 36f86e2eeaaffe662df0d21041eb22b8198e0e58abeeae8c743c3e6e977e8009 About a minute ago Running etcd 0 7c05f8af362f0リカバリーホストから、次のコマンドを入力して、
etcdPod が実行されていることを確認します。$ oc -n openshift-etcd get pods -l k8s-app=etcd出力例
NAME READY STATUS RESTARTS AGE etcd-ip-10-0-143-125.ec2.internal 1/1 Running 1 2m47sステータスが
Pendingの場合や出力に複数の実行中のetcdPod が一覧表示される場合、数分待機してから再度チェックを行います。
OVNKubernetesネットワークプラグインを使用している場合は、ovnkube-controlplanePod を再起動する必要があります。次のコマンドを実行して、すべての
ovnkube-controlplanePod を削除します。$ oc -n openshift-ovn-kubernetes delete pod -l app=ovnkube-control-plane次のコマンドを実行して、すべての
ovnkube-controlplanePod が再デプロイされたことを確認します。$ oc -n openshift-ovn-kubernetes get pod -l app=ovnkube-control-plane
OVN-Kubernetes ネットワークプラグインを使用している場合は、すべてのノードで Open Virtual Network (OVN) Kubernetes Pod を 1 つずつ再起動します。次の手順を使用して、各ノードで OVN-Kubernetes Pod を再起動します。
重要OVN-Kubernetes Pod は次の順序で再起動してください。
- リカバリーコントロールプレーンホスト
- 他のコントロールプレーンホスト (利用可能な場合)
- 他のノード
注記検証および変更用の受付 Webhook は Pod を拒否することができます。
failurePolicyをFailに設定して追加の Webhook を追加すると、Pod が拒否され、復元プロセスが失敗する可能性があります。これは、クラスターの状態の復元中に Webhook を保存および削除することで回避できます。クラスターの状態が正常に復元された後に、Webhook を再度有効にできます。または、クラスターの状態の復元中に
failurePolicyを一時的にIgnoreに設定できます。クラスターの状態が正常に復元された後に、failurePolicyをFailにすることができます。ノースバウンドデータベース (nbdb) とサウスバウンドデータベース (sbdb) を削除します。Secure Shell (SSH) を使用してリカバリーホストと残りのコントロールプレーンノードにアクセスし、次のコマンドを実行します。
$ sudo rm -f /var/lib/ovn-ic/etc/*.dbOpenVSwitch サービスを再起動します。Secure Shell (SSH) を使用してノードにアクセスし、次のコマンドを実行します。
$ sudo systemctl restart ovs-vswitchd ovsdb-server次のコマンドを実行して、ノード上の
ovnkube-nodePod を削除します。<node>は、再起動するノードの名前に置き換えます。$ oc -n openshift-ovn-kubernetes delete pod -l app=ovnkube-node --field-selector=spec.nodeName==<node>次のコマンドを実行して、Pod のステータスを確認します。
$ oc get po -n openshift-ovn-kubernetesOVN Pod のステータスが
Terminatingである場合は、次のコマンドを実行して、OVN Pod を実行しているノードを削除します。<node> を、削除するノードの名前に置き換えます。$ oc delete node <node>次のコマンドを実行して、SSH を使用して
Terminatingステータスの OVN Pod ノードにログインします。$ ssh -i <ssh-key-path> core@<node>次のコマンドを実行して、すべての PEM ファイルを
/var/lib/kubelet/pkiディレクトリーから移動します。$ sudo mv /var/lib/kubelet/pki/* /tmp次のコマンドを実行して、kubelet サービスを無効にします。
$ sudo systemctl restart kubelet.service次のコマンドを実行して、リカバリー etcd マシンに戻ります。
$ oc get csr出力例
NAME AGE SIGNERNAME REQUESTOR CONDITION csr-<uuid> 8m3s kubernetes.io/kubelet-serving system:node:<node_name> Pending以下のコマンドを実行して、すべての新規 CSR を承認します。ここで、
csr-<uuid> は CSR の名前に置き換えてください。oc adm certificate approve csr-<uuid>次のコマンドを実行して、ノードが復旧していることを確認します。
$ oc get nodes
以下を使用して、
ovnkube-nodePod が再度実行されていることを確認します。$ oc -n openshift-ovn-kubernetes get pod -l app=ovnkube-node --field-selector=spec.nodeName==<node>注記Pod が再起動するまでに数分かかる場合があります。
他の非復旧のコントロールプレーンマシンを 1 つずつ削除して再作成します。マシンが再作成された後、新しいリビジョンが強制され、
etcdが自動的にスケールアップします。ユーザーがプロビジョニングしたベアメタルインストールを使用する場合は、最初に作成したときと同じ方法を使用して、コントロールプレーンマシンを再作成できます。詳細は、「ユーザーによってプロビジョニングされるクラスターのベアメタルへのインストール」を参照してください。
警告リカバリーホストのマシンを削除し、再作成しないでください。
installer-provisioned infrastructure を実行している場合、またはマシン API を使用してマシンを作成している場合は、以下の手順を実行します。
警告リカバリーホストのマシンを削除し、再作成しないでください。
installer-provisioned infrastructure でのベアメタルインストールの場合、コントロールプレーンマシンは再作成されません。詳細は、「ベアメタルコントロールプレーンノードの交換」を参照してください。
失われたコントロールプレーンホストのいずれかのマシンを取得します。
クラスターにアクセスできるターミナルで、cluster-admin ユーザーとして以下のコマンドを実行します。
$ oc get machines -n openshift-machine-api -o wide出力例
NAME PHASE TYPE REGION ZONE AGE NODE PROVIDERID STATE clustername-8qw5l-master-0 Running m4.xlarge us-east-1 us-east-1a 3h37m ip-10-0-131-183.ec2.internal aws:///us-east-1a/i-0ec2782f8287dfb7e stopped1 clustername-8qw5l-master-1 Running m4.xlarge us-east-1 us-east-1b 3h37m ip-10-0-143-125.ec2.internal aws:///us-east-1b/i-096c349b700a19631 running clustername-8qw5l-master-2 Running m4.xlarge us-east-1 us-east-1c 3h37m ip-10-0-154-194.ec2.internal aws:///us-east-1c/i-02626f1dba9ed5bba running clustername-8qw5l-worker-us-east-1a-wbtgd Running m4.large us-east-1 us-east-1a 3h28m ip-10-0-129-226.ec2.internal aws:///us-east-1a/i-010ef6279b4662ced running clustername-8qw5l-worker-us-east-1b-lrdxb Running m4.large us-east-1 us-east-1b 3h28m ip-10-0-144-248.ec2.internal aws:///us-east-1b/i-0cb45ac45a166173b running clustername-8qw5l-worker-us-east-1c-pkg26 Running m4.large us-east-1 us-east-1c 3h28m ip-10-0-170-181.ec2.internal aws:///us-east-1c/i-06861c00007751b0a running- 1
- これは、失われたコントロールプレーンホストのコントロールプレーンマシンです (
ip-10-0-131-183.ec2.internal)。
以下を実行して、失われたコントロールプレーンホストのマシンを削除します。
$ oc delete machine -n openshift-machine-api clustername-8qw5l-master-01 - 1
- 失われたコントロールプレーンホストのコントロールプレーンマシンの名前を指定します。
失われたコントロールプレーンホストのマシンを削除すると、新しいマシンが自動的にプロビジョニングされます。
以下を実行して、新しいマシンが作成されたことを確認します。
$ oc get machines -n openshift-machine-api -o wide出力例
NAME PHASE TYPE REGION ZONE AGE NODE PROVIDERID STATE clustername-8qw5l-master-1 Running m4.xlarge us-east-1 us-east-1b 3h37m ip-10-0-143-125.ec2.internal aws:///us-east-1b/i-096c349b700a19631 running clustername-8qw5l-master-2 Running m4.xlarge us-east-1 us-east-1c 3h37m ip-10-0-154-194.ec2.internal aws:///us-east-1c/i-02626f1dba9ed5bba running clustername-8qw5l-master-3 Provisioning m4.xlarge us-east-1 us-east-1a 85s ip-10-0-173-171.ec2.internal aws:///us-east-1a/i-015b0888fe17bc2c8 running1 clustername-8qw5l-worker-us-east-1a-wbtgd Running m4.large us-east-1 us-east-1a 3h28m ip-10-0-129-226.ec2.internal aws:///us-east-1a/i-010ef6279b4662ced running clustername-8qw5l-worker-us-east-1b-lrdxb Running m4.large us-east-1 us-east-1b 3h28m ip-10-0-144-248.ec2.internal aws:///us-east-1b/i-0cb45ac45a166173b running clustername-8qw5l-worker-us-east-1c-pkg26 Running m4.large us-east-1 us-east-1c 3h28m ip-10-0-170-181.ec2.internal aws:///us-east-1c/i-06861c00007751b0a running- 1
- 新規マシン
clustername-8qw5l-master-3が作成され、ProvisioningからRunningにフェーズが変更されると準備状態になります。
新規マシンが作成されるまでに数分の時間がかかる場合があります。
etcdクラスター Operator は、マシンまたはノードが正常な状態に戻ると自動的に同期します。- リカバリーホストではない喪失したコントロールプレーンホストで、これらのステップを繰り返します。
次のコマンドを実行して、クォーラムガードをオフにします。
$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'このコマンドにより、シークレットを正常に再作成し、静的 Pod をロールアウトできるようになります。
リカバリーホスト内の別のターミナルウィンドウで、次のコマンドを実行してリカバリー
kubeconfigファイルをエクスポートします。$ export KUBECONFIG=/etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/localhost-recovery.kubeconfigetcdの再デプロイメントを強制的に実行します。リカバリー
kubeconfigファイルをエクスポートしたのと同じターミナルウィンドウで、次のコマンドを実行します。$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge1 - 1
forceRedeploymentReason値は一意である必要があります。そのため、タイムスタンプが付加されます。
etcdの再デプロイメントが開始します。etcdクラスター Operator が再デプロイメントを実行すると、初期ブートストラップのスケールアップと同様に、既存のノードが新規 Pod と共に起動します。次のコマンドを実行して、クォーラムガードをオンに戻します。
$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'以下のコマンドを実行して、
unsupportedConfigOverridesセクションがオブジェクトから削除されたことを確認できます。$ oc get etcd/cluster -oyamlすべてのノードが最新のリビジョンに更新されていることを確認します。
クラスターにアクセスできるターミナルで、
cluster-adminユーザーとして以下のコマンドを実行します。$ oc get etcd -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\n"}{.message}{"\n"}'etcdのNodeInstallerProgressingステータス条件を確認し、すべてのノードが最新のリビジョンであることを確認します。更新が正常に実行されると、この出力にはAllNodesAtLatestRevisionが表示されます。AllNodesAtLatestRevision 3 nodes are at revision 71 - 1
- この例では、最新のリビジョン番号は
7です。
出力に
2 nodes are at revision 6; 1 nodes are at revision 7などの複数のリビジョン番号が含まれる場合、これは更新が依然として進行中であることを意味します。数分待機した後に再試行します。etcdの再デプロイ後に、コントロールプレーンの新規ロールアウトを強制的に実行します。kubelet は内部ロードバランサーを使用して API サーバーに接続されているため、kube-apiserverは他のノードに再インストールされます。クラスターにアクセスできるターミナルで、
cluster-adminユーザーとして以下の手順を実行します。kube-apiserverの新規ロールアウトを強制します。$ oc patch kubeapiserver cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=mergeすべてのノードが最新のリビジョンに更新されていることを確認します。
$ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\n"}{.message}{"\n"}'NodeInstallerProgressing状況条件を確認し、すべてのノードが最新のリビジョンであることを確認します。更新が正常に実行されると、この出力にはAllNodesAtLatestRevisionが表示されます。AllNodesAtLatestRevision 3 nodes are at revision 71 - 1
- この例では、最新のリビジョン番号は
7です。
出力に
2 nodes are at revision 6; 1 nodes are at revision 7などの複数のリビジョン番号が含まれる場合、これは更新が依然として進行中であることを意味します。数分待機した後に再試行します。次のコマンドを実行して、Kubernetes コントローラーマネージャーの新規ロールアウトを強制します。
$ oc patch kubecontrollermanager cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge以下のコマンドを実行して、すべてのノードが最新のリビジョンに更新されていることを確認します。
$ oc get kubecontrollermanager -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\n"}{.message}{"\n"}'NodeInstallerProgressing状況条件を確認し、すべてのノードが最新のリビジョンであることを確認します。更新が正常に実行されると、この出力にはAllNodesAtLatestRevisionが表示されます。AllNodesAtLatestRevision 3 nodes are at revision 71 - 1
- この例では、最新のリビジョン番号は
7です。
出力に
2 nodes are at revision 6; 1 nodes are at revision 7などの複数のリビジョン番号が含まれる場合、これは更新が依然として進行中であることを意味します。数分待機した後に再試行します。以下のコマンドを実行して
kube-schedulerの新規ロールアウトを強制的に実行します。$ oc patch kubescheduler cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge以下のコマンドを実行して、すべてのノードが最新のリビジョンに更新されていることを確認します。
$ oc get kubescheduler -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\n"}{.message}{"\n"}'NodeInstallerProgressing状況条件を確認し、すべてのノードが最新のリビジョンであることを確認します。更新が正常に実行されると、この出力にはAllNodesAtLatestRevisionが表示されます。AllNodesAtLatestRevision 3 nodes are at revision 71 - 1
- この例では、最新のリビジョン番号は
7です。
出力に
2 nodes are at revision 6; 1 nodes are at revision 7などの複数のリビジョン番号が含まれる場合、これは更新が依然として進行中であることを意味します。数分待機した後に再試行します。
次のコマンドを実行して、プラットフォーム Operator をモニターします。
$ oc adm wait-for-stable-clusterこのプロセスには最大 15 分かかる場合があります。
リカバリー手順の後にすべてのワークロードが通常の操作に戻るようにするには、すべてのコントロールプレーンノードを再起動します。
注記前の手順が完了したら、すべてのサービスが復元された状態に戻るまで数分間待つ必要がある場合があります。たとえば、
oc loginを使用した認証は、OAuth サーバー Pod が再起動するまですぐに機能しない可能性があります。即時認証に
system:adminkubeconfigファイルを使用することを検討してください。この方法は、OAuth トークンではなく SSL/TLS クライアント証明書に基づいて認証を行います。以下のコマンドを実行し、このファイルを使用して認証できます。$ export KUBECONFIG=<installation_directory>/auth/kubeconfig以下のコマンドを実行て、認証済みユーザー名を表示します。
$ oc whoami- ローリング方式ですべてのワーカーノードを再起動します。
5.3.2.3. etcd バックアップからのクラスターの手動復元 リンクのコピーリンクがクリップボードにコピーされました!
「以前のクラスター状態への復元」セクションで説明されている復元手順は次のとおりです。
-
2 つのコントロールプレーンノードを完全に再作成する必要があります。ただし、UPI インストール方式でインストールされたクラスターでは複雑な手順になる可能性があります。UPI インストールでは、コントロールプレーンノード用の
MachineまたはControlPlaneMachinesetが作成されないためです。 - /usr/local/bin/cluster-restore.sh スクリプトを使用して、シングルメンバーの新しい etcd クラスターを起動し、それを 3 つのメンバーに拡張します。
これに対し、この手順は次の点が異なります。
- コントロールプレーンノードを再作成する必要はありません。
- 3 つのメンバーからなる etcd クラスターを直接起動します。
クラスターがコントロールプレーンに MachineSet を使用する場合は、etcd の回復手順を簡素化するために、「以前のクラスター状態への復元」を使用することを推奨します。
クラスターを復元する際に、同じ z-stream リリースから取得した etcd バックアップを使用する必要があります。たとえば、OpenShift Container Platform 4.7.2 クラスターは、4.7.2 から取得した etcd バックアップを使用する必要があります。
前提条件
-
cluster-adminロールを持つユーザー (例:kubeadminユーザー) としてクラスターにアクセスします。 -
すべて のコントロールプレーンホストへの SSH アクセス権があり、ホストユーザーが
root(デフォルトのcoreホストユーザーなど) になることが許可されている。 -
同じバックアップからの以前の etcd スナップショットと静的 Pod のリソースの両方を含むバックアップディレクトリー。ディレクトリー内のファイル名は、
snapshot_<datetimestamp>.dbおよびstatic_kuberesources_<datetimestamp>.tar.gzの形式にする必要があります。
手順
SSH を使用して各コントロールプレーンノードに接続します。
Kubernetes API サーバーは復元プロセスの開始後にアクセスできなくなるため、コントロールプレーンノードにはアクセスできません。このため、アクセスするコントロールプレーンホストごとに、別のターミナルで SSH 接続を使用することを推奨します。
重要この手順を完了しないと、復元手順を完了するためにコントロールプレーンホストにアクセスすることができなくなり、この状態からクラスターを回復できなくなります。
etcd バックアップディレクトリーを各コントロールプレーンホストにコピーします。
この手順では、etcd スナップショットと静的 Pod のリソースを含む
backupディレクトリーを各コントロールプレーンホストの/home/core/assetsディレクトリーにコピーしていることを前提としています。このassetsフォルダーがまだ存在しない場合は、作成する必要がある場合があります。すべてのコントロールプレーンノード上の静的 Pod を、一度に 1 つのホストずつ停止します。
既存の Kubernetes API サーバーの静的 Pod マニフェストを kubelet マニフェストディレクトリーから移動します。
$ mkdir -p /root/manifests-backup$ mv /etc/kubernetes/manifests/kube-apiserver-pod.yaml /root/manifests-backup/次のコマンドを使用して、Kubernetes API Server コンテナーが停止したことを確認します。
$ crictl ps | grep kube-apiserver | grep -E -v "operator|guard"コマンドの出力は空であるはずです。空でない場合は、数分待機してから再度確認します。
Kubernetes API サーバーコンテナーがまだ実行中の場合は、次のコマンドを使用して手動で終了します。
$ crictl stop <container_id>同じ手順を、
kube-controller-manager-pod.yaml、kube-scheduler-pod.yaml、最後にetcd-pod.yamlに対して繰り返します。次のコマンドで
kube-controller-managerPod を停止します。$ mv /etc/kubernetes/manifests/kube-controller-manager-pod.yaml /root/manifests-backup/次のコマンドを使用して、コンテナーが停止しているかどうかを確認します。
$ crictl ps | grep kube-controller-manager | grep -E -v "operator|guard"次のコマンドを使用して、
kube-schedulerPod を停止します。$ mv /etc/kubernetes/manifests/kube-scheduler-pod.yaml /root/manifests-backup/次のコマンドを使用して、コンテナーが停止しているかどうかを確認します。
$ crictl ps | grep kube-scheduler | grep -E -v "operator|guard"次のコマンドを使用して
etcdPod を停止します。$ mv /etc/kubernetes/manifests/etcd-pod.yaml /root/manifests-backup/次のコマンドを使用して、コンテナーが停止しているかどうかを確認します。
$ crictl ps | grep etcd | grep -E -v "operator|guard"
各コントロールプレーンホストで、現在の
etcdデータをbackupフォルダーに移動して保存します。$ mkdir /home/core/assets/old-member-data$ mv /var/lib/etcd/member /home/core/assets/old-member-dataこのデータは、
etcdバックアップの復元が機能せず、etcdクラスターを現在の状態に復元する必要がある場合に役立ちます。各コントロールプレーンホストの正しい etcd パラメーターを確認します。
<ETCD_NAME>の値は、各コントロールプレーンホストごとに一意であり、特定のコントロールプレーンホストのマニフェスト/etc/kubernetes/static-pod-resources/etcd-certs/configmaps/restore-etcd-pod/pod.yamlファイル内にあるETCD_NAME変数の値と同じです。次のコマンドで確認できます。RESTORE_ETCD_POD_YAML="/etc/kubernetes/static-pod-resources/etcd-certs/configmaps/restore-etcd-pod/pod.yaml" cat $RESTORE_ETCD_POD_YAML | \ grep -A 1 $(cat $RESTORE_ETCD_POD_YAML | grep 'export ETCD_NAME' | grep -Eo 'NODE_.+_ETCD_NAME') | \ grep -Po '(?<=value: ").+(?=")'<UUID>の値は、次のコマンドを使用してコントロールプレーンホストで生成できます。$ uuidgen注記<UUID>の値は 1 回だけ生成する必要があります。1 つのコントロールプレーンホストでUUIDを生成した後あ、他のホストで再度生成しないでください。次の手順では、すべてのコントロールプレーンホストで同じUUIDを使用します。ETCD_NODE_PEER_URLの値は、次の例のように設定する必要があります。https://<IP_CURRENT_HOST>:2380正しい IP は、次のコマンドを使用して、特定のコントロールプレーンホストの
<ETCD_NAME>から確認できます。$ echo <ETCD_NAME> | \ sed -E 's/[.-]/_/g' | \ xargs -I {} grep {} /etc/kubernetes/static-pod-resources/etcd-certs/configmaps/etcd-scripts/etcd.env | \ grep "IP" | grep -Po '(?<=").+(?=")'<ETCD_INITIAL_CLUSTER>の値は、次のように設定する必要があります。<ETCD_NAME_n>は各コントロールプレーンホストの<ETCD_NAME>です。注記使用するポートは 2379 ではなく 2380 である必要があります。ポート 2379 は etcd データベース管理に使用され、コンテナー内の etcd 起動コマンドで直接設定されます。
出力例
<ETCD_NAME_0>=<ETCD_NODE_PEER_URL_0>,<ETCD_NAME_1>=<ETCD_NODE_PEER_URL_1>,<ETCD_NAME_2>=<ETCD_NODE_PEER_URL_2>1 - 1
- 各コントロールプレーンホストの
ETCD_NODE_PEER_URL値を指定します。
<ETCD_INITIAL_CLUSTER>値は、すべてのコントロールプレーンホストで同じです。次の手順では、すべてのコントロールプレーンホストで同じ値が必要です。
バックアップから etcd データベースを再生成します。
この操作は、各コントロールプレーンホストで実行する必要があります。
次のコマンドを使用して、
etcdバックアップを/var/lib/etcdディレクトリーにコピーします。$ cp /home/core/assets/backup/<snapshot_yyyy-mm-dd_hhmmss>.db /var/lib/etcd続行する前に、正しい
etcdctlイメージを特定します。次のコマンドを使用して、Pod マニフェストのバックアップからイメージを取得します。$ jq -r '.spec.containers[]|select(.name=="etcdctl")|.image' /root/manifests-backup/etcd-pod.yaml$ podman run --rm -it --entrypoint="/bin/bash" -v /var/lib/etcd:/var/lib/etcd:z <image-hash>etcdctlツールのバージョンが、バックアップが作成されたetcdサーバーのバージョンであることを確認します。$ etcdctl version現在のホストの正しい値を使用して次のコマンドを実行し、
etcdデータベースを再生成します。$ ETCDCTL_API=3 /usr/bin/etcdctl snapshot restore /var/lib/etcd/<snapshot_yyyy-mm-dd_hhmmss>.db \ --name "<ETCD_NAME>" \ --initial-cluster="<ETCD_INITIAL_CLUSTER>" \ --initial-cluster-token "openshift-etcd-<UUID>" \ --initial-advertise-peer-urls "<ETCD_NODE_PEER_URL>" \ --data-dir="/var/lib/etcd/restore-<UUID>" \ --skip-hash-check=true注記etcdデータベースを再生成する場合、引用符は必須です。
added memberログに出力される値を記録します。次に例を示します。出力例
2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "56cd73b614699e7", "added-peer-peer-urls": ["https://10.0.91.5:2380"], "added-peer-is-learner": false} 2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "1f63d01b31bb9a9e", "added-peer-peer-urls": ["https://10.0.90.221:2380"], "added-peer-is-learner": false} 2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "fdc2725b3b70127c", "added-peer-peer-urls": ["https://10.0.94.214:2380"], "added-peer-is-learner": false}- コンテナーから出ます。
-
この手順を他のコントロールプレーンホストでも繰り返し、
added memberログに出力される値がすべてのコントロールプレーンホストで同じであることを確認します。
再生成された
etcdデータベースをデフォルトの場所に移動します。この操作は、各コントロールプレーンホストで実行する必要があります。
再生成されたデータベース (以前の
etcdctl snapshot restoreコマンドによって作成されたmemberフォルダー) を、デフォルトの etcd の場所/var/lib/etcdに移動します。$ mv /var/lib/etcd/restore-<UUID>/member /var/lib/etcd/var/lib/etcdディレクトリーの/var/lib/etcd/memberフォルダーの SELinux コンテキストを復元します。$ restorecon -vR /var/lib/etcd/残りのファイルとディレクトリーを削除します。
$ rm -rf /var/lib/etcd/restore-<UUID>$ rm /var/lib/etcd/<snapshot_yyyy-mm-dd_hhmmss>.db重要完了すると、
/var/lib/etcdディレクトリーに含まれるフォルダーがmemberだけになります。- 他のコントロールプレーンホストでもこの手順を繰り返します。
etcd クラスターを再起動します。
- 次の手順は、すべてのコントロールプレーンホストで実行する必要があります。ただし、一度に 1 つのホストずつ 実行する必要があります。
kubelet が関連コンテナーを起動するように、
etcd静的 Pod マニフェストを kubelet マニフェストディレクトリーに戻します。$ mv /root/manifests-backup/etcd-pod.yaml /etc/kubernetes/manifestsすべての
etcdコンテナーが起動していることを確認します。$ crictl ps | grep etcd | grep -v operator出力例
38c814767ad983 f79db5a8799fd2c08960ad9ee22f784b9fbe23babe008e8a3bf68323f004c840 28 seconds ago Running etcd-health-monitor 2 fe4b9c3d6483c e1646b15207c6 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcd-metrics 0 fe4b9c3d6483c 08ba29b1f58a7 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcd 0 fe4b9c3d6483c 2ddc9eda16f53 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcdctlこのコマンドの出力が空の場合は、数分待ってからもう一度確認してください。
etcdクラスターのステータスを確認します。いずれかのコントロールプレーンホストで、次のコマンドを使用して
etcdクラスターのステータスを確認します。$ crictl exec -it $(crictl ps | grep etcdctl | awk '{print $1}') etcdctl endpoint status -w table出力例
+--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | https://10.0.89.133:2379 | 682e4a83a0cec6c0 | 3.5.0 | 67 MB | true | false | 2 | 218 | 218 | | | https://10.0.92.74:2379 | 450bcf6999538512 | 3.5.0 | 67 MB | false | false | 2 | 218 | 218 | | | https://10.0.93.129:2379 | 358efa9c1d91c3d6 | 3.5.0 | 67 MB | false | false | 2 | 218 | 218 | | +--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
他の静的 Pod を再起動します。
次の手順は、すべてのコントロールプレーンホストで実行する必要があります。ただし、一度に 1 つのホストずつ実行する必要があります。
次のコマンドを使用して、Kubernetes API サーバーの静的 Pod マニフェストを kubelet マニフェストディレクトリーに戻し、kubelet が関連するコンテナーを起動するようにします。
$ mv /root/manifests-backup/kube-apiserver-pod.yaml /etc/kubernetes/manifestsすべての Kubernetes API サーバーコンテナーが起動したことを確認します。
$ crictl ps | grep kube-apiserver | grep -v operator注記次のコマンドの出力が空の場合は、数分待ってからもう一度確認してください。
同じ手順を、
kube-controller-manager-pod.yamlファイルとkube-scheduler-pod.yamlファイルに対して繰り返します。次のコマンドを使用して、すべてのノードで kubelet を再起動します。
$ systemctl restart kubelet次のコマンドを使用して、残りのコントロールプレーン Pod を起動します。
$ mv /root/manifests-backup/kube-* /etc/kubernetes/manifests/kube-apiserver、kube-scheduler、およびkube-controller-managerPod が正しく起動しているかどうかを確認します。$ crictl ps | grep -E 'kube-(apiserver|scheduler|controller-manager)' | grep -v -E 'operator|guard'次のコマンドを使用して OVN データベースをワイプします。
for NODE in $(oc get node -o name | sed 's:node/::g') do oc debug node/${NODE} -- chroot /host /bin/bash -c 'rm -f /var/lib/ovn-ic/etc/ovn*.db && systemctl restart ovs-vswitchd ovsdb-server' oc -n openshift-ovn-kubernetes delete pod -l app=ovnkube-node --field-selector=spec.nodeName=${NODE} --wait oc -n openshift-ovn-kubernetes wait pod -l app=ovnkube-node --field-selector=spec.nodeName=${NODE} --for condition=ContainersReady --timeout=600s done
5.3.2.5. 永続ストレージの状態復元に関する問題および回避策 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターがいずれかの形式の永続ストレージを使用する場合に、クラスターの状態は通常 etcd 外に保存されます。etcd バックアップから復元する場合には、OpenShift Container Platform のワークロードのステータスも復元されます。ただし、etcd スナップショットが古い場合には、ステータスは無効または期限切れの可能性があります。
永続ボリューム (PV) の内容は etcd スナップショットには含まれません。etcd スナップショットから OpenShift Container Platform クラスターを復元する時に、重要ではないワークロードから重要なデータにアクセスしたり、その逆ができたりする場合があります。
以下は、古いステータスを生成するシナリオ例です。
- MySQL データベースが PV オブジェクトでバックアップされる Pod で実行されている。etcd スナップショットから OpenShift Container Platform を復元すると、Pod の起動を繰り返し試行しても、ボリュームをストレージプロバイダーに戻したり、実行中の MySQL Pod が生成したりされるわけではありません。この Pod は、ストレージプロバイダーでボリュームを復元し、次に PV を編集して新規ボリュームを参照するように手動で復元する必要があります。
- Pod P1 は、ノード X に割り当てられているボリューム A を使用している。別の Pod がノード Y にある同じボリュームを使用している場合に etcd スナップショットが作成された場合に、etcd の復元が実行されると、ボリュームがノード Y に割り当てられていることが原因で Pod P1 が正常に起動できなくなる可能性があります。OpenShift Container Platform はこの割り当てを認識せず、ボリュームが自動的に切り離されるわけではありません。これが生じる場合には、ボリュームをノード Y から手動で切り離し、ノード X に割り当ててることで Pod P1 を起動できるようにします。
- クラウドプロバイダーまたはストレージプロバイダーの認証情報が etcd スナップショットの作成後に更新された。これが原因で、プロバイダーの認証情報に依存する CSI ドライバーまたは Operator が機能しなくなります。これらのドライバーまたは Operator で必要な認証情報を手動で更新する必要がある場合があります。
デバイスが etcd スナップショットの作成後に OpenShift Container Platform ノードから削除されたか、名前が変更された。ローカルストレージ Operator で、
/dev/disk/by-idまたは/devディレクトリーから管理する各 PV のシンボリックリンクが作成されます。この状況では、ローカル PV が存在しないデバイスを参照してしまう可能性があります。この問題を修正するには、管理者は以下を行う必要があります。
- デバイスが無効な PV を手動で削除します。
- 各ノードからシンボリックリンクを削除します。
-
LocalVolumeまたはLocalVolumeSetオブジェクトを削除します (ストレージ永続ストレージの設定 ローカルボリュームを使用した永続ストレージ ローカルストレージ Operator のリソースの削除 を参照)。
5.3.3. コントロールプレーン証明書の期限切れの状態からのリカバリー リンクのコピーリンクがクリップボードにコピーされました!
5.3.3.1. コントロールプレーン証明書の期限切れの状態からのリカバリー リンクのコピーリンクがクリップボードにコピーされました!
クラスターはコントロールプレーン証明書の期限切れの状態から自動的に回復できます。
ただし、kubelet 証明書を回復するために保留状態の node-bootstrapper 証明書署名要求 (CSR) を手動で承認する必要があります。ユーザーによってプロビジョニングされるインストールの場合は、保留中の kubelet 提供の CSR を承認しないといけない場合があります。
保留中の CSR を承認するには、以下の手順に従います。
手順
現在の CSR の一覧を取得します。
$ oc get csr出力例
NAME AGE SIGNERNAME REQUESTOR CONDITION csr-2s94x 8m3s kubernetes.io/kubelet-serving system:node:<node_name> Pending1 csr-4bd6t 8m3s kubernetes.io/kubelet-serving system:node:<node_name> Pending csr-4hl85 13m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending2 csr-zhhhp 3m8s kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending ...CSR の詳細をレビューし、これが有効であることを確認します。
$ oc describe csr <csr_name>1 - 1
<csr_name>は、現行の CSR のリストからの CSR の名前です。
それぞれの有効な
node-bootstrapperCSR を承認します。$ oc adm certificate approve <csr_name>ユーザーによってプロビジョニングされるインストールの場合は、それぞれの有効な kubelet 提供の CSR を承認します。
$ oc adm certificate approve <csr_name>