This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.バックアップおよび復元
OpenShift Container Platform 4.1 クラスターのリカバリー
概要
第1章 etcd のバックアップ リンクのコピーリンクがクリップボードにコピーされました!
etcd は OpenShift Container Platform のキーと値のストアであり、すべてのリソースオブジェクトの状態を保存します。
クラスターの etcd データを定期的にバックアップし、OpenShift Container Platform 環境外の安全な場所に保存するのが理想的です。インストールの 24 時間後に行われる最初の証明書のローテーションが完了するまで etcd のバックアップを実行することはできません。ローテーションの完了前に実行すると、バックアップに期限切れの証明書が含まれることになります。さらに、ピーク時には障害が発生させる要素となる可能性があるため、ピーク時以外に etcd バックアップを取得することも推奨されています。
etcd のバックアップを取得した後に、マスターホストが失われた状態からの復旧や、クラスターの直前の状態への復元を実行できます。
etcd データのバックアッププロセスは、適切な証明書が提供されている etcd クラスターに接続できるマスターホストで実行できます。
1.1. etcd データのバックアップ リンクのコピーリンクがクリップボードにコピーされました!
以下の手順に従い、スナップショットを作成して etcd データをバックアップします。このスナップショットは保存でき、etcd を復元する必要がある場合に後で使用することができます。
単一マスターホストからのスナップショットのみを保存する必要があります。クラスター内の各マスターホストからのスナップショットは必要ありません。
前提条件
- マスターホストへの SSH アクセス。
手順
- root ユーザーとしてマスターホストにアクセスします。
etcd-snapshot-backup.sh
スクリプトを実行し、etcd スナップショットの保存先となる場所を渡します。sudo /usr/local/bin/etcd-snapshot-backup.sh ./assets/backup/snapshot.db
$ sudo /usr/local/bin/etcd-snapshot-backup.sh ./assets/backup/snapshot.db
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、スナップショットはマスターホストの
./assets/backup/snapshot.db
に保存されます。
第2章 障害復旧 リンクのコピーリンクがクリップボードにコピーされました!
2.1. 障害復旧について リンクのコピーリンクがクリップボードにコピーされました!
この障害復旧ドキュメントでは、OpenShift Container Platform クラスターで発生する可能性のある複数の障害のある状態からの復旧方法についての管理者向けの情報を提供しています。管理者は、クラスターの状態を機能する状態に戻すために、以下の 1 つまたは複数の手順を実行する必要がある場合があります。
- マスターホストの失われた状態からのリカバリー
このソリューションは、大多数のマスターホストが失われたために etcd クォーラム(定足数) が失われ、クラスターがオフラインになる状態に対応します。etcd のバックアップを取得し、かつ少なくとも 1 つ以上の正常なマスターホストが残っている限り、以下の手順に従ってクラスターを復旧できます。
該当する場合は、コントロールプレーン証明書の期限切れの状態からのリカバリーが必要になる場合もあります。
- クラスターの直前の状態への復元
このソリューションは、管理者が重要なものを削除した場合など、クラスターを直前の状態に復元する必要がある状態に対応します。etcd バックアップを取得している限り、以下の手順に従ってクラスターを直前の状態に復元できます。
該当する場合は、コントロールプレーン証明書の期限切れの状態からのリカバリーが必要になる場合もあります。
- コントロールプレーン証明書の期限切れの状態からのリカバリー
- このソリューションは、コントロールプレーン証明書の期限が切れた状態に対応します。たとえば、インストールの 24 時間後に行われる最初の証明書のローテーション前にクラスターをシャットダウンする場合、証明書はローテーションされず、期限切れになります。以下の手順に従って、コントロールプレーン証明書の期限切れの状態からのリカバリーを実行できます。
2.2. マスターホストの失われた状態からのリカバリー リンクのコピーリンクがクリップボードにコピーされました!
以下では、マスターホストの完全に失われた状態からのリカバリープロセスについて説明します。大多数のマスターホストが失われたために etcd クォーラム(定足数) が失われ、クラスターがオフラインになる状態などがこれに該当します。この手順では、少なくとも 1 つ以上の正常なマスターホストがあることを前提とします。
概観すると、この手順では以下を実行します。
- 残りのマスターホストでクォーラム(定足数) を復元します。
- 新規マスターホストを作成します。
- DNS およびロードバランサーエントリーを修正します。
- etcd をフルメンバーシップに拡張します。
大多数のマスターホストが失われた場合、etcd スナップショットのバックアップ が必要となり、残りのマスターホストで etcd クォーラム (定足数) を復元する必要があります。
2.2.1. マスターホストの失われた状態からのリカバリー リンクのコピーリンクがクリップボードにコピーされました!
以下の手順に従って、1 つ以上のマスターホストの失われた状態からのリカバリーを実行します。
前提条件
-
cluster-admin
ロールを持つユーザーとしてのクラスターへのアクセスがあること。 - 残りのマスターホストへの SSH アクセス。
- 大多数のマスターの失われた状態からのリカバリーの場合は etcd スナップショットのバックアップ。
手順
残りのマスターホストでクォーラム(定足数) を復元します。
注記この手順は、大多数のマスターが失敗している場合にのみ必要になります。大多数のマスターが依然として利用可能な場合にはこの手順を省略できます。
etcd スナップショットファイルを残りのマスターホストにコピーします。
この手順では、
snapshot.db
というスナップショットを、マスターホストの/home/core/
ディレクトリーにコピーしていることを前提とします。- 残りのマスターホストにアクセスします。
INITIAL_CLUSTER
変数を、<name>=<url>
形式でメンバー一覧に追加します。この変数は復元スクリプトに渡されます。 この手順では、この時点で単一メンバーのみが存在することを前提とします。export INITIAL_CLUSTER="etcd-member-ip-10-0-143-125.ec2.internal=https://etcd-0.clustername.devcluster.openshift.com:2380"
[core@ip-10-0-143-125 ~]$ export INITIAL_CLUSTER="etcd-member-ip-10-0-143-125.ec2.internal=https://etcd-0.clustername.devcluster.openshift.com:2380"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd-snapshot-restore.sh
スクリプトを実行します。2 つのパラメーターを
etcd-snapshot-restore.sh
スクリプトに渡します。 それらは、バックアップされた etcd スナップショットファイルへのパスと、INITIAL_CLUSTER
変数で定義されるメンバーの一覧です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd-snapshot-restore.sh
スクリプトが完了すると、クラスターでは単一メンバーの etcd クラスターを確認でき、API サービスは再起動を開始します。これには最長 15 分の時間がかかる可能性があります。クラスターにアクセスできるターミナルで、以下のコマンドを実行し、クラスターが準備状態にあることを確認します。
oc get nodes -l node-role.kubernetes.io/master
$ oc get nodes -l node-role.kubernetes.io/master NAME STATUS ROLES AGE VERSION ip-10-0-143-125.us-east-2.compute.internal Ready master 46m v1.13.4+db7b699c3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記置き換えられる古い etcd メンバーがすべてシャットダウンしていることを確認します。シャットダウンしていない場合には、それらが新規クラスターへの接続を試行し、以下のようなエラーをログに報告します。
2019-05-20 15:33:17.648445 E | rafthttp: request cluster ID mismatch (got 9f5f9f05e4d43b7f want 807ae3bffc8d69ca)
2019-05-20 15:33:17.648445 E | rafthttp: request cluster ID mismatch (got 9f5f9f05e4d43b7f want 807ae3bffc8d69ca)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
新規マスターホストを作成します。
クラスターでマシン API が有効にされており、かつ機能する場合、OpenShift
machine-api
Operator が復元すると、新規マスターが作成されます。しかし、machine-api
Operator が有効にされていない場合は、最初にマスターを作成するために使用した方法と同じ方法を使って新規マスターを作成する必要があります。また、これらの新規マスターホストの証明書署名要求 (CSR) を承認する必要もあります。クラスターに追加された各マシンについて 2 つの保留状態の CSR が生成されます。
クラスターにアクセスできるターミナルで、以下のコマンドを実行し、CSR を承認します。
現在の CSR の一覧を取得します。
oc get csr
$ oc get csr
Copy to Clipboard Copied! Toggle word wrap Toggle overflow CSR の詳細をレビューし、これが有効であることを確認します。
oc describe csr <csr_name>
$ oc describe csr <csr_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<csr_name>
は、現行の CSR の一覧からの CSR の名前です。
それぞれの有効な CSR を承認します。
oc adm certificate approve <csr_name>
$ oc adm certificate approve <csr_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow クラスターに追加されたそれぞれのマスターについての保留状態のクライアントおよびサーバー CSR の両方を承認します。
クラスターにアクセスできるターミナルで、以下のコマンドを実行し、マスターが準備状態にあることを確認します。
oc get nodes -l node-role.kubernetes.io/master
$ oc get nodes -l node-role.kubernetes.io/master NAME STATUS ROLES AGE VERSION ip-10-0-143-125.us-east-2.compute.internal Ready master 50m v1.13.4+db7b699c3 ip-10-0-156-255.us-east-2.compute.internal Ready master 92s v1.13.4+db7b699c3 ip-10-0-162-178.us-east-2.compute.internal Ready master 70s v1.13.4+db7b699c3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
DNS エントリーを修正します。
AWS コンソールで、プライベート DNS ゾーンにある etcd-0、etcd-1、および etcd-2 Route 53 レコードを確認し、必要な場合には、値を適切な新規のプライベート IP アドレスに更新します。具体的な方法については、AWS ドキュメントの「 Editing Records 」を参照してください。
クラスターにアクセスできるターミナルで以下のコマンドを実行して、インスタンスのプライベート IP アドレスを取得できます。
oc get node ip-10-0-143-125.us-east-2.compute.internal -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}{"\n"}'
$ oc get node ip-10-0-143-125.us-east-2.compute.internal -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}{"\n"}' 10.0.143.125
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ロードバランサーのエントリーを更新します。
クラスターで管理されるロードバランサーを使用している場合、エントリーは自動的に更新されます。このロードバランサーを使用していない場合には、お使いのロードバランサーをマスターホストの現在のアドレスで更新してください。
負荷分散が AWS によって管理されている場合には、ロードバランサーのエントリーを更新する方法について、AWS ドキュメントの「Register or Deregister Targets by IP Address 」を参照してください。
etcd をフルメンバーシップに拡張します。
etcd を復元したマスターで、一時的な etcd の証明書に署名するサービスをセットアップします。
元のマスターにアクセスし、以下のコマンドを使用して
cluster-admin
ユーザーとしてクラスターにログインします。oc login https://localhost:6443
[core@ip-10-0-143-125 ~]$ oc login https://localhost:6443 Authentication required for https://localhost:6443 (openshift) Username: kubeadmin Password: Login successful.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kube-etcd-signer-server
イメージのプル仕様を取得します。export KUBE_ETCD_SIGNER_SERVER=$(sudo oc adm release info --image-for kube-etcd-signer-server --registry-config=/var/lib/kubelet/config.json)
[core@ip-10-0-143-125 ~]$ export KUBE_ETCD_SIGNER_SERVER=$(sudo oc adm release info --image-for kube-etcd-signer-server --registry-config=/var/lib/kubelet/config.json)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow tokenize-signer.sh
スクリプトを実行します。-E
フラグをsudo
に渡し、環境変数がスクリプトに適切に渡されるようにします。sudo -E /usr/local/bin/tokenize-signer.sh ip-10-0-143-125
[core@ip-10-0-143-125 ~]$ sudo -E /usr/local/bin/tokenize-signer.sh ip-10-0-143-125
1 Populating template /usr/local/share/openshift-recovery/template/kube-etcd-cert-signer.yaml.template Populating template ./assets/tmp/kube-etcd-cert-signer.yaml.stage1 Tokenized template now ready: ./assets/manifests/kube-etcd-cert-signer.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 復元したばかりの元のマスターのホスト名です。 ここに署名側のデプロイが行われる必要があります。
生成されたファイルを使用して、署名側の Pod を作成します。
oc create -f assets/manifests/kube-etcd-cert-signer.yaml
[core@ip-10-0-143-125 ~]$ oc create -f assets/manifests/kube-etcd-cert-signer.yaml pod/etcd-signer created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 署名側がこのマスターノードでリッスンしていることを確認します。
ss -ltn | grep 9943
[core@ip-10-0-143-125 ~]$ ss -ltn | grep 9943 LISTEN 0 128 *:9943 *:*
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
新規マスターホストを etcd クラスターに追加します。
新規マスターホストの 1 つにアクセスし、以下のコマンドを使用して
cluster-admin
ユーザーとしてクラスターにログインします。oc login https://localhost:6443
[core@ip-10-0-156-255 ~]$ oc login https://localhost:6443 Authentication required for https://localhost:6443 (openshift) Username: kubeadmin Password: Login successful.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd-member-recover.sh
スクリプトで必要な 2 つの環境変数をエクスポートします。export SETUP_ETCD_ENVIRONMENT=$(sudo oc adm release info --image-for setup-etcd-environment --registry-config=/var/lib/kubelet/config.json)
[core@ip-10-0-156-255 ~]$ export SETUP_ETCD_ENVIRONMENT=$(sudo oc adm release info --image-for setup-etcd-environment --registry-config=/var/lib/kubelet/config.json)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export KUBE_CLIENT_AGENT=$(sudo oc adm release info --image-for kube-client-agent --registry-config=/var/lib/kubelet/config.json)
[core@ip-10-0-156-255 ~]$ export KUBE_CLIENT_AGENT=$(sudo oc adm release info --image-for kube-client-agent --registry-config=/var/lib/kubelet/config.json)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd-member-recover.sh
スクリプトを実行します。-E
フラグをsudo
に渡し、環境変数がスクリプトに適切に渡されるようにします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 署名側のサーバーが実行されている元のマスターの IP アドレスと、新規メンバーの etcd 名の両方を指定します。
新規マスターホストが etcd メンバー一覧に追加されていることを確認します。
元のマスターにアクセスし、実行中の etcd コンテナーに接続します。
[core@ip-10-0-143-125 ~] id=$(sudo crictl ps --name etcd-member | awk 'FNR==2{ print $1}') && sudo crictl exec -it $id /bin/sh
[core@ip-10-0-143-125 ~] id=$(sudo crictl ps --name etcd-member | awk 'FNR==2{ print $1}') && sudo crictl exec -it $id /bin/sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd コンテナーで、etcd に接続するために必要な変数をエクスポートします。
export ETCDCTL_API=3 ETCDCTL_CACERT=/etc/ssl/etcd/ca.crt ETCDCTL_CERT=$(find /etc/ssl/ -name *peer*crt) ETCDCTL_KEY=$(find /etc/ssl/ -name *peer*key)
sh-4.2# export ETCDCTL_API=3 ETCDCTL_CACERT=/etc/ssl/etcd/ca.crt ETCDCTL_CERT=$(find /etc/ssl/ -name *peer*crt) ETCDCTL_KEY=$(find /etc/ssl/ -name *peer*key)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd コンテナーで、
etcdctl member list
を実行し、新規メンバーが一覧表示されていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新規メンバーが起動するまで最長 10 分の時間がかかる可能性があることに注意してください。
- これらの手順を繰り返し実行し、etcd のフルメンバーシップに達するまで他の新規マスターホストを追加します。
すべてのメンバーが復元された後に、署名側 Pod は不要になるため、これを削除します。
クラスターにアクセスできるターミナルで、以下のコマンドを実行します。
oc delete pod -n openshift-config etcd-signer
$ oc delete pod -n openshift-config etcd-signer
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
この手順の完了後、すべてのサービスを復元するまでに数分かかる場合があります。たとえば、oc login
を使用した認証は、OAuth サーバー Pod が再起動するまですぐに機能しない可能性があります。
2.3. クラスターの直前の状態への復元 リンクのコピーリンクがクリップボードにコピーされました!
クラスターを直前の状態に復元するには、スナップショットを作成して、事前に etcd データのバックアップを行っている必要があります。このスナップショットを使用して、クラスターの状態を復元します。
2.3.1. クラスターの直前の状態への復元 リンクのコピーリンクがクリップボードにコピーされました!
保存された etcd スナップショットを使用して、クラスターの以前の状態に戻すことができます。
前提条件
-
cluster-admin
ロールを持つユーザーとしてのクラスターへのアクセスがあること。 - マスターホストへの SSH アクセス。
etcd スナップショットのバックアップ。
注記クラスター内のすべてのマスターホストに同じ etcd スナップショットファイルを使用する必要があります。
手順
復元するクラスター内のそれぞれのマスターホストを準備します。
短期間でマスターホストのすべてに復元スクリプトを実行し、クラスターのメンバーがほぼ同時に起動し、クォーラム(定足数) を構成できるようにする必要がありなす。そのため、それぞれのマスターホストを別々のターミナルに分け、復元スクリプトをそれぞれに対して迅速に開始できるようにすることが推奨されます。
etcd スナップショットをマスターホストにコピーします。
この手順では、
snapshot.db
というスナップショットを、マスターホストの/home/core/
ディレクトリーにコピーしていることを前提とします。- マスターホストにアクセスします。
INITIAL_CLUSTER
変数を、<name>=<url>
形式でメンバー一覧に追加します。この変数は復元スクリプトに渡され、各メンバーに同一の変数が使用される必要があります。export INITIAL_CLUSTER="etcd-member-ip-10-0-143-125.ec2.internal=https://etcd-0.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-35-108.ec2.internal=https://etcd-1.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-10-16.ec2.internal=https://etcd-2.clustername.devcluster.openshift.com:2380"
[core@ip-10-0-143-125 ~]$ export INITIAL_CLUSTER="etcd-member-ip-10-0-143-125.ec2.internal=https://etcd-0.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-35-108.ec2.internal=https://etcd-1.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-10-16.ec2.internal=https://etcd-2.clustername.devcluster.openshift.com:2380"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これらの手順を他のマスターホストで繰り返し実行します。 その際、各マスターホストをそれぞれのターミナルで処理します。各マスターホストで同じ etcd スナップショットファイルを使用するようにしてください。
すべてのマスターホストで復元スクリプトを実行します。
最初のマスターホストで
etcd-snapshot-restore.sh
スクリプトを開始します。スナップショットファイルのパスと、INITIAL_CLUSTER
変数で定義されるメンバーの一覧の 2 つのパラメーターを渡します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 復元が開始されたら、他のマスターホストでスクリプトを実行します。
マシン設定 (Machine Config) が適用されていることを確認します。
クラスターにアクセスできるターミナルで、
cluster-admin
ユーザーとして以下のコマンドを実行します。oc get machineconfigpool
$ oc get machineconfigpool NAME CONFIG UPDATED UPDATING master rendered-master-50e7e00374e80b767fcc922bdfbc522b True False
Copy to Clipboard Copied! Toggle word wrap Toggle overflow スナップショットが適用されると、マスターの
currentConfig
は etcd スナップショットの取られた時点の ID に一致します。マスターのcurrentConfig
名はrendered-master-<currentConfig>
形式の名前になります。すべてのマスターホストが起動しており、クラスターに参加していることを確認します。
マスターホストにアクセスし、実行中の etcd コンテナーに接続します。
[core@ip-10-0-143-125 ~] id=$(sudo crictl ps --name etcd-member | awk 'FNR==2{ print $1}') && sudo crictl exec -it $id /bin/sh
[core@ip-10-0-143-125 ~] id=$(sudo crictl ps --name etcd-member | awk 'FNR==2{ print $1}') && sudo crictl exec -it $id /bin/sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd コンテナーで、etcd に接続するために必要な変数をエクスポートします。
export ETCDCTL_API=3 ETCDCTL_CACERT=/etc/ssl/etcd/ca.crt ETCDCTL_CERT=$(find /etc/ssl/ -name *peer*crt) ETCDCTL_KEY=$(find /etc/ssl/ -name *peer*key)
sh-4.2# export ETCDCTL_API=3 ETCDCTL_CACERT=/etc/ssl/etcd/ca.crt ETCDCTL_CERT=$(find /etc/ssl/ -name *peer*crt) ETCDCTL_KEY=$(find /etc/ssl/ -name *peer*key)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd コンテナーで、
etcdctl member list
を実行し、3 つのメンバーが起動済みであることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow それぞれの新規メンバーが起動するまで最長 10 分の時間がかかる可能性があることに注意してください。
2.4. コントロールプレーン証明書の期限切れの状態からのリカバリー リンクのコピーリンクがクリップボードにコピーされました!
2.4.1. コントロールプレーン証明書の期限切れの状態からのリカバリー リンクのコピーリンクがクリップボードにコピーされました!
以下の手順に従い、コントロールプレーンの証明書の期限が切れの状態からのリカバリーを実行します。
前提条件
- マスターホストへの SSH アクセス。
手順
- root ユーザーとして、証明書が期限切れになっているマスターホストにアクセスします。
リリースの
cluster-kube-apiserver-operator
イメージ参照を取得します。RELEASE_IMAGE=<release_image>
# RELEASE_IMAGE=<release_image>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<release_image>
値の例はquay.io/openshift-release-dev/ocp-release:4.1.0
になります。
KAO_IMAGE=$( oc adm release info --registry-config='/var/lib/kubelet/config.json' "${RELEASE_IMAGE}" --image-for=cluster-kube-apiserver-operator )
# KAO_IMAGE=$( oc adm release info --registry-config='/var/lib/kubelet/config.json' "${RELEASE_IMAGE}" --image-for=cluster-kube-apiserver-operator )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cluster-kube-apiserver-operator
イメージをプルします。podman pull --authfile=/var/lib/kubelet/config.json "${KAO_IMAGE}"
# podman pull --authfile=/var/lib/kubelet/config.json "${KAO_IMAGE}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow リカバリー API サーバーを作成します。
podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver create
# podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver create
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記コマンドの出力から
export KUBECONFIG
コマンドを実行します。 これはこの手順の後の部分のoc
コマンドで必要になります。export KUBECONFIG=/<path_to_recovery_kubeconfig>/admin.kubeconfig
# export KUBECONFIG=/<path_to_recovery_kubeconfig>/admin.kubeconfig
Copy to Clipboard Copied! Toggle word wrap Toggle overflow リカバリー API サーバーの起動を待機します。
until oc get namespace kube-system 2>/dev/null 1>&2; do echo 'Waiting for recovery apiserver to come up.'; sleep 1; done
# until oc get namespace kube-system 2>/dev/null 1>&2; do echo 'Waiting for recovery apiserver to come up.'; sleep 1; done
Copy to Clipboard Copied! Toggle word wrap Toggle overflow regenerate-certificates
コマンドを実行します。これは API の証明書を修正し、ローカルドライブの古い証明書を上書きし、静的 Pod を再起動して上書き内容を取得できるようにします。podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" regenerate-certificates
# podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" regenerate-certificates
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書が API で修正されたら、以下のコマンドを使用してコントロールプレーンの新規ロールアウトを強制実行します。これは、kubelet が内部ロードバランサーを使用して API サーバーに接続されているため、他のノードにも再インストールされます。
oc patch kubeapiserver cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
# oc patch kubeapiserver cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch kubecontrollermanager cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
# oc patch kubecontrollermanager cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch kubescheduler cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
# oc patch kubescheduler cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有効なユーザーとしてブートストラップ kubeconfig を作成します。
recover-kubeconfig.sh
スクリプトを実行し、出力をkubeconfig
というファイルに保存します。recover-kubeconfig.sh > kubeconfig
# recover-kubeconfig.sh > kubeconfig
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
kubeconfig
ファイルをすべてのマスターホストにコピーし、これを/etc/kubernetes/kubeconfig
に移動します。 API サーバーからの接続を検証するために使用する CA 証明書を取得します。
oc get configmap kube-apiserver-to-kubelet-client-ca -n openshift-kube-apiserver-operator --template='{{ index .data "ca-bundle.crt" }}' > /etc/kubernetes/ca.crt
# oc get configmap kube-apiserver-to-kubelet-client-ca -n openshift-kube-apiserver-operator --template='{{ index .data "ca-bundle.crt" }}' > /etc/kubernetes/ca.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
/etc/kubernetes/ca.crt
ファイルをその他すべてのマスターホストおよびノードにコピーします。 すべてのマスターホストおよびノードに
machine-config-daemon-force
ファイルを追加して、Machine Config Daemon がこの証明書の更新を受け入れるようにします。touch /run/machine-config-daemon-force
# touch /run/machine-config-daemon-force
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
すべてのマスターで kubelet を回復します。
マスターホストで、kubelet を停止します。
systemctl stop kubelet
# systemctl stop kubelet
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 古い kubelet データを削除します。
rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
# rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kubelet を再起動します。
systemctl start kubelet
# systemctl start kubelet
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 他のすべてのマスターホストでこれらの手順を繰り返し実行します。
必要な場合には、ワーカーノードで kubelet を回復します。
マスターノードの復元後、ワーカーノードはそれら自体を復元する可能性があります。これは、
oc get nodes
コマンドを実行して確認できます。ワーカーノードが一覧表示されない場合には、各ワーカーノードで以下の手順を実行します。kubelet を停止します。
systemctl stop kubelet
# systemctl stop kubelet
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 古い kubelet データを削除します。
rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
# rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kubelet を再起動します。
systemctl start kubelet
# systemctl start kubelet
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
保留状態の
node-bootstrapper
証明書署名要求 (CSR) を承認します。現在の CSR の一覧を取得します。
oc get csr
# oc get csr
Copy to Clipboard Copied! Toggle word wrap Toggle overflow CSR の詳細をレビューし、これが有効であることを確認します。
oc describe csr <csr_name>
# oc describe csr <csr_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<csr_name>
は、現行の CSR の一覧からの CSR の名前です。
それぞれの有効な CSR を承認します。
oc adm certificate approve <csr_name>
# oc adm certificate approve <csr_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保留状態のすべての
node-bootstrapper
CSR を承認するようにしてください。
リカバリー API サーバーは不要になるため、これを削除します。
podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver destroy
# podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver destroy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コントロールプレーンが再起動し、新規証明書を取得するまで待機します。これには、最長 10 分の時間がかかる可能性があります。
Legal Notice
リンクのコピーリンクがクリップボードにコピーされました!
Copyright © 2025 Red Hat
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.