9.3. オンプレミス環境での etcd のバックアップと復元
オンプレミス環境のホステッドクラスターで etcd をバックアップおよび復元して、障害を修正できます。
9.3.1. etcd をバックアップし、別の管理クラスターに復元する リンクのコピーリンクがクリップボードにコピーされました!
etcd をバックアップし、別の管理クラスターに復元することで、3 ノードクラスターの etcd メンバーにおけるデータの破損や欠落といった障害を修復できます。etcd クラスターのメンバーがデータを失ったり、CrashLoopBackOff 状態になったりした場合、このアプローチは etcd のクォーラム喪失を防ぐのに役立ちます。
前提条件
-
ocおよびjqバイナリーがインストールされている。 管理クラスターの前提条件:
-
管理クラスターに有効な
StorageClassリソースが設定されています。 -
あなたは管理クラスターへの
cluster-admin権限を持っています。 - Amazon Web Services (AWS) S3、Microsoft Azure、Google Cloud、MinIO など、OpenShift ADP クラウドストレージプロバイダーと互換性のあるオンラインストレージにアクセスできます。バックアップストレージとして S3 を使用する場合は、IAM ロールとポリシーが正しく設定されていることを確認してください。詳細は、Amazon Web Services の設定を参照してください。
- Hosted Control PlanePod はアクセス可能で、正常に機能しています。
-
CatalogSourceオブジェクトを介してopenshift-adpサブスクリプションにアクセスできます。
-
管理クラスターに有効な
ホステッドクラスターサービス公開ストラテジーの前提条件:
-
APIServerサービスには固定ホスト名が必要です。そうでない場合、復元プロセスは失敗し、ノードはクラスターに再参加できません。AWS 上の Hosted Control Plane では、APIServerサービスは固定ホスト名を使用したルートサービス公開ストラテジーも利用できます。 - 実稼働環境では、すべてのサービスに固定ホスト名を設定することを強く推奨します。ホスト名を固定することで、別の管理クラスターへの復元プロセス中に、サービスの完全な継続性と DNS の一貫性を確保できます。
-
ホステッドクラスターを別の管理クラスターに復元する場合、ホステッドクラスター内のすべてのサービスは、
servicePublishingStrategyプロパティーに固定ホスト名を設定する必要があります。この要件は、AWS、エージェント、OpenShift 仮想化、および Red Hat OpenStack Platform (RHOSP) を含むすべてのプラットフォームに適用されます。
-
ホステッドクラスターを別の管理クラスターに復元する機能は、テクノロジープレビュー版の機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
- AWS 上の Hosted Control Plane の場合、復元プロセス後に必要な修正が完了できるよう、OIDC プロバイダーの設定にアクセスできる必要があります。必要な修正を適用する方法については、以下の手順を参照してください。
-
ベアメタル上の Hosted Control Plane の場合、
InfraEnvリソースは Hosted Control Plane ネームスペースとは異なるネームスペースに配置する必要があります。バックアップまたは復元処理中に、InfraEnvリソースを削除しないでください。
ホステッドクラスターのバックアップを作成した後、データクラスター内のワークロードをバックアップし、元のホステッドクラスターを削除して、復元プロセスを開始できるようにする必要があります。
手順
環境変数を設定してください。
必要に応じて値を置き換えて次のコマンドを入力し、ホステッドクラスターの環境変数を設定します。
$ CLUSTER_NAME=my-cluster$ HOSTED_CLUSTER_NAMESPACE=clusters$ CONTROL_PLANE_NAMESPACE="${HOSTED_CLUSTER_NAMESPACE}-${CLUSTER_NAME}"必要に応じて値を置き換えて次のコマンドを入力し、ホステッドクラスターのリコンシリエーションを一時停止します。
$ oc patch -n ${HOSTED_CLUSTER_NAMESPACE} hostedclusters/${CLUSTER_NAME} \ -p '{"spec":{"pausedUntil":"true"}}' --type=merge
以下のいずれかの方法を使用して、etcd のスナップショットを取得します。
- 以前にバックアップした etcd のスナップショットを使用します。
使用可能な etcd Pod がある場合は、次の手順を実行して、アクティブな etcd Pod からスナップショットを取得します。
次のコマンドを入力して、etcd Pod をリスト表示します。
$ oc get -n ${CONTROL_PLANE_NAMESPACE} pods -l app=etcd次のコマンドを入力して、Pod データベースのスナップショットを取得し、マシンのローカルに保存します。
$ ETCD_POD=etcd-0$ oc exec -n ${CONTROL_PLANE_NAMESPACE} -c etcd -t ${ETCD_POD} -- \ env ETCDCTL_API=3 /usr/bin/etcdctl \ --cacert /etc/etcd/tls/etcd-ca/ca.crt \ --cert /etc/etcd/tls/client/etcd-client.crt \ --key /etc/etcd/tls/client/etcd-client.key \ --endpoints=https://localhost:2379 \ snapshot save /var/lib/snapshot.db次のコマンドを入力して、スナップショットが成功したことを確認します。
$ oc exec -n ${CONTROL_PLANE_NAMESPACE} -c etcd -t ${ETCD_POD} -- \ env ETCDCTL_API=3 /usr/bin/etcdctl -w table snapshot status \ /var/lib/snapshot.db
次のコマンドを入力して、スナップショットのローカルコピーを作成します。
$ oc cp -c etcd ${CONTROL_PLANE_NAMESPACE}/${ETCD_POD}:/var/lib/snapshot.db \ /tmp/etcd.snapshot.dbetcd 永続ストレージからスナップショットデータベースのコピーを作成します。
次のコマンドを入力して、etcd Pod をリスト表示します。
$ oc get -n ${CONTROL_PLANE_NAMESPACE} pods -l app=etcd実行中の Pod を検索し、その名前を
ETCD_POD: ETCD_POD=etcd-0の値として設定し、次のコマンドを入力してそのスナップショットデータベースをコピーします。$ oc cp -c etcd \ ${CONTROL_PLANE_NAMESPACE}/${ETCD_POD}:/var/lib/data/member/snap/db \ /tmp/etcd.snapshot.db
以下のコマンドを入力して、etcd ステートフルセットを縮小します。
$ oc scale -n ${CONTROL_PLANE_NAMESPACE} statefulset/etcd --replicas=0次のコマンドを入力して、2 番目と 3 番目のメンバーのボリュームを削除します。
$ oc delete -n ${CONTROL_PLANE_NAMESPACE} pvc/data-etcd-1 pvc/data-etcd-2最初の etcd メンバーのデータにアクセスする Pod を作成します。
次のコマンドを入力して、etcd イメージを取得します。
$ ETCD_IMAGE=$(oc get -n ${CONTROL_PLANE_NAMESPACE} statefulset/etcd \ -o jsonpath='{ .spec.template.spec.containers[0].image }')etcd データへのアクセスを許可する Pod を作成します。
$ cat << EOF | oc apply -n ${CONTROL_PLANE_NAMESPACE} -f - apiVersion: apps/v1 kind: Deployment metadata: name: etcd-data spec: replicas: 1 selector: matchLabels: app: etcd-data template: metadata: labels: app: etcd-data spec: containers: - name: access image: $ETCD_IMAGE volumeMounts: - name: data mountPath: /var/lib command: - /usr/bin/bash args: - -c - |- while true; do sleep 1000 done volumes: - name: data persistentVolumeClaim: claimName: data-etcd-0 EOF次のコマンドを入力して、
etcd-dataPod のステータスを確認し、実行されるまで待ちます。$ oc get -n ${CONTROL_PLANE_NAMESPACE} pods -l app=etcd-data次のコマンドを入力して、
etcd-dataPod の名前を取得します。$ DATA_POD=$(oc get -n ${CONTROL_PLANE_NAMESPACE} pods --no-headers \ -l app=etcd-data -o name | cut -d/ -f2)
次のコマンドを入力して、etcd スナップショットを Pod にコピーします。
$ oc cp /tmp/etcd.snapshot.db \ ${CONTROL_PLANE_NAMESPACE}/${DATA_POD}:/var/lib/restored.snap.db次のコマンドを入力して、
etcd-dataPod から古いデータを削除します。$ oc exec -n ${CONTROL_PLANE_NAMESPACE} ${DATA_POD} -- rm -rf /var/lib/data$ oc exec -n ${CONTROL_PLANE_NAMESPACE} ${DATA_POD} -- mkdir -p /var/lib/data次のコマンドを入力して、etcd スナップショットを復元します。
$ oc exec -n ${CONTROL_PLANE_NAMESPACE} ${DATA_POD} -- \ etcdutl snapshot restore /var/lib/restored.snap.db \ --data-dir=/var/lib/data --skip-hash-check \ --name etcd-0 \ --initial-cluster-token=etcd-cluster \ --initial-cluster etcd-0=https://etcd-0.etcd-discovery.${CONTROL_PLANE_NAMESPACE}.svc:2380,etcd-1=https://etcd-1.etcd-discovery.${CONTROL_PLANE_NAMESPACE}.svc:2380,etcd-2=https://etcd-2.etcd-discovery.${CONTROL_PLANE_NAMESPACE}.svc:2380 \ --initial-advertise-peer-urls https://etcd-0.etcd-discovery.${CONTROL_PLANE_NAMESPACE}.svc:2380次のコマンドを入力して、Pod から一時的な etcd スナップショットを削除します。
$ oc exec -n ${CONTROL_PLANE_NAMESPACE} ${DATA_POD} -- \ rm /var/lib/restored.snap.db次のコマンドを入力して、データアクセスデプロイメントを削除します。
$ oc delete -n ${CONTROL_PLANE_NAMESPACE} deployment/etcd-data次のコマンドを入力して、etcd クラスターをスケールアップします。
$ oc scale -n ${CONTROL_PLANE_NAMESPACE} statefulset/etcd --replicas=3次のコマンドを入力して、etcd メンバー Pod が返され、使用可能であると報告されるのを待ちます。
$ oc get -n ${CONTROL_PLANE_NAMESPACE} pods -l app=etcd -w
次のコマンドを入力して、ホステッドクラスターのリコンシリエーションを復元します。
$ oc patch -n ${HOSTED_CLUSTER_NAMESPACE} hostedclusters/${CLUSTER_NAME} \ -p '{"spec":{"pausedUntil":"null"}}' --type=merge次のコマンドを入力して、ホステッドクラスターを手動でロールアウトします。
$ oc annotate hostedcluster -n \ <hosted_cluster_namespace> <hosted_cluster_name> \ hypershift.openshift.io/restart-date=$(date --iso-8601=seconds)この時点では、Multus アドミッションコントローラーとネットワークノードアイデンティティー Pod はまだ起動しません。
次のコマンドを入力して、etcd の 2 番目と 3 番目のメンバーの Pod とその PVC を削除します。
$ oc delete -n ${CONTROL_PLANE_NAMESPACE} pvc/data-etcd-1 pod/etcd-1 --wait=false$ oc delete -n ${CONTROL_PLANE_NAMESPACE} pvc/data-etcd-2 pod/etcd-2 --wait=false次のコマンドを入力して、ホステッドクラスターを手動で再度ロールアウトします。
$ oc annotate hostedcluster -n \ <hosted_cluster_namespace> <hosted_cluster_name> \ hypershift.openshift.io/restart-date=$(date --iso-8601=seconds) \ --overwrite数分後、コントロールプレーン Pod が稼働します。
ホステッドクラスターが AWS 上にあり、復元プロセス後に OIDC の修正を適用する必要がある場合は、次のコマンドを入力してください。
$ hcp fix dr-oidc-iam --hc-name <hosted_cluster_name> --hc-namespace <hosted_cluster_namespace> --aws-creds ~/.aws/credentials[4:48 AM]このコマンドは、OIDC が削除された場合に、S3 内の OIDC を再生成します。