2.2. メンバーをクラスターに戻す
etcd クラスターからメンバーを削除した後に、以下のいずれかの手順を使用してメンバーをクラスターに追加します。
- マスターホストの etcd 証明書が有効な場合は、メンバーを etcd クラスターに戻します。
- マスターホストの etcd 証明書がない場合やそれらが有効でなくなった場合は、etcd 証明書を生成し、メンバーを etcd クラスターに追加します。
2.2.1. マスターホストを etcd クラスターに戻す
マスターホストを etcd クラスターに追加するには、以下の手順に従います。この手順では、事前にマスターホストをクラスターから削除し、TLS 証明書や DNS などのその etcd 依存関係が有効であることを前提とします。
前提条件
-
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。 - etcd クラスターに追加するマスターホストへの SSH アクセスがある。
- 既存のアクティブな etcd メンバーの IP アドレスがある。
手順
etcd クラスターに追加するマスターホストにアクセスします。
重要この手順は、etcd クラスターに追加されるマスターホストで実行する必要があります。
etcd-member-add.sh
スクリプトを実行し、2 つのパラメーターを渡します。- 既存の etcd メンバーの IP アドレス
- 追加する etcd メンバーの名前
[core@ip-10-0-147-172 ~]$ sudo -E /usr/local/bin/etcd-member-add.sh \ 10.0.128.73 \ 1 etcd-member-ip-10-0-147-172.us-east-2.compute.internal 2 Downloading etcdctl binary.. etcdctl version: 3.3.10 API version: 3.3 etcd-member.yaml found in ./assets/backup/ etcd.conf backup upready exists ./assets/backup/etcd.conf Stopping etcd.. Waiting for etcd-member to stop etcd data-dir backup found ./assets/backup/etcd.. Updating etcd membership.. Removing etcd data_dir /var/lib/etcd.. ETCD_NAME="etcd-member-ip-10-0-147-172.us-east-2.compute.internal" ETCD_INITIAL_CLUSTER="etcd-member-ip-10-0-147-172.us-east-2.compute.internal=https://etcd-1.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-171-108.us-east-2.compute.internal=https://etcd-2.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-128-73.us-east-2.compute.internal=https://etcd-0.clustername.devcluster.openshift.com:2380" ETCD_INITIAL_ADVERTISE_PEER_URLS="https://etcd-1.clustername.devcluster.openshift.com:2380" ETCD_INITIAL_CLUSTER_STATE="existing"' Member 1e42c7070decd39 added to cluster 6e25bab1bb556673 Starting etcd..
etcd メンバーが正常に etcd クラスターに追加されたことを確認します。
実行中の etcd コンテナーに接続します。
[core@ip-10-0-147-172 ~] id=$(sudo crictl ps --name etcd-member | awk 'FNR==2{ print $1}') && sudo crictl exec -it $id /bin/sh
etcd コンテナーで、etcd に接続するために必要な変数をエクスポートします。
sh-4.2# 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)
etcd コンテナーで、
etcdctl member list
を実行し、新規メンバーが一覧表示されていることを確認します。sh-4.2# etcdctl member list -w table +------------------+---------+------------------------------------------+------------------------------------------------------------------+---------------------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | +------------------+---------+------------------------------------------+------------------------------------------------------------------+---------------------------+ | 29e461db6be4eaaa | started | etcd-member-ip-10-0-128-73.us-east-2.compute.internal | https://etcd-2.clustername.devcluster.openshift.com:2380 | https://10.0.128.73:2379 | | cbe982c74cbb42f | started | etcd-member-ip-10-0-147-172.us-east-2.compute.internal | https://etcd-0.clustername.devcluster.openshift.com:2380 | https://10.0.147.172:2379 | | a752f80bcb0da3e8 | started | etcd-member-ip-10-0-171-108.us-east-2.compute.internal | https://etcd-1.clustername.devcluster.openshift.com:2380 | https://10.0.171.108:2379 | +------------------+---------+------------------------------------------+------------------------------------------------------------------+---------------------------+
新規メンバーが起動するまで最長 10 分の時間がかかる可能性があります。
etcd コンテナーで、
etcdctl endpoint health
を実行し、新規メンバーの状態が正常であることを確認します。sh-4.2# etcdctl endpoint health --cluster https://10.0.128.73:2379 is healthy: successfully committed proposal: took = 4.5576ms https://10.0.147.172:2379 is healthy: successfully committed proposal: took = 5.1521ms https://10.0.171.108:2379 is healthy: successfully committed proposal: took = 4.2631ms
新規メンバーが etcd に関連付けられた Pod の一覧にあり、そのステータスが
Running
であることを確認します。クラスターにアクセスできるターミナルで、以下のコマンドを実行します。
$ oc get pods -n openshift-etcd NAME READY STATUS RESTARTS AGE etcd-member-ip-10-0-128-73.us-east-2.compute.internal 2/2 Running 0 15h etcd-member-ip-10-0-147-172.us-east-2.compute.internal 2/2 Running 7 122m etcd-member-ip-10-0-171-108.us-east-2.compute.internal 2/2 Running 0 15h
2.2.2. etcd 証明書の生成およびメンバーのクラスターへの追加
ノードが新規であるか、またはノードの etcd 証明書が有効でなくなった場合、メンバーを etcd クラスターに追加する前に etcd 証明書を生成する必要があります。
前提条件
-
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。 - etcd クラスターに追加する新規マスターホストへの SSH アクセスがある。
- 正常なマスターホストの 1 つへの SSH アクセスがある。
- 正常なマスターホストのいずれかの IP アドレスがある。
手順
正常なマスターノードのいずれかに一時的な etcd 証明書の署名側のサービスを設定します。
正常なマスターノードの 1 つにアクセスし、以下のコマンドを使用して
cluster-admin
ユーザーとしてクラスターにログインします。[core@ip-10-0-143-125 ~]$ sudo oc login https://localhost:6443 Authentication required for https://localhost:6443 (openshift) Username: kubeadmin Password: Login successful.
kube-etcd-signer-server
イメージのプル仕様を取得します。[core@ip-10-0-143-125 ~]$ export KUBE_ETCD_SIGNER_SERVER=$(sudo oc adm release info --image-for kube-etcd-signer-server --registry-config=/var/lib/kubelet/config.json)
tokenize-signer.sh
スクリプトを実行します。-E
フラグをsudo
に渡し、環境変数がスクリプトに適切に渡されるようにします。[core@ip-10-0-143-125 ~]$ sudo -E /usr/local/bin/tokenize-signer.sh ip-10-0-143-125 1 Populating template /usr/local/share/openshift-recovery/template/kube-etcd-cert-signer.yaml.template Populating template ./assets/tmp/kube-etcd-cert-signer.yaml.stage1 Tokenized template now ready: ./assets/manifests/kube-etcd-cert-signer.yaml
- 1
- 署名側のデプロイ先となる正常なマスターのホスト名。
生成されたファイルを使用して、署名側の Pod を作成します。
[core@ip-10-0-143-125 ~]$ sudo oc create -f assets/manifests/kube-etcd-cert-signer.yaml pod/etcd-signer created
署名側がこのマスターノードでリッスンしていることを確認します。
[core@ip-10-0-143-125 ~]$ ss -ltn | grep 9943 LISTEN 0 128 *:9943 *:*
新規マスターホストを etcd クラスターに追加します。
クラスターに追加される新規マスターホストにアクセスし、以下のコマンドを使用して
cluster-admin
ユーザーとしてクラスターにログインします。[core@ip-10-0-156-255 ~]$ sudo oc login https://localhost:6443 Authentication required for https://localhost:6443 (openshift) Username: kubeadmin Password: Login successful.
etcd-member-recover.sh
スクリプトで必要な 2 つの環境変数をエクスポートします。[core@ip-10-0-156-255 ~]$ export SETUP_ETCD_ENVIRONMENT=$(sudo oc adm release info --image-for machine-config-operator --registry-config=/var/lib/kubelet/config.json)
[core@ip-10-0-156-255 ~]$ export KUBE_CLIENT_AGENT=$(sudo oc adm release info --image-for kube-client-agent --registry-config=/var/lib/kubelet/config.json)
etcd-member-recover.sh
スクリプトを実行します。-E
フラグをsudo
に渡し、環境変数がスクリプトに適切に渡されるようにします。[core@ip-10-0-156-255 ~]$ sudo -E /usr/local/bin/etcd-member-recover.sh 10.0.143.125 etcd-member-ip-10-0-156-255.ec2.internal 1 Downloading etcdctl binary.. etcdctl version: 3.3.10 API version: 3.3 etcd-member.yaml found in ./assets/backup/ etcd.conf backup upready exists ./assets/backup/etcd.conf Trying to backup etcd client certs.. etcd client certs already backed up and available ./assets/backup/ Stopping etcd.. Waiting for etcd-member to stop etcd data-dir backup found ./assets/backup/etcd.. etcd TLS certificate backups found in ./assets/backup.. Removing etcd certs.. Populating template /usr/local/share/openshift-recovery/template/etcd-generate-certs.yaml.template Populating template ./assets/tmp/etcd-generate-certs.stage1 Populating template ./assets/tmp/etcd-generate-certs.stage2 Starting etcd client cert recovery agent.. Waiting for certs to generate.. Waiting for certs to generate.. Waiting for certs to generate.. Waiting for certs to generate.. Stopping cert recover.. Waiting for generate-certs to stop Patching etcd-member manifest.. Updating etcd membership.. Member 249a4b9a790b3719 added to cluster 807ae3bffc8d69ca ETCD_NAME="etcd-member-ip-10-0-156-255.ec2.internal" ETCD_INITIAL_CLUSTER="etcd-member-ip-10-0-143-125.ec2.internal=https://etcd-0.clustername.devcluster.openshift.com:2380,etcd-member-ip-10-0-156-255.ec2.internal=https://etcd-1.clustername.devcluster.openshift.com:2380" ETCD_INITIAL_ADVERTISE_PEER_URLS="https://etcd-1.clustername.devcluster.openshift.com:2380" ETCD_INITIAL_CLUSTER_STATE="existing" Starting etcd..
- 1
- 署名側のサーバーが実行されている正常なマスターの IP アドレスと、新規メンバーの etcd 名の両方を指定します。
新規マスターホストが etcd メンバーの一覧に追加されていることを確認します。
正常なマスターにアクセスし、実行中の 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
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)
etcd コンテナーで、
etcdctl member list
を実行し、新規メンバーが一覧表示されていることを確認します。sh-4.3# etcdctl member list -w table +------------------+---------+------------------------------------------+----------------------------------------------------------------+---------------------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | +------------------+---------+------------------------------------------+----------------------------------------------------------------+---------------------------+ | cbe982c74cbb42f | started | etcd-member-ip-10-0-156-255.ec2.internal | https://etcd-0.clustername.devcluster.openshift.com:2380 | https://10.0.156.255:2379 | | 249a4b9a790b3719 | started | etcd-member-ip-10-0-143-125.ec2.internal | https://etcd-1.clustername.devcluster.openshift.com:2380 | https://10.0.143.125:2379 | +------------------+---------+------------------------------------------+----------------------------------------------------------------+---------------------------+
新規メンバーが起動するまで最長 20 分の時間がかかる可能性があります。
新規メンバーの追加後に、署名側の Pod は不要になるため、これを削除します。
クラスターにアクセスできるターミナルで、以下のコマンドを実行します。
$ oc delete pod -n openshift-config etcd-signer