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

このページは、インフラストラクチャ オペレーターを対象としています。

このページでは、切断モードで動作する 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/peer.crt \
        --key=/etc/kubernetes/pki/etcd/peer.key \
        snapshot save /tmp/snapshotDATESTAMP.db
    

    DATESTAMP は、現在の日付に置き換えて、後続のスナップショットが上書きされないようにします。

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

    kubectl --kubeconfig CLUSTER_KUBECONFIG cp \
        kube-system/ETCD_POD_NAME:/tmp/snapshot.db \
        --container etcd snapshot.db
    
  6. etcd Pod から etcdctl バイナリをコピーして、復元プロセス中に同じバイナリを使用できるようにします。

    kubectl --kubeconfig CLUSTER_KUBECONFIG cp \
      kube-system/ETCD_POD_NAME:/usr/local/bin/etcdctl \
      --container etcd etcdctl
    
  7. クラスタの外部でクラスタの運用の影響を受けない場所に、スナップショット ファイルと etcdctl バイナリを保存します。

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

バックアップされる証明書は、コントロール プレーンの /etc/kubernetes/pki ディレクトリにあります。コントロール プレーンが完全にダウンした場合にクラスタを復元するには、PKI 証明書と 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.dbetcdctl バイナリをワークステーションからクラスタ コントロール プレーンの backup ディレクトリにコピーします。

    sudo scp snapshot.db root@CONTROL_PLANE_NAME:/backup
    sudo scp etcdctl 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. 保存したバイナリを使用して、etcdctl のスナップショットの復元を実行します。

    sudo chmod +x /backup/etcdctl
    sudo ETCDCTL_API=3 /backup/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. /var/lib/etcd/member ディレクトリのオーナーを 2003 に変更します。Anthos のリリース 1.10.0 以降では、etcd コンテナが UID と GID が 2003 である root 以外のユーザーとして実行されます。

    sudo chown -R 2003:2003 /var/lib/etcd
    
  8. 静的 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
    
  9. etcdctl を使用して、追加したメンバーが正常に機能していることを確認します。

    ETCDCTL_API=3 etcdctl --cert=/etc/kubernetes/pki/etcd/peer.crt  \
        --key=/etc/kubernetes/pki/etcd/peer.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/peer.crt  \
        --key=/etc/kubernetes/pki/etcd/peer.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
    

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

次のステップ