第35章 バックアップおよび復元

35.1. 概要

OpenShift Container Platform では、クラスターレベルでの バックアップ (状態の別個のストレージへの保存) と 復元 (別個のストレージからの状態の再作成) が可能です。さらに、プロジェクトごとのバックアップの事前サポートがあります。クラスターインストールの完全な状態には、以下が含まれます。

  • 各マスターの etcd データ
  • API オブジェクト
  • レジストリーストレージ
  • ボリュームストレージ

このトピックでは、永続ストレージのバックアップおよび復元については扱いません。それらは基礎となるストレージプロバイダーに関連するトピックであるためです。ただし、アプリケーションデータ汎用的な バックアップの実行方法についての例を示します。

重要

このトピックでは、アプリケーションおよび OpenShift Container Platform クラスターの一般的なバックアップ方法のみを説明します。ここではカスタム要件は考慮されません。そのため、完全なバックアップおよび復元手順を作成する必要があります。データ損失を防ぐには、必要な予防策を取る必要があります。

etcd バックアップにはストレージボリュームへのすべての参照が含まれることに注意してください。etcd の復元時に、OpenShift Container Platform はノードでの従前の Pod の起動と同じストレージの再割り当てを開始します。これは、クラスターからノードを削除し、新規ノードを追加する場合のプロセスと変わりがありません。そのノードに割り当てられているすべてのものは、Pod がどのノードに再スケジュールされる場合でも Pod に再度割り当てられます。

重要

バックアップと復元は保証されません。独自のデータは各自でバックアップする必要があります。

35.2. 前提条件

  1. 復元手順には完全な再インストールが必要になるため、初期インストールで使用されるすべてのファイルを保存します。これには、以下が含まれる場合があります。

  2. インストール後の手順についての手順をバックアップします。一部のインストールには、インストーラーに含まれない手順が含まれる場合があります。これには、OpenShift Container Platform が制御できる範囲を超えているサービスへの変更やモニターエージェントなどの追加サービスのインストールが含まれる場合があります。高度なインストーラーでサポートされていない追加の設定も、複数の認証プロバイダーの使用時などに影響を受ける可能性があります。
  3. 各種のユーティリティーコマンドを提供するパッケージをインストールします。

    # yum install etcd
  4. コンテナーベースのインストールを使用する場合、代わりに etcd イメージをプルします。

    # docker pull rhel7/etcd

etcd データディレクトリーの場所 (または以下のセクションの $ETCD_DATA_DIR) をメモします。この場所は etcd がどのようにデプロイされているかによって異なります。

デプロイメントタイプデータディレクトリー

オールインワン (all-in-one) クラスター

/var/lib/origin/openshift.local.etcd

外部 etcd (マスターまたは別のホストのいずれかに配置される)

/var/lib/etcd

警告

組み込みの etcd は OpenShift Container Platform 3.7 以降サポートされなくなりました。

35.3. クラスターのバックアップ

35.3.1. マスターのバックアップ

  1. 各マスターのすべての証明書およびキーを保存します。

    # cd /etc/origin/master
    # tar cf /tmp/certs-and-keys-$(hostname).tar *.key *.crt

35.3.2. etcd のバックアップ

  1. etcd が複数ホストで実行されている場合、各ホストでこれを停止します。

    # sudo systemctl stop etcd

    この手順は必ずしも必要となる訳ではありませんが、これを実行することにより、etcd データが完全に同期されます。

  2. etcd バックアップを作成します。

    # etcdctl backup \
        --data-dir $ETCD_DATA_DIR \
        --backup-dir $ETCD_DATA_DIR.bak
    注記

    etcd が複数ホストで実行されている場合、各種のインスタンスがそれらのデータを定期的に同期するため、それら内のいずれかのバックアップを作成するだけで十分になります。

    注記

    コンテナーベースのインストールの場合、docker exec を使用してコンテナー内で etcdctl を実行する必要があります。

  3. db ファイルを作成したバックアップにコピーします。

    # cp "$ETCD_DATA_DIR"/member/snap/db "$ETCD_DATA_DIR.bak"/member/snap/db

35.3.3. レジストリー証明書のバックアップ

  1. すべてのマスターおよびノードホストのすべてのレジストリー証明書を保存します。

    # cd /etc/docker/certs.d/
    # tar cf /tmp/docker-registry-certs-$(hostname).tar *
    注記

    1 つ以上の外部のセキュリティー保護されたレジストリーを使用している場合、イメージのプルまたはプッシュが必要なホストは、Pod を実行するためにレジストリー証明書を信頼する必要があります。

35.4. 単一メンバーの etcd クラスター用のクラスターの復元

クラスターを復元するには、以下を実行します。

  1. OpenShift Container Platform を再インストールします。

    これは、OpenShift Container Platform が以前にインストールされたのと同じ方法で実行される必要があります。

  2. 必要なすべてのインストール後の手順を実行します。
  3. 各マスターで、証明書およびキーを復元します。

    # cd /etc/origin/master
    # tar xvf /tmp/certs-and-keys-$(hostname).tar
  4. etcd バックアップから復元を実行します。

    # mv $ETCD_DATA_DIR $ETCD_DATA_DIR.orig
    # cp -Rp $ETCD_DATA_DIR.bak $ETCD_DATA_DIR
    # chcon -R --reference $ETCD_DATA_DIR.orig $ETCD_DATA_DIR
    # chown -R etcd:etcd $ETCD_DATA_DIR
  5. etcd の --force-new-cluster オプションを使用して単一ノードクラスターを新規に作成します。これは、/etc/etcd/etcd.conf の値を使用して実行することも、systemd ユニットファイルを一時的に変更し、サービスを通常の方法で起動することによって実行することもできます。

    これを実行するには、/usr/lib/systemd/system/etcd.service ファイルを編集し、--force-new-cluster を追加します。

    # sed -i '/ExecStart/s/"$/  --force-new-cluster"/' /usr/lib/systemd/system/etcd.service
    # systemctl show etcd.service --property ExecStart --no-pager
    
    ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --force-new-cluster"

    次に、etcd サービスを再起動します。

    # systemctl daemon-reload
    # systemctl start etcd
  6. etcd サービスが適切に起動したことを確認してから、/usr/lib/systemd/system/etcd.service ファイルを再編集し、--force-new-cluster オプションを削除します。

    # sed -i '/ExecStart/s/ --force-new-cluster//' /usr/lib/systemd/system/etcd.service
    # systemctl show etcd.service --property ExecStart --no-pager
    
    ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd"
  7. etcd サービスを再起動してから etcd クラスターが適切に実行されていることを確認し、OpenShift Container Platform の設定を表示します。

    # systemctl daemon-reload
    # systemctl restart etcd

35.5. 複数メンバーで構成される etcd クラスター用のクラスターの復元

マスターホストに etcd をデプロイする必要がある場合、新規ホストを作成する必要はありません。マスターホストから専用 etcd をデプロイする必要がある場合は、新規ホストを作成する必要があります。

初期の etcd メンバーとするシステムを選択してから、その etcd バックアップおよび設定を復元します。

  1. etcd ホストで以下を実行します。

    # ETCD_DIR=/var/lib/etcd/
    # mv $ETCD_DIR /var/lib/etcd.orig
    # cp -Rp var/lib/etcd.orig/openshift-backup-pre-upgrade/ $ETCD_DIR
    # chcon -R --reference /var/lib/etcd.orig/ $ETCD_DIR
    # chown -R etcd:etcd $ETCD_DIR
  2. バックアップまたは .rpmsave から /etc/etcd/etcd.conf ファイルを復元します。
  3. 使用される環境に応じて、コンテナー化された etcd デプロイメントまたはコンテナー化されていない etcd デプロイメントについての説明に従ってください。

35.5.1. コンテナー化された etcd デプロイメント

  1. etcd の --force-new-cluster オプションを使用して単一ノードクラスターを新規に作成します。これは、/etc/etcd/etcd.conf の値を使用して長く複雑なコマンドを使用して実行することも、systemd ユニットファイルを一時的に変更し、通常の方法でサービスを起動して実行することもできます。

    これを実行するには、/etc/systemd/system/etcd_container.service ファイルを編集し、--force-new-cluster を追加します。

    # sed -i '/ExecStart=/s/$/  --force-new-cluster/' /etc/systemd/system/etcd_container.service
    
    ExecStart=/usr/bin/docker run --name etcd --rm -v \
    /var/lib/etcd:/var/lib/etcd:z -v /etc/etcd:/etc/etcd:ro --env-file=/etc/etcd/etcd.conf \
    --net=host --entrypoint=/usr/bin/etcd rhel7/etcd:3.1.9  --force-new-cluster

    次に、etcd サービスを再起動します。

    # systemctl daemon-reload
    # systemctl start etcd_container
  2. etcd サービスが適切に起動したことを確認してから、/etc/systemd/system/etcd_container.service ファイルを再編集し、--force-new-cluster オプションを削除します。

    # sed  -i '/ExecStart=/s/ --force-new-cluster//' /etc/systemd/system/etcd_container.service
    
    ExecStart=/usr/bin/docker run --name etcd --rm -v /var/lib/etcd:/var/lib/etcd:z -v \
    /etc/etcd:/etc/etcd:ro --env-file=/etc/etcd/etcd.conf --net=host \
    --entrypoint=/usr/bin/etcd rhel7/etcd:3.1.9
  3. etcd サービスを再起動してから etcd クラスターが適切に実行されていることを確認し、OpenShift Container Platform の設定を表示します。

    # systemctl daemon-reload
    # systemctl restart etcd_container
    # etcdctl --cert-file=/etc/etcd/peer.crt \
        --key-file=/etc/etcd/peer.key \
        --ca-file=/etc/etcd/ca.crt \
        --peers="https://172.16.4.18:2379,https://172.16.4.27:2379" \
        ls /
  4. クラスターに追加する必要のある他の etcd メンバーがある場合、etcd メンバーの追加に進みます。または、単一ノードの外部 etcd が必要な場合、OpenShift Container Platform サービスの再オンライン化に進みます。

35.5.2. コンテナー化されていない etcd デプロイメント

  1. etcd の --force-new-cluster オプションを使用して単一ノードクラスターを新規に作成します。これは、/etc/etcd/etcd.conf の値を使用して長く複雑なコマンドを使用して実行することも、systemd ユニットファイルを一時的に変更し、通常の方法でサービスを起動して実行することもできます。

    これを実行するには、/usr/lib/systemd/system/etcd.service ファイルを編集し、--force-new-cluster を追加します。

    # sed -i '/ExecStart/s/"$/  --force-new-cluster"/' /usr/lib/systemd/system/etcd.service
    # systemctl show etcd.service --property ExecStart --no-pager
    
    ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --force-new-cluster"

    次に etcd サービスを再起動します。

    # systemctl daemon-reload
    # systemctl start etcd
  2. etcd サービスが適切に起動したことを確認してから、/usr/lib/systemd/system/etcd.service ファイルを再編集し、--force-new-cluster オプションを削除します。

    # sed -i '/ExecStart/s/ --force-new-cluster//' /usr/lib/systemd/system/etcd.service
    # systemctl show etcd.service --property ExecStart --no-pager
    
    ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd"
  3. etcd サービスを再起動してから etcd クラスターが適切に実行されていることを確認し、OpenShift Container Platform の設定を表示します。

    # systemctl daemon-reload
    # systemctl restart etcd
    # etcdctl --cert-file=/etc/etcd/peer.crt \
        --key-file=/etc/etcd/peer.key \
        --ca-file=/etc/etcd/ca.crt \
        --peers="https://172.16.4.18:2379,https://172.16.4.27:2379" \
        ls /
  4. クラスターに追加する必要のある他の etcd メンバーがある場合、etcd メンバーの追加に進みます。または、単一ノードの外部 etcd が必要な場合、OpenShift Container Platform サービスの再オンライン化に進みます。

35.5.3. etcd メンバーの追加

etcd メンバーをクラスターに追加するには、まず、最初のメンバーの peerURLs 値でデフォルトの localhost ピアを調整する必要があります。

  1. member list コマンドを使用して最初のメンバーのメンバー ID を取得します。

    # etcdctl --cert-file=/etc/etcd/peer.crt \
        --key-file=/etc/etcd/peer.key \
        --ca-file=/etc/etcd/ca.crt \
        --peers="https://172.18.1.18:2379,https://172.18.9.202:2379,https://172.18.0.75:2379" \
        member list
  2. 直前の手順で取得されたメンバー ID を渡して、etcdctl member update コマンドを使用してpeerURLs の値を更新します。

    # etcdctl --cert-file=/etc/etcd/peer.crt \
        --key-file=/etc/etcd/peer.key \
        --ca-file=/etc/etcd/ca.crt \
        --peers="https://172.18.1.18:2379,https://172.18.9.202:2379,https://172.18.0.75:2379" \
        member update 511b7fb6cc0001 https://172.18.1.18:2380

    または、curl を使用できます。

    # curl --cacert /etc/etcd/ca.crt \
        --cert /etc/etcd/peer.crt \
        --key /etc/etcd/peer.key \
        https://172.18.1.18:2379/v2/members/511b7fb6cc0001 \
        -XPUT -H "Content-Type: application/json" \
        -d '{"peerURLs":["https://172.18.1.18:2380"]}'
  3. member list コマンドを再実行し、ピア URL に localhost が含まれなくなるようにします。
  4. ここで、メンバーは 1 度に 1 つずつクラスターに追加します。

    警告

    各メンバーは 1 度に 1 つずつ完全に追加され、オンライン化される必要があります。各メンバーをクラスターに追加する際、peerURLs 一覧はその時点で正しくなければならず、各メンバーが追加されるたびに拡張できるようにします。etcdctl member add コマンドは、以下の説明にあるように各メンバーの追加時に etcd.conf ファイルに設定される必要のある値を出力します。

    1. それぞれのメンバーについて、そのシステムの etcd.conf ファイルにある値を使用してクラスターに追加します。

      # etcdctl --cert-file=/etc/etcd/peer.crt \
          --key-file=/etc/etcd/peer.key \
          --ca-file=/etc/etcd/ca.crt \
          --peers="https://172.16.4.18:2379,https://172.16.4.27:2379" \
          member add 10.3.9.222 https://172.16.4.27:2380
      
      Added member named 10.3.9.222 with ID 4e1db163a21d7651 to cluster
      
      ETCD_NAME="10.3.9.222"
      ETCD_INITIAL_CLUSTER="10.3.9.221=https://172.16.4.18:2380,10.3.9.222=https://172.16.4.27:2380"
      ETCD_INITIAL_CLUSTER_STATE="existing"
    2. 上記の etcdctl member add コマンドで提供される環境変数を使用し、メンバーシステム自体で /etc/etcd/etcd.conf ファイルを編集し、これらの設定が一致することを確認します。
    3. ここで、新規メンバーで etcd を起動します。

      # rm -rf /var/lib/etcd/member
      # systemctl enable etcd
      # systemctl start etcd
    4. サービスが正常に起動し、etcd クラスターが正常な状態にあることを確認します。

      # etcdctl --cert-file=/etc/etcd/peer.crt \
          --key-file=/etc/etcd/peer.key \
          --ca-file=/etc/etcd/ca.crt \
          --peers="https://172.16.4.18:2379,https://172.16.4.27:2379" \
          member list
      
      51251b34b80001: name=10.3.9.221 peerURLs=https://172.16.4.18:2380 clientURLs=https://172.16.4.18:2379
      d266df286a41a8a4: name=10.3.9.222 peerURLs=https://172.16.4.27:2380 clientURLs=https://172.16.4.27:2379
      
      # etcdctl --cert-file=/etc/etcd/peer.crt \
          --key-file=/etc/etcd/peer.key \
          --ca-file=/etc/etcd/ca.crt \
          --peers="https://172.16.4.18:2379,https://172.16.4.27:2379" \
          cluster-health
      
      cluster is healthy
      member 51251b34b80001 is healthy
      member d266df286a41a8a4 is healthy
    5. クラスターに追加する次のメンバーについてもこのプロセスを繰り返します。
  5. すべての etcd メンバーの追加後に、OpenShift Container Platform サービスの再オンライン化に進みます。

35.6. 新規 etcd ホストの追加

etcd メンバーが失敗する際にクォーラム(定足数)の etcd クラスターメンバーが実行されている場合、存続しているメンバーをそのまま使用してダウンタイムを発生させずに etcd メンバーを追加することができます。

提案されるクラスターサイズ

奇数の etcd ホストを含むクラスターの場合、フォールトトレランスに対応できます。奇数の etcd ホストがあることで、クォーラム(定足数)に必要な数が変わることはありませんが、障害発生時の耐性が高まります。たとえば、クラスターサイズが 3 メンバーである場合、クォーラム(定足数)は 2 で、1 メンバーは障害耐性用になります。これにより、クラスターはメンバーの 2 つが正常である限り、機能し続行けます。

3 つの etcd ホストで構成される実稼働クラスターの使用が推奨されます。

注記

以下は、etcd ホストの /etc/etcd 設定のバックアップがあることを前提としています。

  1. 新規 etcd メンバーが OpenShift Container Platform ノードでもある場合は、「必要なホスト数のクラスターへの追加」を参照してください。この手順の残りの部分では、1 つのホストのみを追加していることを前提としていますが、複数のホストを追加する場合には、それぞれのホストですべての手順を実行してください。
  2. 存続するノードで etcd および iptables をアップグレードします。

    # yum update etcd iptables-services

    バージョン etcd-2.3.7-4.el7.x86_64 以上がインストールされており、同じバージョンが各ホストにインストールされていることを確認します。

  3. 新規ホストで etcd および iptables をインストールします。

    # yum install etcd iptables-services

    バージョン etcd-2.3.7-4.el7.x86_64 以上がインストールされており、同じバージョンが新規ホストにインストールされていることを確認します。

  4. クラスター設定の変更を行う前に、存続するホストで etcd データストアのバックアップを実行します。
  5. 失敗した etcd メンバーを置き換える場合、新規メンバーを追加する に、失敗したメンバーを削除します。

    # etcdctl -C https://<surviving host IP>:2379 \
      --ca-file=/etc/etcd/ca.crt     \
      --cert-file=/etc/etcd/peer.crt     \
      --key-file=/etc/etcd/peer.key cluster-health
    
    # etcdctl -C https://<surviving host IP>:2379 \
      --ca-file=/etc/etcd/ca.crt     \
      --cert-file=/etc/etcd/peer.crt     \
      --key-file=/etc/etcd/peer.key member remove <failed member identifier>

    失敗した etcd メンバーで etcd サービスを停止します。

    # systemctl stop etcd
  6. 新規ホストで、適切な iptables ルールを追加します。

    # systemctl enable iptables.service --now
    # iptables -N OS_FIREWALL_ALLOW
    # iptables -t filter -I INPUT -j OS_FIREWALL_ALLOW
    # iptables -A OS_FIREWALL_ALLOW -p tcp -m state \
      --state NEW -m tcp --dport 2379 -j ACCEPT
    # iptables -A OS_FIREWALL_ALLOW -p tcp -m state \
      --state NEW -m tcp --dport 2380 -j ACCEPT
    # iptables-save > /etc/sysconfig/iptables
  7. 新規ホストの必要な証明書を生成します。存続する etcd ホストで以下を実行します。

    1. /etc/etcd/ca/ ディレクトリーのバックアップを作成します。
    2. 証明書の変数および作業ディレクトリーを設定し、作成されていない場合には PREFIX ディレクトリーを作成します。

      # cd /etc/etcd
      # export NEW_ETCD="<NEW_HOST_NAME>"
      
      # export CN=$NEW_ETCD
      # export SAN="IP:<NEW_HOST_IP>"
      # export PREFIX="./generated_certs/etcd-$CN/"
    3. $PREFIX ディレクトリーを作成します。

      $ mkdir -p $PREFIX
    4. server.csr および server.crt 証明書を作成します。

      # openssl req -new -keyout ${PREFIX}server.key \
        -config ca/openssl.cnf \
        -out ${PREFIX}server.csr \
        -reqexts etcd_v3_req -batch -nodes \
        -subj /CN=$CN
      
      # openssl ca -name etcd_ca -config ca/openssl.cnf \
        -out ${PREFIX}server.crt \
        -in ${PREFIX}server.csr \
        -extensions etcd_v3_ca_server -batch
    5. peer.csr および peer.crt 証明書を作成します。

      # openssl req -new -keyout ${PREFIX}peer.key \
        -config ca/openssl.cnf \
        -out ${PREFIX}peer.csr \
        -reqexts etcd_v3_req -batch -nodes \
        -subj /CN=$CN
      
      # openssl ca -name etcd_ca -config ca/openssl.cnf \
        -out ${PREFIX}peer.crt \
        -in ${PREFIX}peer.csr \
        -extensions etcd_v3_ca_peer -batch
    6. etcd.conf および ca.crt ファイルをコピーし、ディレクトリーの内容をアーカイブします。

      # cp etcd.conf ${PREFIX}
      # cp ca.crt ${PREFIX}
      # tar -czvf ${PREFIX}${CN}.tgz -C ${PREFIX} .
    7. ファイルを新規の etcd ホストに転送します。

      # scp ${PREFIX}${CN}.tgz  $CN:/etc/etcd/
  8. 存続している etcd ホスト上で、新規ホストをクラスターに追加します。

    1. 新規ホストをクラスターに追加します。

      # export ETCD_CA_HOST="<SURVIVING_ETCD_HOSTNAME>"
      # export NEW_ETCD="<NEW_ETCD_HOSTNAME>"
      # export NEW_ETCD_IP="<NEW_HOST_IP>"
      
      # etcdctl -C https://${ETCD_CA_HOST}:2379 \
        --ca-file=/etc/etcd/ca.crt     \
        --cert-file=/etc/etcd/peer.crt     \
        --key-file=/etc/etcd/peer.key member add ${NEW_ETCD} https://${NEW_ETCD_IP}:2380
      
      ETCD_NAME="<NEW_ETCD_HOSTNAME>"
      ETCD_INITIAL_CLUSTER="<NEW_ETCD_HOSTNAME>=https://<NEW_HOST_IP>:2380,<SURVIVING_ETCD_HOST>=https:/<SURVIVING_HOST_IP>:2380
      ETCD_INITIAL_CLUSTER_STATE="existing"

      etcdctl member add 出力の 3 つの環境変数をコピーします。これらは後で使用されます。

    2. 新規ホストで、コピーされた設定データを抽出し、パーミッションを設定します。

      # tar -xf /etc/etcd/<NEW_ETCD_HOSTNAME>.tgz -C /etc/etcd/ --overwrite
      # chown -R etcd:etcd /etc/etcd/*
    3. 新規ホストで、etcd データを削除します。

      # rm -rf /var/lib/etcd/member
      # chown -R etcd:etcd /var/lib/etcd
  9. 新規 etcd ホストの etcd.conf ファイルで、以下を実行します。

    1. 以下を直前の手順で生成された値に置き換えます。

      • ETCD_NAME
      • ETCD_INITIAL_CLUSTER
      • ETCD_INITIAL_CLUSTER_STATE

        IP アドレスを以下の「NEW_ETCD」値に置き換えます。

      • ETCD_LISTEN_PEER_URLS
      • ETCD_LISTEN_CLIENT_URLS
      • ETCD_INITIAL_ADVERTISE_PEER_URLS
      • ETCD_ADVERTISE_CLIENT_URLS

        失敗したメンバーを置き換えるには、失敗したホストを etcd 設定から削除する必要があります。

  10. 新規ホストで etcd を起動します。

    # systemctl enable etcd --now
  11. 新規メンバーが正常に追加されたことを確認するには、以下を実行します。

    etcdctl -C https://${ETCD_CA_HOST}:2379 --ca-file=/etc/etcd/ca.crt \
      --cert-file=/etc/etcd/peer.crt     \
      --key-file=/etc/etcd/peer.key cluster-health
  12. すべてのマスターで、新規 etcd ホストを参照するようマスター設定を更新します。

    1. クラスター内のすべてのマスターで、/etc/origin/master/master-config.yaml を編集します。
    2. etcdClientInfo セクションを見つけます。
    3. 新規 etcd ホストを urls 一覧に追加します。
    4. 失敗した etcd ホストが置き換えられている場合、これを一覧から削除します。
    5. マスター API サービスを再起動します。

      各マスターで以下を実行します。

      # systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers

etcd メンバーを追加する手順が完了します。

35.7. OpenShift Container Platform サービスの再オンライン化

それぞれの OpenShift Container Platform マスターで、バックアップからマスターおよびノード設定を復元し、すべての関連するサービスを有効にしてから再起動します。

# cp /etc/sysconfig/atomic-openshift-master-api.rpmsave /etc/sysconfig/atomic-openshift-master-api
# cp /etc/sysconfig/atomic-openshift-master-controllers.rpmsave /etc/sysconfig/atomic-openshift-master-controllers
# cp /etc/origin/master/master-config.yaml.<timestamp> /etc/origin/master/master-config.yaml
# cp /etc/origin/node/node-config.yaml.<timestamp> /etc/origin/node/node-config.yaml
# cp /etc/origin/master/scheduler.json.<timestamp> /etc/origin/master/scheduler.json
# systemctl enable atomic-openshift-master-api
# systemctl enable atomic-openshift-master-controllers
# systemctl enable atomic-openshift-node
# systemctl start atomic-openshift-master-api
# systemctl start atomic-openshift-master-controllers
# systemctl start atomic-openshift-node

それぞれの OpenShift Container Platform ノードで、バックアップから node-config.yaml ファイルを復元し、atomic-openshift-node サービスを有効にしてから再起動します。

# cp /etc/origin/node/node-config.yaml.<timestamp> /etc/origin/node/node-config.yaml
# systemctl enable atomic-openshift-node
# systemctl start atomic-openshift-node

OpenShift Container Platform クラスターが再びオンライン化されます。

35.8. プロジェクトのバックアップ

OpenShift Container Platform の今後のリリースでは、その特長の 1 つであるプロジェクトごとのバックアップと復元のサポートが提供されます。

現時点では、プロジェクトレベルで API オブジェクトをバックアップするには、保存する各オブジェクトについて oc export を使用します。たとえば、YAML 形式でデプロイメント設定 frontend を保存するには、以下を実行します。

$ oc export dc frontend -o yaml > dc-frontend.yaml

プロジェクトのすべて ( namespace およびプロジェクトなどのクラスターオブジェクトの例外を除く) をバックアップするには、以下を実行します。

$ oc export all -o yaml > project.yaml

35.8.1. ロールバインディング

カスタムポリシーの ロールバインディング はプロジェクトで使用されることがよくあります。たとえば、プロジェクトの管理者は別のユーザーに、プロジェクトの特定のロールを付与し、そのユーザーにプロジェクトアクセスを付与することができます。

これらのロールバインディングはエクスポートできます。

$ oc get rolebindings -o yaml --export=true > rolebindings.yaml

35.8.2. サービスアカウント

カスタムサービスアカウントがプロジェクトに作成されている場合、これらをエクスポートする必要があります。

$ oc get serviceaccount -o yaml --export=true > serviceaccount.yaml

35.8.3. シークレット

ソースコントロール管理シークレット (SSH パブリックキー、ユーザー名/パスワード) などのカスタムシークレットは、これらが使用される場合はエクスポートする必要があります。

$ oc get secret -o yaml --export=true > secret.yaml

35.8.4. Persistent Volume Claim (永続ボリューム要求、PVC)

プロジェクト内のアプリケーションが Persistent Volume Claim (永続ボリューム要求、PVC) によって永続ボリュームを使用する場合、これらをバックアップする必要があります。

$ oc get pvc -o yaml --export=true > pvc.yaml

35.9. プロジェクトの復元

プロジェクトを復元するには、プロジェクトを再作成し、バックアップ時にエクスポートされたすべてのオブジェクトを再作成します。

$ oc new-project myproject
$ oc create -f project.yaml
$ oc create -f secret.yaml
$ oc create -f serviceaccount.yaml
$ oc create -f pvc.yaml
$ oc create -f rolebindings.yaml
注記

一部のリソースは作成できない可能性があります (例: Pod およびデフォルトのサービスアカウント)。

35.10. アプリケーションデータのバックアップ

多くの場合、 rsync がコンテナーイメージ内にインストールされていることを前提とすると、アプリケーションデータは oc rsync コマンドを使用してバックアップできます。Red Hat rhel7 ベースイメージには rsync が含まれます。したがって、rhel7 をベースとするすべてのイメージにはこれが含まれることになります。「Troubleshooting and Debugging CLI Operations - rsync」を参照してください。

警告

これはアプリケーションデータの 汎用的な バックアップであり、データベースシステムの特殊なエクスポート/インポート手順などのアプリケーション固有のバックアップ手順は考慮に入れられません。

永続ボリュームのタイプによっては、他のバックアップ手段もある場合があります (Cinder、NFS、Gluster など)。

バックアップのパスも アプリケーションに固有 のものです。deploymentconfig でボリュームの mountPath を参照してバックアップするパスを判別することができます。

Jenkins デプロイメントのアプリケーションデータのバックアップ例

  1. アプリケーションデータ mountPathdeploymentconfig から取得します。

    $ oc get dc/jenkins -o jsonpath='{ .spec.template.spec.containers[?(@.name=="jenkins")].volumeMounts[?(@.name=="jenkins-data")].mountPath }'
    /var/lib/jenkins
  2. 現在実行中の Pod の名前を取得します。

    $ oc get pod --selector=deploymentconfig=jenkins -o jsonpath='{ .metadata.name }'
    jenkins-1-37nux
  3. oc rsync コマンドを使用してアプリケーションデータをコピーします。

    $ oc rsync jenkins-1-37nux:/var/lib/jenkins /tmp/
注記

このタイプのアプリケーションデータバックアップは、アプリケーション Pod が現時点で実行中の場合にのみ実行できます。

35.11. アプリケーションデータの復元

アプリケーションデータの復元プロセスは oc rsync ツールを使用した アプリケーションバックアップ手順に似ています。同じ制限が適用され、アプリケーションデータの復元プロセスには永続ボリュームが必要です。

Jenkins デプロイメントのアプリケーションデータの復元例

  1. バックアップを確認します。

    $ ls -la /tmp/jenkins-backup/
    total 8
    drwxrwxr-x.  3 user     user   20 Sep  6 11:14 .
    drwxrwxrwt. 17 root     root 4096 Sep  6 11:16 ..
    drwxrwsrwx. 12 user     user 4096 Sep  6 11:14 jenkins
  2. oc rsync ツールを使用してデータを実行中の Pod にコピーします。

    $ oc rsync /tmp/jenkins-backup/jenkins jenkins-1-37nux:/var/lib
    注記

    アプリケーションによっては、アプリケーションを再起動する必要があります。

  3. 新規データでアプリケーションを再起動します (オプション)。

    $ oc delete pod jenkins-1-37nux

    または、デプロイメントを 0 にスケールダウンしてから再びスケールアップします。

    $ oc scale --replicas=0 dc/jenkins
    $ oc scale --replicas=1 dc/jenkins