zookeeper statefulset要求所有实例在升级后手动重启
zookeeper statefulset require all instance to manually restart after upgrade
我是 运行 3 zookeeper kubernetes statefulset 我的 kafka 集群。命名为 zookeeper-0 、 zookeeper-1 、 zookeeper-2 。我使用 ruok 命令启用了 liveness probe。如果任何 statefulset pod 由于任何故障而重新启动,仲裁将失败并且 zookeeper 停止工作,即使在失败的 pod 启动并且其 liveness 探测器响应正常之后也是如此。
发生这种情况时,我必须手动重启所有 zookeeper 实例才能使其恢复工作。当我进行 helm 升级时也会发生这种情况。因为当我进行 helm 升级时,第一个重新启动的实例是 zookeeper-2,然后是 zookeeper-1,最后是 zookeeper-0。但似乎 zookeeper 只有在我一起启动所有实例时才会工作。所以每次 helm 升级后,我都必须手动重启所有实例。
我的问题是:
这种行为的原因可能是什么?另外,在 kubernetes 环境中确保 100% 可靠的 statefulset zookeeper 的最佳方法是什么?
这是 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 个实例,此问题将非常明显。
因此,为了解决这个不稳定问题,我添加了活性和就绪探测。所以当这个问题发生并自我修复时,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
如果由于某种原因 docker 图像中没有 zkServer.sh 脚本,您可以按以下方式定义配置映射
readiness-check.sh: |
#!/bin/sh
OK=$(echo ruok | nc 127.0.0.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 | grep Mode
我是 运行 3 zookeeper kubernetes statefulset 我的 kafka 集群。命名为 zookeeper-0 、 zookeeper-1 、 zookeeper-2 。我使用 ruok 命令启用了 liveness probe。如果任何 statefulset pod 由于任何故障而重新启动,仲裁将失败并且 zookeeper 停止工作,即使在失败的 pod 启动并且其 liveness 探测器响应正常之后也是如此。
发生这种情况时,我必须手动重启所有 zookeeper 实例才能使其恢复工作。当我进行 helm 升级时也会发生这种情况。因为当我进行 helm 升级时,第一个重新启动的实例是 zookeeper-2,然后是 zookeeper-1,最后是 zookeeper-0。但似乎 zookeeper 只有在我一起启动所有实例时才会工作。所以每次 helm 升级后,我都必须手动重启所有实例。
我的问题是:
这种行为的原因可能是什么?另外,在 kubernetes 环境中确保 100% 可靠的 statefulset zookeeper 的最佳方法是什么?
这是 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 个实例,此问题将非常明显。
因此,为了解决这个不稳定问题,我添加了活性和就绪探测。所以当这个问题发生并自我修复时,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
如果由于某种原因 docker 图像中没有 zkServer.sh 脚本,您可以按以下方式定义配置映射
readiness-check.sh: |
#!/bin/sh
OK=$(echo ruok | nc 127.0.0.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 | grep Mode