3.3. クラスターの直前の状態への復元

クラスターを直前の状態に復元するには、スナップショットを作成して、事前に etcd データのバックアップを行っている必要があります。このスナップショットを使用して、クラスターの状態を復元します。

3.3.1. クラスターの直前の状態への復元

保存された etcd バックアップを使用して、クラスターの以前の状態に戻すことができます。

前提条件

  • cluster-admin ロールを持つユーザーとしてのクラスターへのアクセスがあること。
  • マスターホストへの SSH アクセス。
  • etcd スナップショットと静的 Kubernetes API サーバーリソースの両方を含むバックアップディレクトリー(同じバックアップから取られるもの)。ディレクトリー内のファイル名は、snapshot_<datetimestamp>.db および static_kuberesources_<datetimestamp>.tar.gz の形式にする必要があります。

    注記

    クラスター内のすべてのマスターホストで同じ etcd バックアップディレクトリーを使用する必要があります。

    注記

    etcd バックアップが OpenShift Container Platform 4.3.0 または 4.3.1 から取得された場合、これは etcd スナップショットおよび静的 Kubernetes API サーバーリソースが含まれる単一ファイルになります。etcd-snapshot-restore.sh スクリプトは、この単一ファイルを受け入れるために必要な後方互換性があります。この形式は snapshot_db_kuberesources_<datetimestamp>.tar.gz になります。

手順

  1. 復元するクラスター内のそれぞれのマスターホストを準備します。

    短期間でマスターホストのすべてに復元スクリプトを実行し、クラスターのメンバーがほぼ同時に起動し、クォーラム(定足数) を構成できるようにする必要がありなす。そのため、それぞれのマスターホストを別々のターミナルに分け、復元スクリプトをそれぞれに対して迅速に開始できるようにすることが推奨されます。

    1. etcd バックアップディレクトリーをマスターホストにコピーします。

      この手順では、etcd スナップショットおよび静的 Kubernetes API サーバーリソースを含む backup ディレクトリーを、マスターホストの /home/core/ ディレクトリーにコピーしていることを前提としています。

    2. マスターホストにアクセスします。
    3. INITIAL_CLUSTER 変数を、 <name>=<url> 形式でメンバー一覧に追加します。この変数は復元スクリプトに渡され、各メンバーに同一の変数が使用される必要があります。

      [core@ip-10-0-143-125 ~]$ export INITIAL_CLUSTER="etcd-member-ip-10-0-143-125.ec2.internal=https://etcd-0.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-35-108.ec2.internal=https://etcd-1.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-10-16.ec2.internal=https://etcd-2.clustername.devcluster.openshift.com:2380"
    4. クラスター全体のプロキシーが有効になっている場合は、 NO_PROXYHTTP_PROXY、および HTTPS_PROXY 環境変数をエクスポートしていることを確認します。

      ヒント

      oc get proxy cluster -o yaml の出力を確認して、プロキシーが有効にされているかどうかを確認できます。プロキシーは、httpProxyhttpsProxy、および noProxy フィールドに値が設定されている場合に有効にされます。

    5. これらの手順を他のマスターホストで繰り返し実行します。 その際、各マスターホストをそれぞれのターミナルで処理します。各マスターホストの同じバックアップファイルセットを含むバックアップディレクトリーを使用するようにしてください。
  2. すべてのマスターホストで復元スクリプトを実行します。

    1. 最初のマスターホストで etcd-snapshot-restore.sh スクリプトを開始します。etcd バックアップディレクトリーのパスと、INITIAL_CLUSTER 変数で定義されるメンバーの一覧の 2 つのパラメーターを渡します。

      [core@ip-10-0-143-125 ~]$ sudo -E /usr/local/bin/etcd-snapshot-restore.sh /home/core/backup $INITIAL_CLUSTER
      Creating asset directory ./assets
      Downloading etcdctl binary..
      etcdctl version: 3.3.10
      API version: 3.3
      Backing up /etc/kubernetes/manifests/etcd-member.yaml to ./assets/backup/
      Stopping all static pods..
      ..stopping kube-scheduler-pod.yaml
      ..stopping kube-controller-manager-pod.yaml
      ..stopping kube-apiserver-pod.yaml
      ..stopping etcd-member.yaml
      Stopping etcd..
      Waiting for etcd-member to stop
      Stopping kubelet..
      Stopping all containers..
      bd44e4bc942276eb1a6d4b48ecd9f5fe95570f54aa9c6b16939fa2d9b679e1ea
      d88defb9da5ae623592b81619e3690faeb4fa645440e71c029812cb960ff586f
      3920ced20723064a379739c4a586f909497a7b6705a5b3cf367d9b930f23a5f1
      d470f7a2d962c90f3a21bcc021970bde96bc8908f317ec70f1c21720b322c25c
      Backing up etcd data-dir..
      Removing etcd data-dir /var/lib/etcd
      Restoring etcd member etcd-member-ip-10-0-143-125.ec2.internal from snapshot..
      2019-05-15 19:03:34.647589 I | pkg/netutil: resolving etcd-0.clustername.devcluster.openshift.com:2380 to 10.0.143.125:2380
      2019-05-15 19:03:34.883545 I | mvcc: restore compact to 361491
      2019-05-15 19:03:34.915679 I | etcdserver/membership: added member cbe982c74cbb42f [https://etcd-0.clustername.devcluster.openshift.com:2380] to cluster 807ae3bffc8d69ca
      Starting static pods..
      ..starting kube-scheduler-pod.yaml
      ..starting kube-controller-manager-pod.yaml
      ..starting kube-apiserver-pod.yaml
      ..starting etcd-member.yaml
      Starting kubelet..
    2. 復元が開始されたら、他のマスターホストでスクリプトを実行します。
  3. マシン設定 (Machine Config) が適用されていることを確認します。

    クラスターにアクセスできるターミナルで、cluster-admin ユーザーとして以下のコマンドを実行します。

    $ oc get machineconfigpool
    NAME     CONFIG                                             UPDATED   UPDATING
    master   rendered-master-50e7e00374e80b767fcc922bdfbc522b   True      False

    スナップショットが適用されると、マスターの currentConfig は etcd スナップショットの取られた時点の ID に一致します。マスターの currentConfig 名は rendered-master-<currentConfig> 形式の名前になります。

  4. すべてのマスターホストが起動しており、クラスターに参加していることを確認します。

    1. マスターホストにアクセスし、実行中の etcd コンテナーに接続します。

      [core@ip-10-0-143-125 ~] id=$(sudo crictl ps --name etcd-member | awk 'FNR==2{ print $1}') && sudo crictl exec -it $id /bin/sh
    2. etcd コンテナーで、etcd に接続するために必要な変数をエクスポートします。

      sh-4.3# export ETCDCTL_API=3 ETCDCTL_CACERT=/etc/ssl/etcd/ca.crt ETCDCTL_CERT=$(find /etc/ssl/ -name *peer*crt) ETCDCTL_KEY=$(find /etc/ssl/ -name *peer*key)
    3. etcd コンテナーで、etcdctl member list を実行し、3 つのメンバーが起動済みであることを確認します。

      sh-4.3#  etcdctl member list -w table
      
      +------------------+---------+------------------------------------------+------------------------------------------------------------------+---------------------------+
      |        ID        | STATUS  |                   NAME                   |                            PEER ADDRS                            |       CLIENT ADDRS        |
      +------------------+---------+------------------------------------------+------------------------------------------------------------------+---------------------------+
      | 29e461db6be4eaaa | started | etcd-member-ip-10-0-164-170.ec2.internal | https://etcd-2.clustername.devcluster.openshift.com:2380 | https://10.0.164.170:2379 |
      |  cbe982c74cbb42f | started | etcd-member-ip-10-0-143-125.ec2.internal | https://etcd-0.clustername.devcluster.openshift.com:2380 | https://10.0.143.125:2379 |
      | a752f80bcb0da3e8 | started |   etcd-member-ip-10-0-156-2.ec2.internal | https://etcd-1.clustername.devcluster.openshift.com:2380 |   https://10.0.156.2:2379 |
      +------------------+---------+------------------------------------------+------------------------------------------------------------------+---------------------------+

      それぞれの新規メンバーが起動するまでに最長 20 分の時間がかかる可能性があります。