第38章 etcd のクォーラム (定足数) の復元
etcd のクォーラム (定足数) を失う場合、それを復元できます。
- etcd を別のホストで実行する場合、etcd をバックアップし、etcd クラスターを停止してからこれを新たに作成する必要があります。1 つの正常な etcd ノードを使用して新規クラスターを作成することができますが、他のすべての正常なノードを削除する必要があります。
- etcd をマスターノード上で静的 Pod として実行する場合、etcd Pod を停止し、一時的なクラスターを作成してから etcd Pod を再起動します。
etcd のクォーラム (定足数) が失われる際に、OpenShift Container Platform で実行されるアプリケーションは影響を受けません。ただし、プラットフォームの機能は読み取り専用の操作に制限されます。アプリケーションの拡大または縮小、デプロイメントの変更、またはビルドの実行または変更などの操作を実行することはできません。
etcd のクォーラム (定足数) が失われていることを確認するには、以下のコマンドのいずれかを実行し、クラスターが正常な状態にないことを確認します。
etcd v2 API を使用する場合、以下のコマンドを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow v3 API を使用する場合、以下のコマンドを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ホストのメンバー ID およびホスト名を書き留めます。到達できるノードのいずれかを使用して新規クラスターを作成します。
38.1. 複数サービスの etcd クォーラム (定足数) の復元 リンクのコピーリンクがクリップボードにコピーされました!
38.1.1. etcd のバックアップ リンクのコピーリンクがクリップボードにコピーされました!
etcd のバックアップ時に、etcd 設定ファイルと etcd データの両方をバックアップする必要があります。
38.1.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)/
$ ssh master-0
# mkdir -p /backup/etcd-config-$(date +%Y%m%d)/
# cp -R /etc/etcd/ /backup/etcd-config-$(date +%Y%m%d)/
- 1
master-0
は、etcd メンバーの名前に置き換えます。
各 etcd クラスターメンバーの証明書および設定ファイルは一意のものです。
38.1.1.2. etcd データのバックアップ リンクのコピーリンクがクリップボードにコピーされました!
前提条件
OpenShift Container Platform インストーラーはエイリアスを作成するため、etcdctl2
(etcd v2 タスクの場合) と etcdctl3
(etcd v3 タスクの場合) という名前のすべてのフラグを入力しなくて済みます。
ただし、etcdctl3
エイリアスは etcdctl
コマンドに詳細なエンドポイント一覧を提供しないため、--endpoints
オプションを指定し、すべてのエンドポイントを一覧表示する必要があります。
etcd をバックアップする前に、以下を確認してください。
-
etcdctl
バイナリーが利用可能であるか、またはコンテナー化インストールの場合はrhel7/etcd
コンテナーが利用可能でなければなりません。 - OpenShift Container Platform API サービスが実行中であることを確認します。
- etcd クラスターとの接続を確認します (ポート 2379/tcp)。
- etcd クラスターに接続するために使用する適切な証明書があることを確認します。
手順
etcdctl backup
コマンドはバックアップを実行するために使用されますが、etcd v3 には バックアップ の概念がありません。代わりに、etcdctl snapshot save
コマンドを使用してライブメンバーの snapshot を取るか、または etcd データディレクトリーの member/snap/db
ファイルをコピーしてください。
etcdctl backup
コマンドは、ノード ID やクラスター ID などのバックアップに含まれるメタデータの一部を書き換えるので、バックアップでは、ノードの以前のアイデンティティーが失われます。バックアップからクラスターを再作成するには、新規の単一ノードクラスターを作成してから、残りのノードをクラスターに追加します。メタデータは新規ノードが既存クラスターに加わらないように再作成されます。
etcd データをバックアップします。
OpenShift Container Platform の以前のバージョンからアップグレードしたクラスターには、v2 データストアが含まれる可能性があります。すべての etcd データストアをバックアップしてください。
静的 Pod マニフェストから etcd エンドポイント IP アドレスを取得します。
export ETCD_POD_MANIFEST="/etc/origin/node/pods/etcd.yaml"
$ export ETCD_POD_MANIFEST="/etc/origin/node/pods/etcd.yaml"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export ETCD_EP=$(grep https ${ETCD_POD_MANIFEST} | cut -d '/' -f3)
$ export ETCD_EP=$(grep https ${ETCD_POD_MANIFEST} | cut -d '/' -f3)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 管理者としてログインします。
oc login -u system:admin
$ oc login -u system:admin
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd Pod 名を取得します。
export ETCD_POD=$(oc get pods -n kube-system | grep -o -m 1 '^master-etcd\S*')
$ export ETCD_POD=$(oc get pods -n kube-system | grep -o -m 1 '^master-etcd\S*')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kube-system
プロジェクトに切り替えます。oc project kube-system
$ oc project kube-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod の etcd データのスナップショットを作成し、これをローカルに保存します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- スナップショットは、
/var/lib/etcd/
配下のディレクトリーに記述する必要があります。
38.1.2. etcd ホストの削除 リンクのコピーリンクがクリップボードにコピーされました!
復元後に etcd ホストが失敗する場合は、クラスターから削除します。etcd のクォーラム (定足数) が失われた状態から回復するには、クラスターから 1 つの etcd ノード以外のすべての正常な etcd ノードを削除する必要もあります。
すべてのマスターホストで実行する手順
手順
etcd クラスターから他の etcd ホストをそれぞれ削除します。それぞれの etcd ノードについて以下のコマンドを実行します。
etcdctl3 --endpoints=https://<surviving host IP>:2379
# etcdctl3 --endpoints=https://<surviving host IP>:2379 --cacert=/etc/etcd/ca.crt --cert=/etc/etcd/peer.crt --key=/etc/etcd/peer.key member remove <failed member ID>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow すべてのマスターの
/etc/origin/master/master-config.yaml
+master 設定ファイルから他の etcd ホストを削除します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow すべてのマスターでマスター API サービスを再起動します。
master-restart api restart-master controller
# master-restart api restart-master controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
現在の etcd クラスターで実行する手順
手順
失敗したホストをクラスターから削除します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
remove
コマンドにはホスト名ではなく、etcd ID が必要です。
etcd 設定で etcd サービスの再起動時に失敗したホストを使用しないようにするには、残りのすべての etcd ホストで
/etc/etcd/etcd.conf
ファイルを変更し、ETCD_INITIAL_CLUSTER
変数の値から失敗したホストを削除します。vi /etc/etcd/etcd.conf
# vi /etc/etcd/etcd.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下に例を示します。
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
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 Copied! Toggle word wrap Toggle overflow 以下のようになります。
ETCD_INITIAL_CLUSTER=master-0.example.com=https://192.168.55.8:2380,master-1.example.com=https://192.168.55.12:2380
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 Copied! Toggle word wrap Toggle overflow 注記失敗したホストは
etcdctl
を使用して削除されているので、etcd サービスの再起動は不要です。Ansible インベントリーファイルをクラスターの現在のステータスを反映し、Playbook の再実行時の問題を防げるように変更します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
FLANNEL_ETCD_ENDPOINTS=https://master-0.example.com:2379,https://master-1.example.com:2379,https://master-2.example.com:2379
Copy to Clipboard Copied! Toggle word wrap Toggle overflow flanneld
サービスを再起動します。systemctl restart flanneld.service
# systemctl restart flanneld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
38.1.3. 単一ノード etcd クラスターの作成 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform インスタンスの完全な機能を復元するには、残りの etcd ノードをスタンドアロン etcd クラスターにします。
手順
クラスターから削除しなかった etcd ノードで、etcd の Pod 定義を削除してすべての etcd サービスを停止します。
mkdir -p /etc/origin/node/pods-stopped mv /etc/origin/node/pods/etcd.yaml /etc/origin/node/pods-stopped/ systemctl stop atomic-openshift-node mv /etc/origin/node/pods-stopped/etcd.yaml /etc/origin/node/pods/
# mkdir -p /etc/origin/node/pods-stopped # mv /etc/origin/node/pods/etcd.yaml /etc/origin/node/pods-stopped/ # systemctl stop atomic-openshift-node # mv /etc/origin/node/pods-stopped/etcd.yaml /etc/origin/node/pods/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ホストで etcd サービスを実行し、新規クラスターを強制的に実行します。
これらのコマンドは、
--force-new-cluster
オプションを etcd 起動コマンドに追加する etcd サービスのカスタムファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd メンバーを一覧表示し、メンバー一覧に単一の etcd ホストのみが含まれることを確認します。
etcdctl member list
# 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 Copied! Toggle word wrap Toggle overflow データの復元および新規クラスターの作成後に、
peerURLs
パラメーターを、etcd がピア通信をリッスンする IP アドレスを使用するように更新する必要があります。etcdctl member update 165201190bf7f217 https://192.168.34.20:2380
# etcdctl member update 165201190bf7f217 https://192.168.34.20:2380
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
165201190bf7f217
は直前のコマンドの出力に示されるメンバー ID であり、https://192.168.34.20:2380
はその IP アドレスです。
検証するには、IP がメンバーの一覧にあることを確認します。
etcdctl2 member list
$ 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 Copied! Toggle word wrap Toggle overflow
38.1.4. 復元後の etcd ノードの追加 リンクのコピーリンクがクリップボードにコピーされました!
最初のインスタンスを実行後に、複数の etcd サーバーをクラスターに追加できます。
手順
ETCD_NAME
変数でインスタンスの etcd 名を取得します。grep ETCD_NAME /etc/etcd/etcd.conf
# grep ETCD_NAME /etc/etcd/etcd.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd がピア通信をリッスンする IP アドレスを取得します。
grep ETCD_INITIAL_ADVERTISE_PEER_URLS /etc/etcd/etcd.conf
# grep ETCD_INITIAL_ADVERTISE_PEER_URLS /etc/etcd/etcd.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ノードが以前のバージョンで etcd クラスターに含まれていた場合には、以前の etcd データを削除します。
rm -Rf /var/lib/etcd/*
# rm -Rf /var/lib/etcd/*
Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd が正しく実行されている etcd ホストで、新しいメンバーを追加します。
etcdctl3 member add *<name>* \ --peer-urls="*<advertise_peer_urls>*"
# etcdctl3 member add *<name>* \ --peer-urls="*<advertise_peer_urls>*"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは一部の変数を出力します。以下に例を示します。
ETCD_NAME="master2" ETCD_INITIAL_CLUSTER="master-0.example.com=https://192.168.55.8:2380" ETCD_INITIAL_CLUSTER_STATE="existing"
ETCD_NAME="master2" ETCD_INITIAL_CLUSTER="master-0.example.com=https://192.168.55.8:2380" ETCD_INITIAL_CLUSTER_STATE="existing"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいホストの
/etc/etcd/etcd.conf
ファイルに、以前のコマンドからの値を追加します。vi /etc/etcd/etcd.conf
# vi /etc/etcd/etcd.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow クラスターに参加するノードで etcd サービスを起動します。
systemctl start etcd.service
# systemctl start etcd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow エラーメッセージの有無を確認します。
master-logs etcd etcd
# master-logs etcd etcd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 全ノードを追加したら、クラスターのステータスと正常性を確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 残りのピアをクラスターに戻します。