是的,要使statefulsets升级停机时间为零,您应该具备提到的所有要点:
.spec.updateStrategy调成RollingUpdate
.spec.podManagementPolicyOrderedReady默认设置为OrderedReady
.spec.replicas设置为最小值 2。
另一个,你需要确保你的 statefulset 没有停机时间是正确的readiness探针集。探针告诉 kubernetes 控制器管理器该readinesspod 已准备好为请求提供服务,您可以开始向它发送请求。
在进行零停机升级时它非常重要的原因是假设您有两个 statefulset 副本,并且您在没有准备好探测集的情况下开始滚动升级。kubernetes 会以相反的顺序删除 pod 并使其进入运行状态并将其标记为就绪并终止另一个 pod。现在假设您的容器进程在那个时间没有出现,将没有 pod 来服务请求,因为一个 pod 还没有完全准备好,kubernetes 已经终止了另一个 pod 进行升级过程,因此数据丢失。
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
编辑:在我的情况下,我用于滚动更新 statefulsets 的以下 json 片段:
"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 探针,那么它会有所不同。