このドキュメントでは、VMware 用 Google Distributed Cloud(ソフトウェアのみ)で作成されたユーザー クラスタの etcd ストアをバックアップして復元する方法について説明します。このページでは、クラスタの etcd ストアを自動的にバックアップするために使用できるスクリプトも示します。
クラスタの etcd のデータに損害を与える可能性がある想定外の災害からの復旧用のバックアップを作成する必要があります。バックアップ ファイルは、クラスタの外部にあり、クラスタのオペレーションに依存しない場所に保存してください。
制限事項
- この手順では、アプリケーション固有のデータはバックアップされません。 
- この手順では、PersistentVolume はバックアップされません。 
- バックアップの作成後にスケジュールされたワークロードは、そのバックアップでは復元されません。 
- アップグレードに失敗したクラスタは復元できません。 
- この手順は、削除されたクラスタを復元することを想定したものではありません。 
- 高度なクラスタが有効になっているクラスタには、この手順を使用しないでください。代わりに、gkectl を使用して高度なクラスタをバックアップして復元するをご覧ください。 
制限事項の詳細については、インフラストラクチャの非互換性をご覧ください。
ユーザー クラスタのバックアップ
ユーザー クラスタのバックアップは、ユーザー クラスタの 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 - 複数の - etcdPod が存在する場合があります(たとえば、HA クラスタに 3 つ)。バックアップでは、任意の- etcdPod が機能します。
- 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-0Pod が実行されているノード。
- 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 データを復元します。- ETCDCTL_API=3 sudo 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 - 次のように置き換えます。 - 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-etcdStatefulSet で 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 データを復元します。- ETCDCTL_API=3 sudo 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 - 次のように置き換えます。 - NODE_NAME: 復元が実行されているノードの名前。
- NODE_IP_ADDRESS: 当該ノードの IP アドレス。
- --initial-clusterフラグで、該当するノードの- NODE1、- NODE2、- NODE3、および、- NODE1_IP、- NODE2_IP、- 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 を実行します。
次のステップ
- 管理クラスタをバックアップおよび復元する
- クラスタの問題を診断する
- etcd バックアップから個々のオブジェクトを復元するためのオープンソース ツールである auger について学習する