根据 https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#scaling-a-statefulset ,请问如何实现零宕机滚动更新?我想这是最低要求:
(1) .spec.updateStrategy 设置为 RollingUpdate
(2) .spec.podManagementPolicy 设置为 OrderedReady
(3) .spec.replicas 设置为 2
那正确吗?我假设当更新以相反的顺序发生时,所有到 StatefulSet 的流量都由序号较低的 pod 提供服务?
最佳答案
是的,statefulsets
的停机时间为零升级,你应该有提到的所有要点:
.spec.updateStrategy
设置为 RollingUpdate
.spec.podManagementPolicy
设置为 OrderedReady
默认情况下是 OrderedReady
.spec.replicas
设置为最小值 2。另一个,你需要确保你的 statefulset 没有停机时间是正确的
readiness
探针组。 readiness
probe 告诉 kubernetes Controller 管理器该 pod 已准备好处理请求,您可以开始向其发送请求。在进行零停机升级时非常重要的原因是假设您有两个 statefulset 副本,并且您在没有准备就绪探针集的情况下开始滚动升级。 kubernetes 会以相反的顺序删除 pod 并使其进入运行状态并将其标记为就绪并终止另一个 pod。现在假设您的容器进程在那段时间没有出现,将没有 pod 来处理请求,因为一个 pod 还没有完全准备好,kubernetes 已经终止了另一个 pod 进行升级过程,因此数据丢失。
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
编辑:在我的情况下,我使用以下 json 片段滚动更新 statefulset:
"spec": {
"containers": [
{
"name": "md",
"image": "",
"imagePullPolicy": "IfNotPresent",
"command": [
"/bin/sh",
"-c"
],
"args": [
"chmod -R 777 /logs/; /on_start.sh"
],
"readinessProbe": {
"exec": {
"command": [
"cat",
"/tmp/ready.txt"
]
},
"failureThreshold": 10,
"initialDelaySeconds": 5,
"periodSeconds": 5,
"successThreshold": 1,
"timeoutSeconds": 1
},
"securityContext": {
"privileged": true
}
}
这是在 statefulset 容器中设置就绪探针的方法。我将就绪探针设置为
linux command
, 如果您有 http 探针,则情况会有所不同。
关于Kubernetes 滚动更新无需停机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54309631/