このドキュメントでは、VMware 用 Google Distributed Cloud(ソフトウェアのみ)で作成されたユーザー クラスタの etcd ストアをバックアップして復元する方法について説明します。このページでは、クラスタの etcd ストアを自動的にバックアップするために使用できるスクリプトも示します。
クラスタの etcd のデータに損害を与える可能性がある想定外の災害からの復旧用のバックアップを作成する必要があります。バックアップ ファイルは、クラスタの外部にあり、クラスタのオペレーションに依存しない場所に保存してください。
制限事項
この手順では、アプリケーション固有のデータはバックアップされません。
この手順では、PersistentVolume はバックアップされません。
バックアップの作成後にスケジュールされたワークロードは、そのバックアップでは復元されません。
アップグレードに失敗したクラスタは復元できません。
この手順は、削除されたクラスタを復元することを想定したものではありません。
制限事項の詳細については、インフラストラクチャの非互換性をご覧ください。
ユーザー クラスタのバックアップ
ユーザー クラスタのバックアップは、ユーザー クラスタの etcd ストアのスナップショットです。etcd ストアには、クラスタの状態の管理に必要なすべての Kubernetes オブジェクトとカスタム オブジェクトが含まれています。スナップショットには、クラスタのコンポーネントとワークロードを再作成するために必要なデータが含まれています。
行うバックアップ手順は、ユーザー クラスタで Controlplane V2 が有効になっているかどうかによって異なります。Controlplane V2 が有効になっている場合、ユーザー クラスタのコントロール プレーンはユーザー クラスタ自体で実行されます。Controlplane V2 が有効になっていない場合、ユーザー クラスタのコントロール プレーンは管理クラスタ内の 1 つ以上のノードで実行されます(kubeception と呼ばれます)。
次のコマンドを実行して、クラスタで Controlplane V2 が有効になっているかどうかを確認します。
kubectl get onpremuserclusters --kubeconfig USER_CLUSTER_KUBECONFIG \ -n kube-system -o jsonpath='{.items[0].spec.enableControlplaneV2}' && echo
出力が true
の場合は、Controlplane V2 の手順に沿ってクラスタをバックアップします。それ以外の場合は、Kubeception の手順に沿って操作します。
kubeception
kube-etcd
コンテナでシェルを起動します。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \ kube-etcd-0 -c kube-etcd -n USER_CLUSTER_NAME \ -- /bin/sh
ここで
- ADMIN_CLUSTER_KUBECONFIG は、管理クラスタの kubeconfig ファイルです。
- USER_CLUSTER_NAME は、ユーザー クラスタの名前です。
シェルの
/tmp
ディレクトリに、snapshot.db
という名前のバックアップを作成します。ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etcd.local.config/certificates/etcdCA.crt \ --cert=/etcd.local.config/certificates/etcd.crt \ --key=/etcd.local.config/certificates/etcd.key \ snapshot save /tmp/snapshot.db
シェルで「
exit
」と入力してシェルを終了します。/tmp/snapshot.db
をkube-etcd
コンテナから現在のディレクトリにコピーします。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp \ USER_CLUSTER_NAME/kube-etcd-0:/tmp/snapshot.db \ --container kube-etcd snapshot.db
Controlplane V2
etcd Pod の名前を取得します。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods \ -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
ここで
- USER_CLUSTER_KUBECONFIG は、ユーザー クラスタの kubeconfig ファイルです。
例:
NAME READY STATUS RESTARTS AGE etcd-uc1-cp1 1/1 Running 0 38m etcd-uc1-cp2 1/1 Running 0 37m etcd-uc1-cp3 1/1 Running 0 38m
複数の
etcd
Pod が存在する場合があります(たとえば、HA クラスタに 3 つ)。バックアップでは、任意のetcd
Pod が機能します。etcd
コンテナでシェルを起動します。kubectl --kubeconfig USER_CLUSTER_KUBECONFIG exec -it \ POD_NAME -c etcd -n kube-system -- /bin/sh
ここで
- POD_NAME は、前のステップで取得した etcd Pod の名前です。
シェルで、
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/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /tmp/snapshot.db
シェルで「
exit
」と入力してシェルを終了します。snapshot.db
をetcd
コンテナからワークステーションのホーム ディレクトリにコピーします。kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ cp POD_NAME:/tmp/snapshot.db ~/snapshot.db \ -c etcd -n kube-system
PKI ディレクトリから Secret をコピーします。
ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP sudo chmod -R 0644 /etc/kubernetes/pki/* sudo chmod 0755 /etc/kubernetes/pki/etcd exit scp -ri NODE_NAME.key ubuntu@NODE_EXTERNAL_IP:/etc/kubernetes/pki ~/pki_NODE_NAME
ここで
- NODE_NAME は、コントロール プレーン ノードの SSH 認証鍵を含むファイルです。
- NODE_EXTERNAL_IP は、Secret のコピー元となるユーザー コントロール プレーン ノードの IP アドレスです。
ユーザー クラスタをバックアップから復元する(非 HA)
バックアップ ファイルを使用してユーザー クラスタの etcd ストアを復元する前に、クラスタを診断して既存の問題を解決します。バックアップを使用して問題のあるクラスタを復元すると、問題の再発や悪化のおそれがあります。クラスタの復元について詳しくは、Google Cloud サポートチームにお問い合わせください。
次の手順では、クラスタの etcd データが破損し、ユーザー クラスタの etcd Pod がクラッシュ ループした場合に、バックアップ ファイルを使用してユーザー クラスタを復元する方法について説明します。
kubeception
破損したデータをバックアップで上書きするユーティリティ Pod をデプロイすることで、etcd データを復元できます。管理クラスタの API サーバーが実行されている必要があり、管理クラスタのスケジューラが新しい Pod をスケジューリングできる必要があります。
ユーザー クラスタで etcd によって使用される Secret の名前を確認します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME \ get secrets | grep kube-etcd-certs
次の Pod マニフェストを
etcd-utility.yaml
という名前のファイルにコピーします。次のように置き換えます。NODE_NAME
:kube-etcd-0
Pod が実行されているノード。ADMIN_CLUSTER_KUBECONFIG
: 管理クラスタの kubeconfig ファイル。USER_CLUSTER_NAME
: ユーザー クラスタの名前。GKE_ON_PREM_VERSION
: etcd 復元を実行するクラスタのバージョン(1.5.0-gke.0 など)。KUBE_ETCD_SECRET_NAME
: ユーザー クラスタで etcd によって使用される Secret の名前(kube-etcd-certs
から始まる)。
apiVersion: v1 kind: Pod metadata: name: etcd-utility-0 namespace: USER_CLUSTER_NAME spec: containers: - command: ["/bin/sh"] args: ["-ec", "while :; do echo '.'; sleep 5 ; done"] image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION name: etcd-utility volumeMounts: - mountPath: /var/lib/etcd name: data - mountPath: /etcd.local.config/certificates name: etcd-certs nodeSelector: kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME kubernetes.io/hostname: NODE_NAME tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 - effect: NoSchedule key: node.kubernetes.io/unschedulable operator: Exists volumes: - name: data persistentVolumeClaim: claimName: data-kube-etcd-0 - name: etcd-certs secret: defaultMode: 420 secretName: KUBE_ETCD_SECRET_NAME
ユーティリティ Pod をデプロイします。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ create -f etcd-utility.yaml --namespace USER_CLUSTER_NAME
snapshot.db
を現在のディレクトリからユーティリティ Pod のルート ディレクトリにコピーします。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp snapshot.db \ USER_CLUSTER_NAME/etcd-utility-0:snapshot.db --container etcd-utility
etcd-utility
コンテナでシェルを起動します。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec it \ etcd-utility-0 --container etcd-utility --namespace USER_CLUSTER_NAME \ -- bin/sh
シェルのルート ディレクトリで、次のコマンドを実行して、バックアップを格納する新しいフォルダを作成します。
ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etcd.local.config/certificates/etcdCA.crt \ --cert=/etcd.local.config/certificates/etcd.crt \ --key=/etcd.local.config/certificates/etcd.key \ snapshot restore snapshot.db
シェルで、古い etcd データを削除します。
rm -r var/lib/etcd/*
シェルで、復元された etcd データを永続的な場所にコピーします。
cp -r default.etcd/* var/lib/etcd/
シェルで「
exit
」と入力してシェルを終了します。クラッシュした etcd Pod を削除します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ delete pod kube-etcd-0 --namespace USER_CLUSTER_NAME
etcd Pod がクラッシュしていないことを確認します。
ユーティリティ Pod を削除します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ delete pod etcd-utility-0 --namespace USER_CLUSTER_NAME
現在のディレクトリから
etcd-utility.yaml
を削除します。rm etcd-utility.yaml
Controlplane V2
破損したデータをバックアップで上書きする一時的な etcd コンテナをデプロイすると、etcd
データを 1 つずつ復元できます。
ユーザー コントロール プレーンノードでシェルを起動します。
ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
シェルで、Kubernetes API サーバーと etcd サーバーを停止します。
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
シェルで「
exit
」と入力してシェルを終了します。scp
を実行して、バックアップ ファイルsnapshot.db
と Secret をユーザー コントロール プレーン ノードにコピーします。scp -i NODE_NAME.key ~/snapshot.db ubuntu@NODE_EXTERNAL_IP:/tmp/
chmod a+rw pki/ scp -ri NODE_NAME.key ~/pki_NODE_NAME ubuntu@NODE_EXTERNAL_IP:/etc/kubernetes/pki
シェルで、
snapshot.db
を使用して etcd データを復元します。sudo docker run --rm -t \ -v /opt/data/var/lib:/var/lib \ -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \ -v /tmp:/tmp \ --env ETCDCTL_API=3 \ gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --data-dir=/opt/data/var/lib/etcd \ --name=NODE_NAME \ --initial-advertise-peer-urls=https://NODE_IP_ADDRESS:2380 \ --initial-cluster=NODE_NAME=https://NODE_IP_ADDRESS:2380 \ snapshot restore /tmp/snapshot.db
ここで
GKE_ON_PREM_VERSION
は、イメージタグとして使用される GKE Enterprise のバージョンです。NODE_NAME
は、復元が実行されているノードの名前です。NODE_IP_ADDRESS
は、当該ノードの IP です。
etcd マニフェスト ファイルのコンテナ コマンドの下にフラグ
- --initial-cluster-state=new
を追加します。例:
containers: - command: - etcd ... - --initial-cluster-state=new ...
シェルで kube-apiserver サーバーと etcd サーバーを起動します。
sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
シェルで「
exit
」と入力してシェルを終了します。
ユーザー クラスタをバックアップから復元する(HA)
kubeception
このセクションでは、高可用性(HA)ユーザー クラスタの etcd データを復元する方法について説明します。
HA ユーザー クラスタの場合、ユーザー クラスタのコントロール プレーンとして機能する 3 つのノードが管理クラスタにあります。これらの各ノードでは、ストレージ ボリュームで etcd データを維持する etcd Pod が実行されます。
etcd Pod のうち 2 つが正常で、関連するストレージ ボリュームのデータに問題がない場合、バックアップ ファイルを使用する必要はありません。これは、まだ etcd クォーラムがあるためです。
まれに、2 つの etcd ストレージ ボリュームでデータが破損している場合は、バックアップ ファイルを使用して、etcd データを復元する必要があります。
このセクションの手順を行うには、ユーザー クラスタのバックアップの説明に従って、snapshot.db
ファイルを作成しておく必要があります。
etcd Pod とノードの一覧表示
ユーザー クラスタの etcd ストアを管理する etcd Pod を一覧表示します。これらの Pod は管理クラスタで実行されます。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \ --output wide | grep kube-etcd
出力には、etcd Pod、および Pod が実行されるノードが表示されます。出力に表示されるノードは、ユーザー クラスタのコントロール プレーンとして機能する管理クラスタ内のノードです。
NAME ... NODE kube-etcd-0 ... xxx kube-etcd-1 ... yyy kube-etcd-2 ... zzz
後で使用できるように、Pod 名とコントロール プレーンのノード名をメモしておきます。
各 etcd Pod には、番号が付加された
kube-etcd
という名前が付けられます。この番号は、Pod のメンバー番号と呼ばれます。これは、Pod が、ユーザー クラスタのオブジェクト データを保持する etcd クラスタの特定のメンバーであることを識別します。このガイドでは、プレースホルダ MEMBER_NUMBER を使用して、etcd Pod のメンバー番号を参照します。また、etcd クラスタ内の各 Pod はそれぞれのノードで実行されます。
ユーティリティ Pod のデプロイを準備する
ユーザー クラスタの Kubernetes API サーバー用の PodDisruptionBudget(PDB)のマニフェストを保存します。次に、PDB を削除します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG get pdb --namespace USER_CLUSTER_NAME \ kube-apiserver-pdb --output yaml > kube-apiserver-pdb.yaml kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pdb --namespace USER_CLUSTER_NAME \ kube-apiserver-pdb
Kubernetes API サーバーと etcd メンテナンス Deployment を停止します。これにより、復元中に etcd を使用するコンポーネントはなくなります。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG --namespace USER_CLUSTER_NAME \ scale --replicas 0 statefulset kube-apiserver kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG --namespace USER_CLUSTER_NAME \ scale --replicas 0 deployment gke-master-etcd-maintenance
etcd Pod のコンテナ イメージの名前を確認します。
ユーティリティ Pod のデプロイ
etcd Pod の名前と Pod が実行されるノードの名前を確認します。
現在のディレクトリの次の Pod マニフェストを、
etcd-utility-MEMBER_NUMBER.yaml
という名前のファイルに保存します。
apiVersion: v1 kind: Pod metadata: name: etcd-utility-MEMBER_NUMBER namespace: USER_CLUSTER_NAME spec: containers: - command: ["/bin/sh"] args: ["-ec", "while :; do echo '.'; sleep 5 ; done"] image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION name: etcd-utility volumeMounts: - mountPath: /var/lib/etcd name: data - mountPath: /etcd.local.config/certificates name: etcd-certs nodeSelector: kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME kubernetes.io/hostname: NODE_NAME tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 - effect: NoSchedule key: node.kubernetes.io/unschedulable operator: Exists volumes: - name: data persistentVolumeClaim: claimName: data-kube-etcd-MEMBER_NUMBER - name: etcd-certs secret: defaultMode: 420 secretName: KUBE_ETCD_SECRET_NAME
上記のマニフェストでは、etcd データを復元するために一時的に実行するユーティリティ Pod について説明しています。
管理クラスタでユーティリティ Pod を作成します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
バックアップ ファイル
snapshot.db
をユーティリティ Pod のルート ディレクトリにコピーします。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG cp snapshot.db \ USER_CLUSTER_NAME/etcd-utility-MEMBER_NUMBER:snapshot.db
ユーティリティ Pod の
etcd-utility
コンテナでシェルを起動します。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG exec -it --namespace USER_CLUSTER_NAME \ etcd-utility-MEMBER_NUMBER --container etcd-utility -- bin/sh
シェルのルート ディレクトリで、
snapshot.db
を使用して etcd データを復元します。ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etcd.local.config/certificates/etcdCA.crt \ --cert=/etcd.local.config/certificates/etcd.crt \ --key=/etcd.local.config/certificates/etcd.key \ --name=kube-etcd-MEMBER_NUMBER \ --initial-cluster=kube-etcd-0=https://kube-etcd-0.kube-etcd:2380,kube-etcd-1=https://kube-etcd-1.kube-etcd:2380,kube-etcd-2=https://kube-etcd-2.kube-etcd:2380 \ --initial-cluster-token=etcd-cluster-1 \ --initial-advertise-peer-urls=https://kube-etcd-MEMBER_NUMBER.kube-etcd:2380 \ snapshot restore snapshot.db
上記のコマンドにより、etcd データを
/kube-etcd-MEMBER_NUMBER.etcd
ディレクトリに保存しました。シェルで、古い etcd データを削除します。
rm -r var/lib/etcd/*
シェルで、復元された etcd データを永続的な場所にコピーします。
cp -r kube-etcd-MEMBER_NUMBER.etcd/* var/lib/etcd/
シェルで、etcd ディレクトリとバックアップ ファイルを削除します。
rm -R kube-etcd-MEMBER_NUMBER.etcd/ rm snapshot.db
シェルで「
exit
」と入力してシェルを終了します。ユーティリティ Pod を削除します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pod \ --namespace USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
コンポーネントの再起動
ユーティリティ Pod をデプロイして削除したので、クラスタ コンポーネントを再起動する必要があります。
kube-etcd
StatefulSet で Pod を再起動します。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG rollout restart statefulset \ --namespace USER_CLUSTER_NAME kube-etcd
ユーザー クラスタの Kubernetes API サーバーを起動します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale statefulset --replicas 3 \ --namespace USER_CLUSTER_NAME kube-apiserver
ユーザー クラスタの etcd メンテナンス Deployment を開始します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale deployment --replicas 1 \ --namespace=USER_CLUSTER_NAME gke-master-etcd-maintenance
Kubernetes API サーバーの PDB を復元します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG apply -f kube-apiserver-pdb.yaml
Controlplane V2
このセクションでは、高可用性(HA)ユーザー クラスタの etcd データを復元する方法について説明します。
HA ユーザー クラスタの場合、ユーザー クラスタのコントロール プレーンとして機能する 3 つのノードがユーザー クラスタにあります。これらの各ノードでは、ストレージ ボリュームで etcd データを維持する etcd Pod が実行されます。
etcd Pod のうち 2 つが正常で、関連するストレージ ボリュームのデータに問題がない場合、バックアップ ファイルを使用する必要はありません。これは、まだ etcd クォーラムがあるためです。
まれに、2 つの etcd ストレージ ボリュームでデータが破損している場合は、バックアップ ファイルを使用して、etcd データを復元する必要があります。
このセクションの手順を行うには、ユーザー クラスタのバックアップの説明に従って、snapshot.db
ファイルを作成しておく必要があります。
etcd Pod とノードの一覧表示
etcd Pod とそれぞれのノードを一覧取得します。
kubectl get pod --kubeconfig USER_CLUSTER_KUBECONFIG \ -n kube-system -l component=etcd,tier=control-plane -o wide
出力には、etcd Pod、および Pod が実行されるノードが表示されます。出力に表示されるノードは、ユーザー クラスタのコントロール プレーンとして機能する管理クラスタ内のノードです。
NAME ... NODE etcd-xxx ... xxx etcd-yyy ... yyy etcd-zzz ... zzz
後で使用できるように、Pod 名とコントロール プレーンのノード名をメモしておきます。
各 etcd Pod には、ノード名が付加された
etcd-xxx
という名前が付けられます。これは、Controlplane V2 で etcd Pod が静的 Pod として実行されるためです。
復元の準備
scp
を実行して、バックアップ ファイルsnapshot.db
をすべてのユーザー コントロール プレーン ノードにコピーします。scp -i NODE_NAME.key ~/snapshot.db ubuntu@NODE_EXTERNAL_IP:/tmp/
Secret をそれぞれのユーザー コントロール プレーン ノードにコピーします。
chmod a+rw ~/pki_* scp -ri NODE_NAME.key ~/pki_NODE_NAME/* ubuntu@NODE_EXTERNAL_IP:/opt/data/etc/kubernetes/pki/
ユーザー コントロール プレーンノードでシェルを起動します。
ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
復元の実施
etcd Pod の名前と Pod が実行されるノードの名前を確認します。
シェルで、すべてのユーザー コントロール プレーン ノードの Kubernetes API サーバーと etcd サーバーを停止します。
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
シェルで、
snapshot.db
を使用して、すべてのユーザー コントロール プレーン ノードの etcd データを復元します。sudo docker run --rm -t \ -v /opt/data/var/lib:/var/lib \ -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \ -v /tmp:/tmp \ --env ETCDCTL_API=3 \ gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --data-dir=/opt/data/var/lib/etcd \ --name=NODE_NAME \ --initial-advertise-peer-urls=https://NODE_IP_ADDRESS:2380 \ --initial-cluster=NODE1=https://NODE1_IP:2380,NODE2=https://NODE2_IP:2380,NODE3=https://NODE3_IP:2380 \ snapshot restore /tmp/snapshot.db
ここで
GKE_ON_PREM_VERSION
は、イメージタグとして使用される GKE Enterprise のバージョンです。NODE_NAME
は、復元が実行されているノードの名前です。NODE_IP_ADDRESS
は、当該ノードの IP です。--initial-cluster
フラグで、該当するノードのNODE1
、NODE2
、NODE3
、IP
を設定します。etcd マニフェストから取得することもできます。
etcd マニフェスト ファイルのコンテナ コマンドの下にフラグ
- --initial-cluster-state=existing
を追加します。例:
containers: - command: - etcd ... - --initial-cluster-state=existing ...
コンポーネントの再起動
シェルで、すべてのユーザー コントロール プレーン ノードの
kube-apiserver
サーバーとetcd
サーバーを起動します。sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
シェルで「
exit
」と入力してシェルを終了します。kube-apiserver
とetcd
がすべてのユーザー コントロール プレーン ノードで実行されていることを確認します。kubectl get pod --kubeconfig USER_CLUSTER_KUBECONFIG \ -n kube-system -l tier=control-plane
クラスタの自動バックアップ
クラスタを自動的にバックアップする方法の例として、以下に示すスクリプトを使用できます。以下のスクリプトはサポートされていないため、より適切で堅牢であり、完全なスクリプトを記述するための参照としてのみ使用してください。スクリプトを実行する前に、スクリプトの先頭にある 5 つの変数の値を入力します。
kubeception
BACKUP_DIR
を、管理クラスタとユーザー クラスタのバックアップを保存するパスに設定します。このパスは存在しません。ADMIN_CLUSTER_KUBECONFIG
を管理クラスタの kubeconfig ファイルのパスに設定します。USER_CLUSTER_NAMESPACE
をユーザー クラスタの名前に設定します。ユーザー クラスタの名前は管理クラスタ内の Namespace です。EXTERNAL_IP
を管理コントロール プレーン サービス用に予約した VIP に設定します。SSH_PRIVATE_KEY
を SSH 認証鍵のパスに設定します。- プライベート ネットワークを使用している場合は、ネットワークの踏み台サーバーの IP アドレスに
JUMP_IP
を設定します。
#!/usr/bin/env bash # Automates manual steps for taking backups of user and admin clusters. # Fill in the variables below before running the script. BACKUP_DIR="" # path to store user and admin cluster backups ADMIN_CLUSTER_KUBECONFIG="" # path to admin cluster kubeconfig USER_CLUSTER_NAMESPACE="" # user cluster namespace EXTERNAL_IP="" # admin control plane node external ip - follow steps in documentation SSH_PRIVATE_KEY="" # path to vsphere_tmp ssh private key - follow steps in documentation JUMP_IP="" # network jump server IP - leave empty string if not using private network. mkdir -p $BACKUP_DIR mkdir $BACKUP_DIR/pki # USER CLUSTER BACKUP # Snapshot user cluster etcd kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n ${USER_CLUSTER_NAMESPACE} kube-etcd-0 -c kube-etcd -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key snapshot save ${USER_CLUSTER_NAMESPACE}_snapshot.db" kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:${USER_CLUSTER_NAMESPACE}_snapshot.db $BACKUP_DIR/user-cluster_${USER_CLUSTER_NAMESPACE}_snapshot.db # ADMIN CLUSTER BACKUP # Set up ssh options SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY}) if [ "${JUMP_IP}" != "" ]; then SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}") fi # Copy admin certs ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R +rw /etc/kubernetes/pki/*' scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/ # Snapshot admin cluster etcd admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}') kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export 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 admin_snapshot.db" kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db
Controlplane V2
BACKUP_DIR
を、管理クラスタとユーザー クラスタのバックアップを保存するパスに設定します。このパスは存在しません。ADMIN_CLUSTER_KUBECONFIG
を管理クラスタの kubeconfig ファイルのパスに設定します。USER_CLUSTER_KUBECONFIG
をユーザー クラスタ kubeconfig のパスに設定します。EXTERNAL_IP
を管理コントロール プレーン サービス用に予約した VIP に設定します。SSH_PRIVATE_KEY
を SSH 認証鍵のパスに設定します。- プライベート ネットワークを使用している場合は、ネットワークの踏み台サーバーの IP アドレスに
JUMP_IP
を設定します。
#!/usr/bin/env bash # Automates manual steps for taking backups of user and admin clusters. # Fill in the variables below before running the script. BACKUP_DIR="" # path to store user and admin cluster backups ADMIN_CLUSTER_KUBECONFIG="" # path to admin cluster kubeconfig USER_CLUSTER_KUBECONFIG="" # path to user cluster kubeconfig EXTERNAL_IP="" # admin control plane node external ip - follow steps in documentation SSH_PRIVATE_KEY="" # path to ssh private key - follow steps in documentation JUMP_IP="" # network jump server IP - leave empty string if not using private network mkdir -p $BACKUP_DIR mkdir $BACKUP_DIR/pki # USER CLUSTER BACKUP user_etcd=$(kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[0].metadata.name}{"\n"}') kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} exec -it -n kube-system ${user_etcd} -c etcd -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /tmp/${user_etcd}_snapshot.db" kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} cp kube-system/${user_etcd}:/tmp/${user_etcd}_snapshot.db $BACKUP_DIR/${user_etcd}_snapshot.db # ADMIN CLUSTER BACKUP # Set up ssh options SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY}) if [ "${JUMP_IP}" != "" ]; then SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}") fi # Copy admin certs ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R +rw /etc/kubernetes/pki/*' scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/ # Snapshot admin cluster etcd admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}') kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export 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 /tmp/${admin_etcd}_snapshot.db" kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:/tmp/${admin_etcd}_snapshot.db $BACKUP_DIR/${admin_etcd}_snapshot.db
復元を確認する
クラスタが正常に復元されたことを確認するには、gkectl diagnose cluster を実行します。
次のステップ
- 管理クラスタをバックアップおよび復元する
- クラスタの問題を診断する
- augur について学習する。augur は、etcd バックアップから個々のオブジェクトを復元するためのオープンソース ツールです。