このページでは、クラスタの etcd ストアをバックアップおよび復元する方法について説明します。このページでは、クラスタの etcd ストアを自動的にバックアップするために使用できるスクリプトも示します。
クラスタの etcd のデータに損害を与える可能性がある想定された災害からの復旧用のバックアップを作成する必要があります。バックアップ ファイルは、クラスタの外部にあり、クラスタのオペレーションに依存しない場所に保存してください。
制限事項
この手順では、アプリケーション固有のデータはバックアップされません。
この手順では、PersistentVolume はバックアップされません。
バックアップの作成後にスケジュールされたワークロードは、そのバックアップでは復元されません。
アップグレードに失敗したクラスタは復元できません。
この手順は、削除されたクラスタを復元することを想定したものではありません。
ユーザー クラスタのバックアップ
ユーザー クラスタのバックアップは、ユーザー クラスタの etcd ストアのスナップショットです。etcd ストアには、クラスタの状態の管理に必要なすべての Kubernetes オブジェクトとカスタム オブジェクトが含まれています。スナップショットには、クラスタのコンポーネントとワークロードを再作成するために必要なデータが含まれています。
etcd ストアのスナップショットを作成するには、次の手順を実行します。
kube-etcd
コンテナでシェルを起動します。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \ kube-etcd-0 --container kube-etcd --namespace USER_CLUSTER_NAME \ -- bin/sh
ここで
- ADMIN_CLUSTER_KUBECONFIG は、管理クラスタの kubeconfig ファイルです。
- USER_CLUSTER_NAME は、ユーザー クラスタの名前です。
シェルのルート ディレクトリに、
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 snapshot.db
シェルで「
exit
」と入力してシェルを終了します。snapshot.db
をkube-etcd
コンテナから現在のディレクトリにコピーします。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp \ USER_CLUSTER_NAME/kube-etcd-0:snapshot.db \ --container kube-etcd snapshot.db
ユーザー クラスタをバックアップから復元する(非 HA)
バックアップ ファイルを使用してユーザー クラスタの etcd ストアを復元する前に、クラスタを診断して既存の問題を解決します。バックアップを使用して問題のあるクラスタを復元すると、問題が再び発生したり、悪化したりすることがあります。クラスタの復元について詳しくは、Anthos clusters on VMware サポートチームにお問い合わせください。
次の手順では、クラスタの etcd データが破損し、ユーザー クラスタの etcd Pod がクラッシュ ループした場合に、バックアップ ファイルを使用してユーザー クラスタを復元する方法について説明します。
破損したデータをバックアップで上書きするユーティリティ 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
ユーザー クラスタをバックアップから復元する(HA)
このセクションでは、高可用性(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 ... node-xxx kube-etcd-1 ... node-yyy kube-etcd-2 ... node-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 に対して行います。
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
管理クラスタのバックアップ
管理クラスタのバックアップには次のものが含まれます。
- 管理クラスタの etcd のスナップショット。
- 管理コントロール プレーンの Secret。管理クラスタとユーザー クラスタに対する認証に必要です。
管理クラスタのバックアップを作成する前に、次の手順を完了します。
管理クラスタのコントロール プレーンに SSH 接続するために使用する管理クラスタの外部 IP アドレスを確認します。
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get nodes -n kube-system -o wide | grep master
ここで、[ADMIN_CLUSTER_KUBECONFIG] は、管理クラスタの kubeconfig ファイルです。
管理クラスタの秘密鍵から
vsphere_tmp
という SSH 認証鍵を作成します。秘密鍵は管理クラスタの Secret から取得できます。
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get secrets sshkeys -n kube-system -o yaml
コマンド出力では、
vsphere_tmp
フィールドに秘密鍵が表示されます。秘密鍵を
vsphere_tmp
にコピーします。echo "[PRIVATE_KEY]" | base64 -d > vsphere_tmp; chmod 600 vsphere_tmp
次の秘密鍵を使用して管理コントロール プレーンでシェルを実行できることを確認します。
ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
コンテナを終了します。
exit
管理クラスタの etcd ストアをバックアップする
管理クラスタの etcd ストアをバックアップするには、次の手順を行います。
etcd Pod の名前を取得します。
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods \ -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
Pod の kube-etcd コンテナでシェルを起動します。
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] exec -it \ -n kube-system [ADMIN_ETCD_POD] -- bin/sh
ここで、[ADMIN_ETCD_POD] は etcd Pod の名前です。
シェルから
etcdctl
を使用して、ローカル ディレクトリに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 snapshot.db
コンテナを終了します。
exit
kubectl cp
を使用して kube-etcd コンテナからバックアップをコピーします。kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \ kube-system/[ADMIN_ETCD_POD]:snapshot.db [RELATIVE_DIRECTORY]
ここで、[RELATIVE_DIRECTORY] はバックアップを保存するパスです。
管理クラスタの Secret をバックアップする
管理コントロール プレーンの Secret をバックアップするには、次の手順を行います。
SSH を使用して管理コントロール プレーンノードに接続します。
ssh -i vsphere_tmp ubuntu@EXTERNAL_IP
EXTERNAL_IP
は、以前に記録した管理コントロール プレーンの外部 IP アドレスに置き換えます。省略可、強く推奨: ローカル バックアップ ディレクトリを作成します。
バックアップ Secret の権限を変更してノードからコピーする必要があります。
mkdir backup
Secret をローカル バックアップ ディレクトリにローカルにコピーします。
sudo cp -r /etc/kubernetes/pki/* backup/
バックアップ Secret の権限を変更します。
sudo chmod -R +rw backup/
管理コントロール プレーンノードを終了します。
exit
scp
を実行して、管理コントロール プレーン ノードからバックアップ フォルダをコピーします。sudo scp -r -i vsphere_tmp ubuntu@EXTERNAL_IP:backup/ RELATIVE_DIRECTORY
RELATIVE_DIRECTORY
をバックアップを保存する場所のパスに置き換えます。
管理クラスタの復元
次の手順では、etcd スナップショット作成時に、バックアップされた管理クラスタと管理対象のすべてのユーザー コントロール プレーンを再作成します。
scp
を実行して、snapshot.db
を管理コントロール プレーンにコピーします。sudo scp -i vsphere_tmp snapshot.db ubuntu@[EXTERNAL_IP]:
ここで、[EXTERNAL_IP] は事前に収集した管理コントロール プレーンの外部 IP アドレスです。
管理コントロール プレーンでシェルを起動します。
sudo ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
snapshot.db/
を/mnt
にコピーします。sudo cp snapshot.db /mnt/
backup
のような一時ディレクトリを作成します。mkdir backup
管理コントロール プレーンを終了します。
exit
証明書を
backup/
にコピーします。sudo scp -r -i vsphere_tmp [BACKUP_CERT_FILE] ubuntu@[EXTERNAL_IP]:backup/
管理コントロール プレーン ノードでシェルを起動します。
ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
ここで、[EXTERNAL_IP] は事前に収集した管理コントロール プレーンの外部 IP アドレスです。
kube-etcd
とkube-apiserver
を停止します。sudo mv /etc/kubernetes/manifests/etcd.yaml /tmp/etcd.yaml
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/kube-apiserver.yaml
バックアップの Secret を
/etc/kubernetes/pki/
にコピーします。sudo cp -r backup/* /etc/kubernetes/pki/
Docker で
etcdctl restore
を実行します。sudo docker run --rm \ -v '/mnt:/backup' \ -v '/var/lib/etcd:/var/lib/etcd' --env ETCDCTL_API=3 'gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION' /bin/sh -c "etcdctl snapshot restore '/backup/snapshot.db'; rm -r /var/lib/etcd/*; mv /default.etcd/member/ /var/lib/etcd/"
kube-etcd
とkube-apiserver
を再起動します。sudo mv /tmp/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
管理ワークステーションからアクセスできるように、
/etc/kubernetes/admin.conf
を.kube
フォルダにコピーします。mkdir -p [HOME]/.kube
sudo cp -i /etc/kubernetes/admin.conf [HOME]/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
管理コントロール プレーンを終了します。
exit
新しく生成された kubeconfig ファイルを管理ノードからコピーします。
sudo scp -i vsphere_tmp ubuntu@[EXTERNAL_IP]:[HOME]/.kube/config kubeconfig
sudo chown $(id -u):$(id -g) kubeconfig
ここで
- [EXTERNAL_IP] は、管理コントロール プレーンの外部 IP アドレスです。
- [HOME] は、管理ノードのホーム ディレクトリです。
この新しい kubeconfig ファイルを使用して、復元されたクラスタにアクセスできるようになりました。
クラスタの自動バックアップ
クラスタを自動的にバックアップする方法の例として、以下に示すスクリプトを使用できます。以下のスクリプトはサポートされていないため、より適切で堅牢であり、完全なスクリプトを記述するための参照としてのみ使用してください。スクリプトを実行する前に、スクリプトの先頭にある 5 つの変数の値を入力します。
BACKUP_DIR
を、管理クラスタとユーザー クラスタのバックアップを保存するパスに設定します。このパスは存在しません。ADMIN_CLUSTER_KUBECONFIG
を管理クラスタの kubeconfig ファイルのパスに設定します。USER_CLUSTER_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
次のステップ
- クラスタの問題を診断する方法を学習する。
- augur について学習する。augur は、etcd バックアップから個々のオブジェクトを復元するためのオープンソース ツールです。