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
Другие вопросы по тегам