4.3. 障害復旧
この障害復旧ドキュメントでは、OpenShift Container Platform クラスターで発生する可能性のある複数の障害のある状態からの復旧方法に関する管理者向けの情報を提供しています。管理者は、クラスターの状態を機能する状態に戻すために、以下の 1 つまたは複数の手順を実行する必要がある場合があります。
障害復旧には、少なくとも 1 つの正常なコントロールプレーンホストが必要です。
4.3.1. クォーラムの復元 リンクのコピーリンクがクリップボードにコピーされました!
quorum-restore.sh スクリプトを使用すると、クォーラムの喪失によりオフラインになっているクラスターの etcd クォーラムを復元できます。クォーラムが失われると、OpenShift Container Platform API が読み取り専用になります。クォーラムが復元されると、OpenShift Container Platform API は読み取り/書き込みモードに戻ります。
4.3.1.1. 高可用性クラスターの etcd クォーラムの復元 リンクのコピーリンクがクリップボードにコピーされました!
quorum-restore.sh スクリプトを使用すると、クォーラムの喪失によりオフラインになっているクラスターの etcd クォーラムを復元できます。クォーラムが失われると、OpenShift Container Platform API が読み取り専用になります。クォーラムが復元されると、OpenShift Container Platform API は読み取り/書き込みモードに戻ります。
quorum-restore.sh スクリプトは、ローカルのデータディレクトリーに基づいてシングルメンバーの新しい etcd クラスターを即座に戻し、以前のクラスター識別子を廃止して他のすべてのメンバーを無効としてマークします。コントロールプレーンを復元するために事前のバックアップは必要ありません。
高可用性 (HA) クラスターの場合、3 ノードの HA クラスターでは、クラスターの分割を回避するために、2 つのホストで etcd をシャットダウンする必要があります。4 ノードおよび 5 ノードの HA クラスターでは、3 つのホストをシャットダウンする必要があります。クォーラムにはノードの単純過半数が必要です。3 ノードの HA クラスターのクォーラムに必要なノードの最小数は 2 です。4 ノードおよび 5 ノードの HA クラスターでは、クォーラムに必要なノードの最小数は 3 です。リカバリーホスト上のバックアップから新しいクラスターを起動すると、他の etcd メンバーがクォーラムを形成してサービスを継続できる可能性があります。
復元を実行するホストにすべてのデータがレプリケートされていない場合、データが失われる可能性があります。
クォーラムの復元は、復元プロセス外のノード数を減らすために使用しないでください。ノードの数を減らすと、サポート対象外のクラスター設定になります。
前提条件
- クォーラムを復元するために使用するノードへの SSH アクセス権がある。
手順
リカバリーホストとして使用するコントロールプレーンホストを選択します。このホストで復元操作を実行します。
次のコマンドを実行して、実行中の etcd Pod をリスト表示します。
$ oc get pods -n openshift-etcd -l app=etcd --field-selector="status.phase==Running"Pod を 1 つ選択し、次のコマンドを実行してその IP アドレスを取得します。
$ oc exec -n openshift-etcd <etcd-pod> -c etcdctl -- etcdctl endpoint status -w tableRaft インデックスが最も大きく、Learner ではないメンバーの IP アドレスをメモします。
次のコマンドを実行し、選択した etcd メンバーの IP アドレスに対応するノード名をメモします。
$ oc get nodes -o jsonpath='{range .items[*]}[{.metadata.name},{.status.addresses[?(@.type=="InternalIP")].address}]{end}'
SSH を使用して、選択したリカバリーノードに接続し、次のコマンドを実行して etcd クォーラムを復元します。
$ sudo -E /usr/local/bin/quorum-restore.sh数分後、ダウンしたノードが、リカバリースクリプトを実行したノードと自動的に同期されます。残りのオンラインのノードは、
quorum-restore.shスクリプトによって作成された新しい etcd クラスターに自動的に再参加します。このプロセスには数分かかります。- SSH セッションを終了します。
いずれかのノードがオフラインの場合は、3 ノード設定に戻ります。オフラインになっているノードごとに次の手順を繰り返して、ノードを削除し、再作成します。マシンが再作成された後、新しいリビジョンが強制され、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 adm wait-for-stable-cluster注記コントロールプレーンが回復するまでに最大 15 分かかります。
トラブルシューティング
etcd 静的 Pod のロールアウトが進行していない場合は、次のコマンドを実行して、etcd クラスター Operator から強制的に再デプロイを実行できます。
$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns )"'"}}' --type=merge
コントロールプレーンノードの大部分がまだ使用可能であり、etcd のクォーラムがある場合は、1 つの異常な etcd メンバーを置き換えます。
4.3.2. 以前のクラスター状態への復元 リンクのコピーリンクがクリップボードにコピーされました!
クラスターを以前の状態に復元するには、スナップショットを作成して etcd データを事前にバックアップしておく必要があります。このスナップショットを使用して、クラスターの状態を復元します。詳細は、「etcd データのバックアップ」を参照してください。
該当する場合は、コントロールプレーン証明書の期限切れの状態からのリカバリー が必要になる場合もあります。
以前のクラスター状態に復元することは、実行中のクラスターを不安定な状態にする破壊的な操作です。この手順は、最後の手段としてのみ使用してください。
復元を実行する前に、クラスターへの影響の詳細について、「以前のクラスター状態への復元について」を参照してください。
4.3.2.1. 以前のクラスター状態への復元について リンクのコピーリンクがクリップボードにコピーされました!
クラスターを以前の状態に復元するには、スナップショットを作成して etcd データを事前にバックアップしておく必要があります。このスナップショットを使用して、クラスターの状態を復元します。詳細は、「etcd データのバックアップ」を参照してください。
etcd バックアップを使用して、クラスターを直前の状態に復元できます。これは、以下の状況から回復するために使用できます。
- クラスターは、大多数のコントロールプレーンホストを失いました (クォーラムの喪失)。
- 管理者が重要なものを削除し、クラスターを復旧するために復元する必要があります。
以前のクラスター状態に復元することは、実行中のクラスターを不安定な状態にする破壊的な操作です。これは、最後の手段としてのみ使用してください。
Kubernetes API サーバーを使用してデータを取得できる場合は、etcd が利用できるため、etcd バックアップを使用して復元することはできません。
etcd を効果的に復元すると、クラスターが時間内に元に戻され、すべてのクライアントは競合する並列履歴が発生します。これは、kubelet、Kubernetes コントローラーマネージャー、永続ボリュームコントローラー、OpenShift Container Platform Operator (ネットワーク Operator を含む) などの監視コンポーネントの動作に影響を与える可能性があります。
etcd のコンテンツがディスク上の実際のコンテンツと一致しないと、Operator チャーンが発生し、ディスク上のファイルが etcd のコンテンツと競合すると、Kubernetes API サーバー、Kubernetes コントローラーマネージャー、Kubernetes スケジューラーなどの Operator が停止する場合があります。この場合は、問題の解決に手動のアクションが必要になる場合があります。
極端な場合、クラスターは永続ボリュームを追跡できなくなり、存在しなくなった重要なワークロードを削除し、マシンのイメージを再作成し、期限切れの証明書を使用して CA バンドルを書き換えることができます。
4.3.2.2. シングルノードで以前のクラスター状態に復元する リンクのコピーリンクがクリップボードにコピーされました!
保存された etcd バックアップを使用して、シングルノードでクラスターの以前の状態を復元できます。
クラスターを復元する際に、同じ z-stream リリースから取得した etcd バックアップを使用する必要があります。たとえば、OpenShift Container Platform 4.20.2 クラスターは、4.20.2 から取得した etcd バックアップを使用する必要があります。
前提条件
-
インストール時に使用したものと同様、証明書ベースの
kubeconfigファイルを介して、cluster-adminロールを持つユーザーとしてクラスターにアクセスします。 - コントロールプレーンホストへの SSH アクセス権がある。
-
etcd スナップショットと静的 Pod のリソースの両方を含むバックアップディレクトリー (同じバックアップから取られるもの)。ディレクトリー内のファイル名は、
snapshot_<datetimestamp>.dbおよびstatic_kuberesources_<datetimestamp>.tar.gzの形式にする必要があります。
手順
SSH を使用してシングルノードに接続し、次のコマンドを実行して etcd バックアップを
/home/coreディレクトリーにコピーします。$ cp <etcd_backup_directory> /home/coreシングルノードで次のコマンドを実行し、以前のバックアップからクラスターを復元します。
$ sudo -E /usr/local/bin/cluster-restore.sh /home/core/<etcd_backup_directory>- SSH セッションを終了します。
次のコマンドを実行して、コントロールプレーンの回復の進行状況を監視します。
$ oc adm wait-for-stable-cluster注記コントロールプレーンが回復するまでに最大 15 分かかります。
4.3.2.3. 複数のノードの以前のクラスター状態への復元 リンクのコピーリンクがクリップボードにコピーされました!
保存された etcd のバックアップを使用して、クラスターの以前の状態を復元したり、大多数のコントロールプレーンホストが失われたクラスターを復元したりできます。
高可用性 (HA) クラスターの場合、3 ノードの HA クラスターでは、クラスターの分割を回避するために、2 つのホストで etcd をシャットダウンする必要があります。4 ノードおよび 5 ノードの HA クラスターでは、3 つのホストをシャットダウンする必要があります。クォーラムにはノードの単純過半数が必要です。3 ノードの HA クラスターのクォーラムに必要なノードの最小数は 2 です。4 ノードおよび 5 ノードの HA クラスターでは、クォーラムに必要なノードの最小数は 3 です。リカバリーホスト上のバックアップから新しいクラスターを起動すると、他の etcd メンバーがクォーラムを形成してサービスを継続できる可能性があります。
クラスターがコントロールプレーンマシンセットを使用している場合は、「コントロールプレーンマシンセットのトラブルシューティング」の「劣化した etcd Operator のリカバリー」で etcd のリカバリー手順を参照してください。シングルノード上の OpenShift Container Platform は、「シングルノードで以前のクラスター状態に復元する」を参照してください。
クラスターを復元する際に、同じ z-stream リリースから取得した etcd バックアップを使用する必要があります。たとえば、OpenShift Container Platform 4.20.2 クラスターは、4.20.2 から取得した etcd バックアップを使用する必要があります。
前提条件
-
インストール時に使用したものと同様、証明書ベースの
kubeconfigファイルを介して、cluster-adminロールを持つユーザーとしてクラスターにアクセスします。 - リカバリーホストとして使用する正常なコントロールプレーンホストがあること。
- コントロールプレーンホストへの SSH アクセス権がある。
-
etcdスナップショットと静的 Pod のリソースの両方を含むバックアップディレクトリー (同じバックアップから取られるもの)。ディレクトリー内のファイル名は、snapshot_<datetimestamp>.dbおよびstatic_kuberesources_<datetimestamp>.tar.gzの形式にする必要があります。 - ノードはアクセス可能またはブート可能である。
非リカバリーコントロールプレーンノードの場合は、SSH 接続を確立したり、静的 Pod を停止したりする必要はありません。他のリカバリー以外のコントロールプレーンマシンを 1 つずつ削除し、再作成します。
手順
- リカバリーホストとして使用するコントロールプレーンホストを選択します。これは、復元操作の実行対象とするホストです。
リカバリーホストを含む、各コントロールプレーンノードへの SSH 接続を確立します。
kube-apiserverは復元プロセスの開始後にアクセスできなくなるため、コントロールプレーンノードにはアクセスできません。このため、別のターミナルで各コントロールプレーンホストに SSH 接続を確立することが推奨されます。重要この手順を完了しないと、復元手順を完了するためにコントロールプレーンホストにアクセスすることができなくなり、この状態からクラスターを回復できなくなります。
SSH を使用して各コントロールプレーンノードに接続し、次のコマンドを実行して etcd を無効にします。
$ sudo -E /usr/local/bin/disable-etcd.shetcd バックアップディレクトリーをリカバリーコントロールプレーンホストにコピーします。
この手順では、etcd スナップショットおよび静的 Pod のリソースを含む
backupディレクトリーを、リカバリーコントロールプレーンホストの/home/core/ディレクトリーにコピーしていることを前提としています。SSH を使用してリカバリーホストに接続し、次のコマンドを実行して以前のバックアップからクラスターを復元します。
$ sudo -E /usr/local/bin/cluster-restore.sh /home/core/<etcd-backup-directory>- SSH セッションを終了します。
API が応答したら、次のコマンドを実行して etcd Operator のクォーラムガードをオフにします。
$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'次のコマンドを実行して、コントロールプレーンの回復の進行状況を監視します。
$ oc adm wait-for-stable-cluster注記コントロールプレーンが回復するまでに最大 15 分かかります。
回復したら、次のコマンドを実行してクォーラムガードを有効にします。
$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'
トラブルシューティング
etcd 静的 Pod のロールアウトが進行していない場合は、次のコマンドを実行して、cluster-etcd-operator から強制的に再デプロイを実行できます。
$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns )"'"}}' --type=merge
4.3.2.4. 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
4.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 のリソースの削除 を参照)。
4.3.3. コントロールプレーン証明書の期限切れの状態からのリカバリー リンクのコピーリンクがクリップボードにコピーされました!
クラスターはコントロールプレーン証明書の期限切れの状態から自動的に回復できます。
ただし、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>
4.3.4. 復元手順のテスト リンクのコピーリンクがクリップボードにコピーされました!
自動化とワークロードが新しいクラスターの状態を適切に処理できるように、復元手順をテストすることが重要です。etcd クォーラムの複雑な性質と、etcd Operator による自動修復が原因で、クラスターを復元可能な状態に正しく戻すことが困難な場合がよくあります。
クラスターへの SSH アクセス権が 必要 です。SSH アクセスがないと、クラスターが完全に失われる可能性があります。
前提条件
- コントロールプレーンホストへの SSH アクセス権がある。
-
OpenShift CLI (
oc) がインストールされている。
手順
SSH を使用してリカバリーノード以外の各ノードに接続し、次のコマンドを実行して etcd と
kubeletサービスを無効にします。次のコマンドを実行して etcd を無効にします。
$ sudo /usr/local/bin/disable-etcd.sh次のコマンドを実行して、etcd の変数データを削除します。
$ sudo rm -rf /var/lib/etcd次のコマンドを実行して、
kubeletサービスを無効にします。$ sudo systemctl disable kubelet.service
- すべての SSH セッションを終了します。
次のコマンドを実行して、リカバリーノード以外のノードが
NOT READY状態であることを確認します。$ oc get nodes- 「以前のクラスター状態への復元」の手順に従い、クラスターを復元します。
クラスターを復元し、API が応答したら、SSH を使用してリカバリーノード以外の各ノードに接続し、
kubeletサービスを有効にします。$ sudo systemctl enable kubelet.service- すべての SSH セッションを終了します。
次のコマンドを実行して、ノードが
READY状態に戻ることを確認します。$ oc get nodes次のコマンドを実行して、etcd が利用可能であることを確認します。
$ oc get pods -n openshift-etcd