【问题标题】:zookeeper statefulset require all instance to manually restart after upgradezookeeper statefulset 要求所有实例在升级后手动重启
【发布时间】:2021-04-22 07:39:34
【问题描述】:

我正在为我的 kafka 集群运行 3 个 zookeeper kubernetes statefulset。命名为 zookeeper-0、zookeeper-1、zookeeper-2。而且我使用 ruok 命令启用了活跃度探测。如果任何 statefulset pod 由于任何故障而重新启动,则仲裁将失败,并且即使在失败的 pod 启动并且其 liveness probe 响应正常之后,zookeeper 也会停止工作。

发生这种情况时,我必须手动重新启动所有 zookeeper 实例才能使其恢复工作。当我进行 helm 升级时也会发生这种情况。因为当我进行 helm upgrade 时,第一个重启的实例是 zookeeper-2,然后是 zookeeper-1,最后是 zookeeper-0。但似乎只有当我一起启动所有实例时,zookeeper 才会起作用。因此,每次 helm 升级后,我都必须手动重启所有实例。

我的问题是:

这种行为的原因可能是什么?另外,在 Kubernetes 环境中确保 100% 可靠的 statefulset zookeeper 的最佳方法是什么?

【问题讨论】:

标签: apache-zookeeper kubernetes-statefulset livenessprobe


【解决方案1】:

这是 zookeeper v 3.5.8 中的一个错误, https://issues.apache.org/jira/browse/ZOOKEEPER-3829 。如果有人遇到这个问题,请使用最新的 zookeeper。

当您执行 helm upgrade 时,实例将以相反的顺序部署。所以如果你有 zookeeper-0、zookeeper-1、zookeeper-2。然后zookeeper-2将首先升级,然后是zookeeper-1,最后是zookeeper-0。如果您有 5 个实例,则此问题非常明显。

因此,为了解决这个不稳定问题,我添加了 liveness 和 readiness 探测。所以当这个问题发生并自我修复时,zookeeper 会自动重启。

对于 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

如果由于某种原因你的 docker 镜像中没有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多