LoginSignup
0
0

kubeadmでcontrol nodeをjoinさせるときに発生するetcd cluster is not healthyの対処法

Posted at

前提

タイトルのerrorはkubeadmでk8sをHA構成で構築している時に一度削除したcontrol nodeをもう一度追加しようとした時のerrorです。

TL;DR

errorを吐いているnodeのipは192.168.110.12

$ kubectl exec etcd-control-node0 -n kube-system -it -- sh
sh-5.2# etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/peer.crt \
    --key /etc/kubernetes/pki/etcd/peer.key \
    member list -w table
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |     NAME      |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
| 233150a5485a40d9 | started | control-node2 | https://192.168.110.12:2380 | https://192.168.110.12:2379 |      false |
| 52334327109b3fe3 | started | control-node0 | https://192.168.110.10:2380 | https://192.168.110.10:2379 |      false |
| a054738f4e5ba2c5 | started | control-node1 | https://192.168.110.11:2380 | https://192.168.110.11:2379 |      false |
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
sh-5.2# etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/peer.crt \
    --key /etc/kubernetes/pki/etcd/peer.key \
    member remove 233150a5485a40d9
sh-5.2# etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/peer.crt \
    --key /etc/kubernetes/pki/etcd/peer.key \
    member list -w table
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |     NAME      |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
| 52334327109b3fe3 | started | control-node0 | https://192.168.110.10:2380 | https://192.168.110.10:2379 |      false |
| a054738f4e5ba2c5 | started | control-node1 | https://192.168.110.11:2380 | https://192.168.110.11:2379 |      false |
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+

error発生時の状況

まず諸事情によりkubeadmのcontrol nodeを削除しました。

control-node1 $ sudo kubeadm reset
control-node0 $ sudo kubectl delete node control-node1

そして、control-node1をOS installから作り直しもう一度joinさせました。
kubeadm-config.yamlはjoinの時の設定が書かれたfileです。

control-node1 $ sudo kubeadm join --config kubeadm-config.yaml

しかし、下記のようなerrorが表示されました。

[check-etcd] Checking that the etcd cluster is healthy
error execution phase check-etcd: etcd cluster is not healthy: failed to dial endpoint https://192.168.110.12:2379 with maintenance client: context deadline exceeded
To see the stack trace of this error execute with --v=5 or higher

試行錯誤

私はalmalinuxを使っているのでfirewalldかと思ったのですが、portはしっかりと開いていました。
etcdには2379portが使われます。

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 6443/tcp 2379-2380/tcp 10250-10252/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

selinuxはもちろん無効化してあります。

$ getenforce
Disabled

そして次章のissueに辿り着きました。

対処

If nodes terminated or shutdown, i use etcdctl to remove this etcd member. It could not use kubeadm. And if etcd cluster have two member, one of node goes away, the cluster not health, it maybe need human intervention.

Thank you, Dear pytimer.

というわけで、etcdctlというやつでmemberを確認して削除してみましょう。
しかし、どのnodeにもetcdctlなんてcommandはありません。
当たり前です。
etcdはk8sのcontainer上で動作しているのですから。
なので、etcd container上でetcdctlを実行している記述を探していたら下記のyoutubeを見つけました。

まあ、先ほどのissueとyoutubeで本当は時系列が逆だったりするのですが、説明しやすいので、、、
というわけで、youtube上で実行されている下記のcommandをcontrol nodeで実行してみます。

$ kubectl exec etcd-control-node0 -n kube-system -it -- sh
sh-5.2# etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/peer.crt \
    --key /etc/kubernetes/pki/etcd/peer.key \
    member list -w table
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |     NAME      |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
| 233150a5485a40d9 | started | control-node2 | https://192.168.110.12:2380 | https://192.168.110.12:2379 |      false |
| 52334327109b3fe3 | started | control-node0 | https://192.168.110.10:2380 | https://192.168.110.10:2379 |      false |
| a054738f4e5ba2c5 | started | control-node1 | https://192.168.110.11:2380 | https://192.168.110.11:2379 |      false |
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+

なんかfalseになってるのは無視してcontrol-node2がetcdに残っているのが確認できます。
issueが言っていたのはこのことだとわかったので、このetcd memberを削除します。

そのcommandは下記で見つけました。

これを実行してみます。

sh-5.2# etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/peer.crt \
    --key /etc/kubernetes/pki/etcd/peer.key \
    member remove 233150a5485a40d9
sh-5.2# etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/peer.crt \
    --key /etc/kubernetes/pki/etcd/peer.key \
    member list -w table
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |     NAME      |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+
| 52334327109b3fe3 | started | control-node0 | https://192.168.110.10:2380 | https://192.168.110.10:2379 |      false |
| a054738f4e5ba2c5 | started | control-node1 | https://192.168.110.11:2380 | https://192.168.110.11:2379 |      false |
+------------------+---------+---------------+-----------------------------+-----------------------------+------------+

削除できたのが確認できました。
再度joinさせてみます。

$ sudo kubeadm join --config kubeadm-config.yaml
~~~~~~~~~
Run 'kubectl get nodes' to see this node join the cluster.

成功しました。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0