要想在升级 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 片段:
"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命令
,如果您使用的是http探针,则会不同。