クラスタのバックアップと復元

このページでは、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 ストアをバックアップするには、管理ワークステーションから次の手順を行います。

  1. kubectl get po を使用して、etcd Pod を識別します。

    kubectl --kubeconfig CLUSTER_KUBECONFIG get po -n kube-system \
        -l 'component=etcd,tier=control-plane'
    

    レスポンスには、etcd Pod 名とステータスが含まれます。

  2. kubectl describe pod を使用して、etcd Pod で実行されているコンテナ(etcd コンテナを含む)を確認します。

    kubectl --kubeconfig CLUSTER_KUBECONFIG describe pod ETCD_POD_NAME -n kube-system
    
  3. etcd コンテナで Bash シェルを実行します。

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it \
        ETCD_POD_NAME --container etcd --namespace kube-system \
        -- bin/sh
    
  4. 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 を現在の日付に置き換えて、後続のスナップショットが上書きされないようにします。

  5. コンテナでシェルを終了し、次のコマンドを実行して、スナップショット ファイルを管理ワークステーションにコピーします。

    kubectl --kubeconfig CLUSTER_KUBECONFIG cp \
        kube-system/ETCD_POD_NAME:snapshot.db \
        --container etcd snapshot.db
    
  6. スナップショット ファイルをクラスタの外部に存在し、クラスタのオペレーションに依存しない場所に保存してください。

PKI 証明書をアーカイブする

バックアップ対象の証明書は、コントロール プレーンの /etc/kubernetes/pki ディレクトリにあります。コントロール プレーンが完全にダウンしたときにクラスタを復元するには、PIK 証明書と一緒に etcd ストアの snapshot.db ファイルが必要です。次のステップでは、PKI 証明書を含む tar ファイルを作成します。

  1. ssh を使用して、クラスタのコントロール プレーンに root として接続します。

    ssh root@CONTROL_PLANE_NAME
    
  2. コントロール プレーンで、/etc/kubernetes/pki ディレクトリの内容を含む tar ファイル certs_backup.tar.gz を作成します。

    tar -czvf certs_backup.tar.gz -C /etc/kubernetes/pki .
    

    コントロール プレーン内から tar ファイルの作成を行うと、すべての証明書ファイルの権限が保持されます。

  3. コントロール プレーンを終了し、ワークステーションで証明書を含む tar ファイルをワークステーションの任意の場所にコピーします。

    sudo scp root@CONTROL_PLANE_NAME:certs_backup.tar.gz BACKUP_PATH
    

クラスタを復元する

バックアップからのクラスタの復元は最後の手段です。クラスタにおいて重大な障害が発生したため、他の方法ではサービスに戻ることができない場合に使用する必要があります。たとえば、etcd データが破損している、etcd Pod がクラッシュ ループの状態にある場合に使用します。

クラスタの復元プロセスは 2 つの部分で構成されています。まず、PKI 証明書がコントロール プレーンに復元されます。その後、etcd ストアのデータが復元されます。

PKI 証明書を復元する

PKI 証明書をアーカイブするの説明に沿って PKI 証明書をバックアップしたことを前提として、次の手順では、tar ファイルからコントロール プレーンに証明書を復元する方法について説明します。

  1. PKI 証明書の tar ファイル certs_backup.tar.gz をワークステーションからクラスタのコントロール プレーンにコピーします。

    sudo scp -r BACKUP_PATH/certs_backup.tar.gz root@CONTROL_PLANE_NAME:~/
    
  2. ssh を使用して、クラスタのコントロール プレーンに root として接続します。

    ssh root@CONTROL_PLANE_NAME
    
  3. コントロール プレーンから、/etc/kubernetes/pki ディレクトリに tar ファイルの内容を抽出します。

    tar -xzvf certs_backup.tar.gz -C /etc/kubernetes/pki/
    
  4. コントロール プレーンを終了します。

etcd ストアを復元する

etcd ストアを復元する場合、このプロセスは、クラスタが高可用性(HA)モードで実行されているかどうかによって異なります。HA モードで実行されている場合は、クォーラムが保持されているかどうかによって異なります。特定のクラスタ障害が発生した場合は、次のガイドを使用して etcd ストアを復元してください。

  • 失敗したクラスタが HA モードで実行されていない場合は、次の手順に沿ってコントロール プレーンの etcd ストアを復元します。

  • クラスタが HA モードで実行されており、クォーラムが保持されている場合は何も操作しません。クォーラムが保持されている限り、障害が発生したクラスタを復元する必要はありません。

  • クラスタが HA モードで動作している際にクォーラムを失った場合は、次の手順を繰り返して、障害が発生したメンバーごとに etcd ストアを復元してください。

ワークステーションでコントロール プレーンの etcd ストアを削除して復元するには、以下の手順に沿って操作します。

  1. コントロール プレーンのルート ディレクトリに /backup ディレクトリを作成します。

    ssh root@CONTROL_PLANE_NAME "mkdir /backup"
    

    このステップは厳密に必須ではありませんが、行っていただくことをおすすめします。次の手順では、/backup ディレクトリを作成済みであることを前提としています。

  2. etcd スナップショット ファイル snapshot.db をワークステーションからクラスタ コントロール プレーンの backup ディレクトリにコピーします。

    sudo scp snapshot.db root@CONTROL_PLANE_NAME:/backup
    
  3. マニフェスト ファイルを /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
    
  4. etcd データ ディレクトリを削除します。

    rm -rf /var/lib/etcd/
    
  5. 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 マニフェスト ファイルにあります。

  6. /var/lib/etcd が再作成され、新しいメンバーが /var/lib/etcd/member に作成されていることを確認します。

  7. 静的 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
    
  8. 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
    

    各エンドポイントで成功した場合は、クラスタは適切に機能しています。