第39章 etcd のクォーラム(定足数) の復元


etcd のクォーラム(定足数) を失う場合、etcd をバックアップし、etcd クラスターを停止してからこれを新たに作成する必要があります。1 つの正常な etcd ノードを使用して新規クラスターを作成することができますが、他のすべての正常なノードを削除する必要があります。

注記

etcd のクォーラム(定足数) が失われる際に、OpenShift Container Platform で実行されるアプリケーションは影響を受けません。ただし、プラットフォームの機能は読み取り専用の操作に制限されます。アプリケーションの拡大または縮小、デプロイメントの変更、またはビルドの実行または変更などの操作を実行することはできません。

etcd のクォーラム(定足数) が失われていることを確認するには、以下のコマンドを実行し、クラスターが正常な状態にないことを確認します。

# ETCDCTL_API=2 etcdctl  --cert-file=/etc/origin/master/master.etcd-client.crt  \
          --key-file /etc/origin/master/master.etcd-client.key \
          --ca-file /etc/origin/master/master.etcd-ca.crt \
          --endpoints="https://*master-0.example.com*:2379,\
          https://*master-1.example.com*:2379,\
          https://*master-2.example.com*:2379"\
          cluster-health

member 165201190bf7f217 is unhealthy: got unhealthy result from https://master-0.example.com:2379
member b50b8a0acab2fa71 is unreachable: [https://master-1.example.com:2379] are all unreachable
member d40307cbca7bc2df is unreachable: [https://master-2.example.com:2379] are all unreachable
cluster is unhealthy
Copy to Clipboard Toggle word wrap

ホストのメンバー ID およびホスト名を書き留めます。到達できるノードのいずれかを使用して新規クラスターを作成します。

39.1. etcd のバックアップ

etcd のバックアップ時に、etcd 設定ファイルと etcd データの両方をバックアップする必要があります。

39.1.1. etcd 設定ファイルのバックアップ

保持する etcd 設定ファイルはすべて etcd が実行されているインスタンスの /etc/etcd ディレクトリーに保存されます。これには、etcd 設定ファイル (/etc/etcd/etcd.conf) およびクラスターの通信の必要な証明書が含まれます。それらすべてのファイルは Ansible インストーラーによってインストール時に生成されます。

手順

クラスターの各 etcd メンバーについて etcd 設定をバックアップします。

$ ssh master-0
# mkdir -p /backup/etcd-config-$(date +%Y%m%d)/
# cp -R /etc/etcd/ /backup/etcd-config-$(date +%Y%m%d)/
Copy to Clipboard Toggle word wrap
注記

各 etcd クラスターメンバーの証明書および設定ファルは一意です。

39.1.2. etcd データのバックアップ

前提条件
注記

OpenShift Container Platform インストーラーはエイリアスを作成するため、etcdctl2 (etcd v2 タスクの場合) と etcdctl3 (etcd v3 タスクの場合) という名前のすべてのフラグを入力しなくて済みます。

ただし、etcdctl3 エイリアスは etcdctl コマンドに詳細なエンドポイント一覧を提供しないため、すべてのエンドポイントと共に --endpoints オプションを指定する必要があります。

etcd をバックアップする前に、以下を確認してください。

  • etcdctl バイナリーが利用可能であるか、またはコンテナー化インストールでは rhel7/etcd コンテナーが利用可能であること。
  • etcd クラスターとの接続 (ポート 2379/tcp)。
  • etcd クラスターに接続するための適切な証明書がある。
手順
注記

etcdctl backup コマンドはバックアップを実行するために使用されますが、etcd v3 には バックアップ の概念がありません。代わりに etcdctl snapshot save コマンドを使用してライブメンバーの スナップショット を取るか、または etcd データディレクトリーの member/snap/db ファイルをコピーすることができます。

etcdctl backup コマンドは、ノード ID やクラスター ID などのバックアップに含まれるメタデータの一部を書き換えるので、バックアップでは、ノードの以前のアイデンティティーが失われます。バックアップからクラスターを再作成するには、新規の単一ノードクラスターを作成してから、残りのノードをクラスターに追加します。メタデータは新規ノードが既存クラスターに加わらないように書き換えられます。

etcd データをバックアップします。

  • v2 API を使用する場合には、以下のアクションを実行してください。

    1. すべての etcd サービスを停止します。

      # systemctl stop etcd.service
      Copy to Clipboard Toggle word wrap
    2. etcd データバックアップを作成し、etcd db ファイルをコピーします。

      # mkdir -p /backup/etcd-$(date +%Y%m%d)
      # etcdctl2 backup \
          --data-dir /var/lib/etcd \
          --backup-dir /backup/etcd-$(date +%Y%m%d)
      # cp /var/lib/etcd/member/snap/db /backup/etcd-$(date +%Y%m%d)
      Copy to Clipboard Toggle word wrap
  • v3 API を使用する場合、以下のコマンドを実行します。

    重要

    OpenShift Container Platform の以前のバージョンからアップグレードしたクラスターには、v2 データストアが含まれる可能性があるので、v2 と v3 の両方のデータストアをバックアップしてください。

    # mkdir -p /backup/etcd-$(date +%Y%m%d)
    # etcdctl3 snapshot save /backup/etcd-$(date +%Y%m%d)/db
    Snapshot saved at /backup/etcd-<date>/db
    # systemctl stop etcd.service
    # etcdctl2 backup \
        --data-dir /var/lib/etcd \
        --backup-dir /backup/etcd-$(date +%Y%m%d)
    # systemctl start etcd.service
    Copy to Clipboard Toggle word wrap
    注記

    etcdctl snapshot save コマンドでは etcd サービスが実行中である必要があります。

    これらのコマンドで、/backup/etcd-<date>/ ディレクトリーが作成されます。ここで、<date> は現在の日付を表します。このディレクトリーの場所は、外部 NFS 共有、S3 バケットやその他の外部ストレージのいずれかでなければなりません。

    オールインワンクラスターの場合、etcd データディレクトリーは /var/lib/origin/openshift.local.etcd ディレクトリーに置かれます。

39.2. etcd ホストの削除

etcd ホストが復元後も失敗する場合、これをクラスターから削除します。etcd のクォーラム(定足数) が失われた状態から回復するには、クラスターから 1 つの etcd ノード以外のすべての正常な etcd ノードを削除する必要もあります。

すべてのマスターホストで実行する手順

手順

  1. 各 etcd ホストを etcd クラスターから削除します。それぞれの etcd ノードについて以下のコマンドを実行します。

    # etcdctl -C https://<surviving host IP address>:2379 \
      --ca-file=/etc/etcd/ca.crt     \
      --cert-file=/etc/etcd/peer.crt     \
      --key-file=/etc/etcd/peer.key member remove <failed member ID>
    Copy to Clipboard Toggle word wrap
  2. すべてのマスターの /etc/origin/master/master-config.yaml +master 設定ファイルから他の etcd ホストを削除します。

    etcdClientInfo:
      ca: master.etcd-ca.crt
      certFile: master.etcd-client.crt
      keyFile: master.etcd-client.key
      urls:
        - https://master-0.example.com:2379
        - https://master-1.example.com:2379 
    1
    
        - https://master-2.example.com:2379 
    2
    Copy to Clipboard Toggle word wrap
    1 2
    削除するホストです。
  3. すべてのマスターでマスター API サービスを再起動します。

    # master-restart api restart-master controller
    Copy to Clipboard Toggle word wrap

現在の etcd クラスターで実行する手順

手順

  1. 失敗したホストをクラスターから削除します。

    # etcdctl2 cluster-health
    member 5ee217d19001 is healthy: got healthy result from https://192.168.55.12:2379
    member 2a529ba1840722c0 is healthy: got healthy result from https://192.168.55.8:2379
    failed to check the health of member 8372784203e11288 on https://192.168.55.21:2379: Get https://192.168.55.21:2379/health: dial tcp 192.168.55.21:2379: getsockopt: connection refused
    member 8372784203e11288 is unreachable: [https://192.168.55.21:2379] are all unreachable
    member ed4f0efd277d7599 is healthy: got healthy result from https://192.168.55.13:2379
    cluster is healthy
    
    # etcdctl2 member remove 8372784203e11288 
    1
    
    Removed member 8372784203e11288 from cluster
    
    # etcdctl2 cluster-health
    member 5ee217d19001 is healthy: got healthy result from https://192.168.55.12:2379
    member 2a529ba1840722c0 is healthy: got healthy result from https://192.168.55.8:2379
    member ed4f0efd277d7599 is healthy: got healthy result from https://192.168.55.13:2379
    cluster is healthy
    Copy to Clipboard Toggle word wrap
    1
    remove コマンドにはホスト名ではなく、etcd ID が必要です。
  2. etcd 設定で etcd サービスの再起動時に失敗したホストを使用しないようにするには、残りのすべての etcd ホストで /etc/etcd/etcd.conf ファイルを変更し、ETCD_INITIAL_CLUSTER 変数の値から失敗したホストを削除します。

    # vi /etc/etcd/etcd.conf
    Copy to Clipboard Toggle word wrap

    以下に例を示します。

    ETCD_INITIAL_CLUSTER=master-0.example.com=https://192.168.55.8:2380,master-1.example.com=https://192.168.55.12:2380,master-2.example.com=https://192.168.55.13:2380
    Copy to Clipboard Toggle word wrap

    以下のようになります。

    ETCD_INITIAL_CLUSTER=master-0.example.com=https://192.168.55.8:2380,master-1.example.com=https://192.168.55.12:2380
    Copy to Clipboard Toggle word wrap
    注記

    失敗したホストは etcdctl を使用して削除されているので、etcd サービスの再起動は不要です。

  3. Ansible インベントリーファイルをクラスターの現在のステータスを反映し、Playbook の再実行時の問題を防げるように変更します。

    [OSEv3:children]
    masters
    nodes
    etcd
    
    ... [OUTPUT ABBREVIATED] ...
    
    [etcd]
    master-0.example.com
    master-1.example.com
    Copy to Clipboard Toggle word wrap
  4. Flannel を使用している場合、すべてのホストの /etc/sysconfig/flanneld にある flanneld サービス設定を変更し、etcd ホストを削除します。

    FLANNEL_ETCD_ENDPOINTS=https://master-0.example.com:2379,https://master-1.example.com:2379,https://master-2.example.com:2379
    Copy to Clipboard Toggle word wrap
  5. flanneld サービスを再起動します。

    # systemctl restart flanneld.service
    Copy to Clipboard Toggle word wrap

39.3. 単一ノード etcd クラスターの作成

OpenShift Container Platform インスタンスの完全な機能を復元するには、残りの etcd ノードをスタンドアロン etcd クラスターにします。

手順

  1. クラスターから削除しなかった etcd ノードで、すべての etcd サービスを停止します。

    # systemctl stop etcd.service
    Copy to Clipboard Toggle word wrap
  2. ホストで etcd サービスを実行し、新規クラスターを強制的に実行します。

    これらのコマンドは、--force-new-cluster オプションを etcd 起動コマンドに追加する etcd サービスのカスタムファイルを作成します。

    # mkdir -p /etc/systemd/system/etcd.service.d/
    # echo "[Service]" > /etc/systemd/system/etcd.service.d/temp.conf
    # echo "ExecStart=" >> /etc/systemd/system/etcd.service.d/temp.conf
    # sed -n '/ExecStart/s/"$/ --force-new-cluster"/p' \
        /usr/lib/systemd/system/etcd.service \
        >> /etc/systemd/system/etcd.service.d/temp.conf
    
    # systemctl daemon-reload
    # master-restart etcd
    Copy to Clipboard Toggle word wrap
  3. etcd メンバーを一覧表示し、メンバー一覧に単一の etcd ホストのみが含まれることを確認します。

    # etcdctl member list
    165201190bf7f217: name=192.168.34.20 peerURLs=http://localhost:2380 clientURLs=https://master-0.example.com:2379 isLeader=true
    Copy to Clipboard Toggle word wrap
  4. データの復元および新規クラスターの作成後に、peerURLs パラメーターを、etcd がピア通信をリッスンする IP アドレスを使用するように更新します。

    # etcdctl member update 165201190bf7f217 https://192.168.34.20:2380 
    1
    Copy to Clipboard Toggle word wrap
    1
    165201190bf7f217 は直前のコマンドの出力に示されるメンバー ID であり、https://192.168.34.20:2380 はその IP アドレスです。
  5. 検証するには、IP がメンバーの一覧にあることを確認します。

    $ etcdctl2 member list
    5ee217d17301: name=master-0.example.com peerURLs=https://*192.168.55.8*:2380 clientURLs=https://192.168.55.8:2379 isLeader=true
    Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat