HA-кластер microk8s: аварийное переключение узла зависит от того, какой узел выходит из строя
Ахой,
Я пытаюсь добиться быстрого аварийного переключения в HA-кластере microk8s с 3 узлами. Мои три узла — это виртуальные машины, которые я просто останавливаю, чтобы имитировать жесткое отключение и посмотреть, продолжает ли работать мое приложение и/или перепланируются ли соответствующие модули с небольшим временем простоя. Теперь мне кажется, что функционирование кластера зависит от того, какой узел я останавливаю , и я понятия не имею, как отладить точную проблему. Я считаю, что моя проблема может быть связана с тем, где работают контроллеры для DNS, сети и балансировки нагрузки, но я не совсем уверен.
Я использую Ubuntu 20.04.5 LTS с microk8s v1.25.2 из ветки 1.25/stable. Для тестирования я запускаю только развертывание nginx с 2 репликами и соответствующей службой LoadBalancer для отправки GET-запросов в качестве замены для моего приложения. Включены следующие microk8s-аддоны:
dns # (core) CoreDNS
ha-cluster # (core) Configure high availability on the current node
metallb # (core) Loadbalancer for your Kubernetes cluster
Чтобы kubernetes мог довольно быстро справляться с потерей узла, я скорректировал следующие параметры в/var/snap/microk8s/current/args/
kube-apiserver:
--default-not-ready-toleration-seconds=10
--default-unreachable-toleration-seconds=10
kube-controller-manager:
--pod-eviction-timeout=10s
--node-monitor-grace-period=10s
--node-monitor-period=3s
kubelet:
--node-status-update-frequency 5s
С этими параметрами kubernetes реализует намного быстрее (чем по умолчанию), когда узел не работает, а затем переназначает модули на «Готовые» узлы. У меня нет подов, управляемых statefulsets, поэтому не запрещено перепланировать любой из подов.
Затем мне не терпелось поставить галочку в моем списке TODO — быстрое восстановление после отказа, казалось, работало — пока я не провел еще несколько тестов, останавливая узлы (всегда только по одному за раз), и обнаружил, что иногда два или даже все три узла становятся неактивными . «Не готов» (я всегда слежу за своими узлами и модулями, запуская
Поскольку я выполняю эти тесты вручную — останавливая один узел, ожидая, что произойдет с узлами и модулями в kubectl-output — я не совсем уверен, в чем проблема, т.е. моя статистика плохая, но мне кажется , что если «контроллер»-модули критических надстроек находятся на одном узле и этот узел остановлен, кластер не сможет восстановиться(быстрый). Например, только что у меня были поды (сокращенные имена) calico-kube-controllers (cni), coredns (dns) и контроллер (loadbalancer) (все они не имеют дополнительных реплик) на узле-2. Затем остановка узла-2 привела к тому, что все три узла перешли в состояние «Не готов» примерно через минуту (запросы nginx были успешно выполнены примерно на 50% после остановки одного узла, как и следовало ожидать). Примерно через 15 минут два неостановленных узла снова стали «Готовыми», а модули «контроллер» (и одна из реплик nginx) были переназначены на эти узлы, и все было в порядке. Тем не менее, у меня были такие дистрибутивы подов раньше, и иногда только два или (в ожидаемом случае) один узел переходят в состояние «Не готов», иногда, даже если поды перепланируются, они попадают в CrashBackoffLoops на своем новом узле без восстановления. И,
Я попытался определить проблему с помощью
В общем, я потерян. Я не знаю, где искать и на что точно определить проблему (ы), я не знаю, связана ли проблема вообще с «контроллерами»-модулями, и я, честно говоря, немного озадачен тем, что это даже заявляет проблема (я думал иметь эту работу и есть смысл микрок8с с ха-кластером, ну и вообще к8с). Так что, если кто-нибудь может намекнуть мне в правильном направлении, я был бы очень признателен.