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