是的,要使statefulsets
升级停机时间为零,您应该具备提到的所有要点:
.spec.updateStrategy
调成RollingUpdate
.spec.podManagementPolicy
OrderedReady
默认设置为OrderedReady
.spec.replicas
设置为最小值 2。
另一个,你需要确保你的 statefulset 没有停机时间是正确的readiness
探针集。探针告诉 kubernetes 控制器管理器该readiness
pod 已准备好为请求提供服务,您可以开始向它发送请求。
在进行零停机升级时它非常重要的原因是假设您有两个 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 探针,那么它会有所不同。