Настал черёд, мои друзья, поговорить о виртуальности. Расскажу вам одну историю, как решил проблему с вот такой связкой виртуальности. Имеем:
- kubernetes
- minikube
- helm
- consul
Я немного могу путать с тем, что из чего произрастает, но используются точно все четыре технологии.
В какой-то момент перестал запускаться Consul. Причём он был задеплоен только на одном pod-е, но при старте не мог выбрать лидера:
1 2 3 4 |
2017/09/19 08:42:20 [ERR] agent: coordinate update error: No cluster leader 2017/09/19 08:42:21 [WARN] raft: Election timeout reached, restarting election 2017/09/19 08:42:21 [INFO] raft: Node at 172.17.0.4:8300 [Candidate] entering Candidate state in term 18425 2017/09/19 08:42:21 [ERR] raft: Failed to make RequestVote RPC to {Voter 172.17.0.6:8300 172.17.0.6:8300}: dial tcp <nil>->172.17.0.6:8300: getsockopt: connection refused |
Причём IP, с которым он не может связаться, вообще какой-то странный. Адрес 172.17.0.4 не связан ни с одним pod-ом.
Для начала я попытался удалить Consul:
1 |
helm del --purge consul |
Установил заново:
1 |
helm install --name consul --namespace mynamespace --set Replicas=1 stable/consul |
В этой статье вся работа идёт с пространством имён “mynamespace”. У вас будет другое, ваше пространство имён. Соответственно вам нужно будет во всех командах поправить “mynamespace” на название вашего пространства имён.
Ошибка осталась. Странно. Достаточно долго рыскал по различным сайтам, документации, гуглу и stackoverflow.
Пытался шаманить с «peers.json», чтобы вручную поправить IP нод, но ничего не получилось. Вот тут целая статья про это в официальной документации.
Затем нашёл такую штуку:
1 2 3 |
$ kubectl exec consul-consul-0 --namespace mynamespace -- consul operator raft list-peers -stale=true Node ID Address State Voter RaftProtocol (unknown) 172.17.0.4:8300 172.17.0.6:8300 follower true <=1 |
Вот он, наш левый IP. Пытаемся удалить:
1 2 |
$ kubectl exec consul-consul-0 --namespace mynamespace -- consul operator raft remove-peer -address="172.17.0.6:8300" Error removing peer: Unexpected response code: 500 (No cluster leader) |
Ничего не получается. Жаль. Про raft можно прочесть вот здесь.
В конечном итоге нашёл причину. Она оказалась в том, что в kubernetes существует такая штука как persistent volumes. Когда мы удаляем consul через helm, то persistent volumes остаётся. При следующей установке consul каким-то образом подхватываются из этих persistent volumes старые файлы со старыми настройками и старыми ip.
Посмотреть список существующих сейчас persistent volumes можно командой:
1 |
kubectl get pv --namespace mynamespace |
Затем нужно удалить persistent volumes, которые относятся к consul:
1 |
kubectl delete pv <pv_name> |
Надеюсь, моя статья будет вам полезна. Мне она точно уже полезна:) Я пока только начал разбираться со всеми этими технологиями, так что мог чего напутать, но свою проблему я точно решил способом, описанным в этой статье.