はじめに
以前の記事で作成したHA構成のk8sクラスタの一部がサーバーの物理的な移動の際に壊れてしまい、復帰に手間取ったので記しておきます。
ただ再構築したいだけであれば対象のマスターノードで sudo kubeadm reset
で済むようなのですが、今回はそのサーバーにアクセスできない状態になってしまったので、手動で色々と削除していきます。
この手順無しで kubeadm join
でマスターノードを追加しようとすると、
[check-etcd] Checking that the etcd cluster is healthy
が長時間続き、その後エラーが出ます。
etcd
に古いノードが登録されていて、それにアクセスしに行こうとしてタイムアウトしているようです。
同じIPでマスターノードを再構築しようとしていても、そのノードが立ち上がる前(join
の段階で)にアクセスに行くのでエラーが出てしまいます。
参考
基本的にはここに書いてあるままですが、一部古い記述があったので更新していきます。
ノードを削除する
他のマスターノードから、アクセス不可になったマスターノードを削除します。
kubectl delete node <master>
etcd クラスタから対象のノードを削除する
まず etcd
をDLしてきます。
ほぼ参照先と一緒ですが、バージョンを最新にするのと、今回の環境はARMではなくAMD上で動いているのでそこを変更しました。
mkdir /opt/tools && cd /opt/tools
wget https://github.com/etcd-io/etcd/releases/download/v3.4.14/etcd-v3.4.14-linux-amd64.tar.gz
tar xfz etcd-v3.4.14-linux-amd64.tar.gz
実行します。
cd /opt/tools/etcd-v3.3.12-linux-arm64
sudo ./etcdctl --endpoints https://192.168.0.11:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list
sudo ./etcdctl --endpoints https://192.168.0.11:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member remove 86a89c4f9f2bf9f3
etcdctl member list
で対象ノードのIDを取得し、 etcdctl member remove
で削除します。
kube-configを書き換える
kube-config
の中にもマスターノードの情報が残っているので、削除します。
kubectl edit configmap kubeadm-config -n kube-system
ClusterStatus: |
apiEndpoints:
master-1:
advertiseAddress: 192.168.0.11
bindPort: 6443
master-2:
advertiseAddress: 192.168.0.12
bindPort: 6443
master-3:
advertiseAddress: 192.168.0.13
bindPort: 6443
対象ノードの箇所を削除してください。
新しいマスターノードをjoinさせる
ここまで来たら、後はこの記事の手順のように kubeadm join
を実行するだけです!
終わりに
kubeadm
を使用してクラスタを構築しているので、 etcd
という根幹を成すコマンドを触る事にびびってしまいましたが、何とか復帰できました。
そこそこな時間を悩んでしまったので、この記事が誰かの10分、1時間、半日を節約するための足掛かりになれれば幸いです。