zookeeper statefulset требует, чтобы все экземпляры были перезапущены вручную после обновления
Я использую 3 набора состояний zookeeper kubernetes для моих кластеров kafka. Названы zookeeper-0, zookeeper-1, zookeeper-2. И у меня включен тест живучести с помощью команды ruok. Если какой-либо модуль с набором состояний будет перезапущен из-за каких-либо сбоев, кворум выйдет из строя, и zookeeper перестанет работать даже после того, как сбойный модуль запустился и его проверка живучести ответит нормально.
Когда это происходит, мне приходится вручную перезапускать все экземпляры zookeeper, чтобы он вернулся к работе. Это также происходит, когда я делаю апгрейд руля. Потому что, когда я обновляю шлем, первым перезапускается экземпляр zookeeper-2, затем zookeeper-1 и, наконец, zookeeper-0. Но похоже, что zookeeper будет работать, только если я запущу все экземпляры вместе. Поэтому после каждого обновления руля мне приходится перезапускать все экземпляры вручную.
У меня вопрос:
В чем может быть причина такого поведения? И как лучше всего обеспечить 100% надежную работу зоопарка с отслеживанием состояния в среде Kubernetes?
1 ответ
При обновлении руля экземпляры будут развернуты в обратном порядке. Итак, если у вас есть zookeeper-0, zookeeper-1, zookeeper-2. Тогда сначала будет обновлен zookeeper-2, затем zookeeper-1 и, наконец, zookeeper-0. Итак, чтобы исправить нестабильность zookeeper, я развернул 5 экземпляров, поэтому 2 экземпляра можно перезапустить / обновить в любое время без сбоев. Плюс прибавил живучесть и готовность пробника.
Для Kubernetes Statefulset:
livenessProbe:
exec:
command:
- sh
- -c
- /bin/liveness-check.sh 2181
initialDelaySeconds: 120 #Default 0
periodSeconds: 60
timeoutSeconds: 10
failureThreshold: 2
successThreshold: 1
readinessProbe:
exec:
command:
- sh
- -c
- /bin/readiness-check.sh 2181
initialDelaySeconds: 20
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 2
successThreshold: 1
Где скрипты определены в Kubernetes ConfigMap
data:
liveness-check.sh: |
#!/bin/sh
zkServer.sh status
readiness-check.sh: |
#!/bin/sh
echo ruok | nc 127.0.0.1 $1
Если по какой-то причине у вас нет скрипта zkServer.sh в образе докера, вы можете определить карту конфигурации следующим образом
readiness-check.sh: |
#!/bin/sh
OK=$(echo ruok | nc 127.0.0.1 $1)
if [ "$OK" == "imok" ]; then
exit 0
else
echo "Liveness Check Failed for ZooKeeper"
exit 1
fi
liveness-check.sh: |
#!/bin/sh
echo stat | nc 127.0.0.1 $1 | grep Mode