このページでは、Anthos プライベート モードで作成されたクラスタのバックアップと復元の方法について説明します。以下の手順は、Anthos プライベート モードでサポートされるすべてのクラスタタイプに適用されます。
クラスタをバックアップする
バックアップ プロセスは 2 つの部分で構成されています。まず、etcd ストアからスナップショットを作成します。次に、関連する PKI 証明書が tar ファイルに保存されます。etcd ストアはすべてのクラスタデータの Kubernetes のバックアップ保存先で、クラスタの状態の管理に必要なすべての Kubernetes オブジェクトとカスタム オブジェクトを格納します。PKI 証明書は TLS 上の認証に使用されます。このデータは、クラスタのコントロール プレーンまたは高可用性(HA)向けのコントロール プレーンの 1 つからバックアップされます。
スナップショット データを比較的最新の状態に保つために、クラスタを定期的にバックアップすることをおすすめします。バックアップの頻度は、クラスタに大きな変更が発生する頻度によって異なります。
etcd ストアのスナップショットを作成する
Anthos のプライベート モードでは、kube-system Namespace 内の etcd-CONTROL_PLANE_NAME
という名前の Pod が、そのコントロール プレーンの etcd を実行します。クラスタの etcd ストアをバックアップするには、管理ワークステーションから次の手順を行います。
kubectl get po
を使用して、etcd Pod を識別します。kubectl --kubeconfig CLUSTER_KUBECONFIG get po -n kube-system \ -l 'component=etcd,tier=control-plane'
レスポンスには、etcd Pod 名とステータスが含まれます。
kubectl describe pod
を使用して、etcd Pod で実行されているコンテナ(etcd コンテナを含む)を確認します。kubectl --kubeconfig CLUSTER_KUBECONFIG describe pod ETCD_POD_NAME -n kube-system
etcd コンテナで Bash シェルを実行します。
kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it \ ETCD_POD_NAME --container etcd --namespace kube-system \ -- bin/sh
etcd コンテナ内のシェルから、
etcdctl
(API のバージョン 3)を使用して、etcd ストアのスナップショットであるsnapshot.db
を保存します。ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \ snapshot save snapshotDATESTAMP.db
DATESTAMP を現在の日付に置き換えて、後続のスナップショットが上書きされないようにします。
コンテナでシェルを終了し、次のコマンドを実行して、スナップショット ファイルを管理ワークステーションにコピーします。
kubectl --kubeconfig CLUSTER_KUBECONFIG cp \ kube-system/ETCD_POD_NAME:snapshot.db \ --container etcd snapshot.db
スナップショット ファイルをクラスタの外部に存在し、クラスタのオペレーションに依存しない場所に保存してください。
PKI 証明書をアーカイブする
バックアップ対象の証明書は、コントロール プレーンの /etc/kubernetes/pki
ディレクトリにあります。コントロール プレーンが完全にダウンしたときにクラスタを復元するには、PIK 証明書と一緒に etcd ストアの snapshot.db
ファイルが必要です。次のステップでは、PKI 証明書を含む tar ファイルを作成します。
ssh
を使用して、クラスタのコントロール プレーンに root として接続します。ssh root@CONTROL_PLANE_NAME
コントロール プレーンで、
/etc/kubernetes/pki
ディレクトリの内容を含む tar ファイルcerts_backup.tar.gz
を作成します。tar -czvf certs_backup.tar.gz -C /etc/kubernetes/pki .
コントロール プレーン内から tar ファイルの作成を行うと、すべての証明書ファイルの権限が保持されます。
コントロール プレーンを終了し、ワークステーションで証明書を含む tar ファイルをワークステーションの任意の場所にコピーします。
sudo scp root@CONTROL_PLANE_NAME:certs_backup.tar.gz BACKUP_PATH
クラスタを復元する
バックアップからのクラスタの復元は最後の手段です。クラスタにおいて重大な障害が発生したため、他の方法ではサービスに戻ることができない場合に使用する必要があります。たとえば、etcd データが破損している、etcd Pod がクラッシュ ループの状態にある場合に使用します。
クラスタの復元プロセスは 2 つの部分で構成されています。まず、PKI 証明書がコントロール プレーンに復元されます。その後、etcd ストアのデータが復元されます。
PKI 証明書を復元する
PKI 証明書をアーカイブするの説明に沿って PKI 証明書をバックアップしたことを前提として、次の手順では、tar ファイルからコントロール プレーンに証明書を復元する方法について説明します。
PKI 証明書の tar ファイル
certs_backup.tar.gz
をワークステーションからクラスタのコントロール プレーンにコピーします。sudo scp -r BACKUP_PATH/certs_backup.tar.gz root@CONTROL_PLANE_NAME:~/
ssh
を使用して、クラスタのコントロール プレーンに root として接続します。ssh root@CONTROL_PLANE_NAME
コントロール プレーンから、
/etc/kubernetes/pki
ディレクトリに tar ファイルの内容を抽出します。tar -xzvf certs_backup.tar.gz -C /etc/kubernetes/pki/
コントロール プレーンを終了します。
etcd ストアを復元する
etcd ストアを復元する場合、このプロセスは、クラスタが高可用性(HA)モードで実行されているかどうかによって異なります。HA モードで実行されている場合は、クォーラムが保持されているかどうかによって異なります。特定のクラスタ障害が発生した場合は、次のガイドを使用して etcd ストアを復元してください。
失敗したクラスタが HA モードで実行されていない場合は、次の手順に沿ってコントロール プレーンの etcd ストアを復元します。
クラスタが HA モードで実行されており、クォーラムが保持されている場合は何も操作しません。クォーラムが保持されている限り、障害が発生したクラスタを復元する必要はありません。
クラスタが HA モードで動作している際にクォーラムを失った場合は、次の手順を繰り返して、障害が発生したメンバーごとに etcd ストアを復元してください。
ワークステーションでコントロール プレーンの etcd ストアを削除して復元するには、以下の手順に沿って操作します。
コントロール プレーンのルート ディレクトリに
/backup
ディレクトリを作成します。ssh root@CONTROL_PLANE_NAME "mkdir /backup"
このステップは厳密に必須ではありませんが、行っていただくことをおすすめします。次の手順では、
/backup
ディレクトリを作成済みであることを前提としています。etcd スナップショット ファイル
snapshot.db
をワークステーションからクラスタ コントロール プレーンのbackup
ディレクトリにコピーします。sudo scp snapshot.db root@CONTROL_PLANE_NAME:/backup
マニフェスト ファイルを
/etc/kubernetes/manifests
ディレクトリから/backup
ディレクトリに移動して、etcd と kube-apiserver の静的 Pod を停止します。sudo mv /etc/kubernetes/manifests/etcd.yaml /backup/etcd.yaml sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /backup/kube-apiserver.yaml
etcd データ ディレクトリを削除します。
rm -rf /var/lib/etcd/
docker
を使用してetcdctl
のスナップショットの復元を実行します。sudo docker run --rm -t \ -v /var/lib:/var/lib \ -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \ -v /backup:/backup \ --env ETCDCTL_API=3 \ k8s.gcr.io/etcd:3.2.24 etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --data-dir=/var/lib/etcd \ --name=CONTROL_PLANE_NAME \ --initial-advertise-peer-urls=https://CONTROL_PLANE_IP:2380 \ --initial-cluster=CONTROL_PLANE_NAME=https://CONTROL_PLANE_IP:2380 \ snapshot restore /backup/snapshot.db
--name
、--initial-advertise-peer-urls
、--initial-cluster
のエントリは、/backup
ディレクトリに移動されたetcd.yaml
マニフェスト ファイルにあります。/var/lib/etcd
が再作成され、新しいメンバーが/var/lib/etcd/member
に作成されていることを確認します。静的 Pod が再起動できるように、etcd および kube-apiserver マニフェストを
/manifests
ディレクトリに戻します。sudo mv /backup/etcd.yaml /etc/kubernetes/manifests/etcd.yaml sudo mv /backup/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
etcdctl
を使用して、追加したメンバーが正常に機能していることを確認します。ETCDCTL_API=3 etcdctl --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --endpoints=CONTROL_PLANE_IP:2379 \ endpoint health
エラーが発生した複数のメンバーを復元する場合は、エラーが発生したメンバーをすべて復元したら、「--endpoints」フィールドにすべての復元済みメンバーのコントロール プレーンの IP アドレスを指定してコマンドを実行します。
例:
ETCDCTL_API=3 etcdctl --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --endpoints=10.200.0.3:2379,10.200.0.4:2379,10.200.0.5:2379 \ endpoint health
各エンドポイントで成功した場合は、クラスタは適切に機能しています。