Thank you for reading this post, don't forget to subscribe!
В определенных случаях может возникнуть ситуация когда одна из нод кластера etcd не может подключиться к кластеру и ее не видят все остальные ноды. Например, такое может случиться в кластере ВМ VirtualBox после восстановления виртуалки из снапшота. Обычно, данная проблема решается перезапуском сервиса etcd или рестартом ОС на ВМ. Но если это не помогает, то можно пересоздать эту ноду кластера etcd.
Для того чтобы пересоздать и переподключить ноду кластера etcd, необходимо выполнить следующие шаги:
Останавливаем (если запущена) службу etcd на проблемной ноде:
$ systemctl stop etcd
На живой ноде кластера проверяем состояние кластера (видим нашу проблемную ноду, и что кластер в статусе degraded):
$ etcdctl cluster-health
Выводим список нод с их данными подключения и ID
$ etcdctl member list
Удаляем проблемную ноду из кластера по ее ID (в данном конкретном случае: 75f844b9fc38df9f):
$ etcdctl member remove 75f844b9fc38df9f
Теперь добавим ноду обратно в кластер, указав ее имя и URL для подключения. Нода будет добавлена и получит в кластере новый ID (в данном случае: 71fbb082f6f4f045):
$ etcdctl member add postgres1 http://192.168.56.125:2380
Смотрим список нод и видим что нода добавлена:
$ etcdctl member list
На проблемной ноде редактируем конфиг /etc/etcd/etcd.conf, прописывая в настройке ETCD_INITIAL_CLUSTER_STATE «existing» вместо «new»:
ETCD_INITIAL_CLUSTER_STATE="existing"
В том же конфиге /etc/etcd/etcd.conf смотрим где нода хранит данные ectd в параметре ETCD_DATA_DIR (в нашем случае ETCD_DATA_DIR=»/var/lib/etcd»), переходим в эту папку и удаляем из ее поддиректории member все содержимое:
$ rm -rf /var/lib/etcd/member/*
Запускаем на проблемной ноде службу etcd. Нода должна подключиться к существующему кластеру, получить выданный ей кластером ID (в данном случае: 71fbb082f6f4f045) и синхронизироваться. Все это можно проверить выполнив:
$ systemctl status etcd
Теперь проверяем что наши ноды в кластере и что кластер теперь в нормальном состоянии:
$ etcdctl member list
$ etcdctl cluster-health
При желании, на бывшей проблемной ноде можно в конфиге /etc/etcd/etcd.conf обратно вернуть параметр в значение ETCD_INITIAL_CLUSTER_STATE=»new» и после перезапустить etcd:
$ systemctl restart etcd
На этом всё, мы удалили и заново подключили ноду к кластеру «с чистого листа».