Kok*_*Teh 4 patch downtime live-update kubernetes kubernetes-statefulset
根据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探头告诉kubernetes控制器经理,这荚准备服务请求,并可以开始发送请求给它。
在进行零停机升级时非常重要的原因是假设您有两个 statefulset 副本,并且您在没有准备就绪探针集的情况下开始滚动升级。kubernetes 会以相反的顺序删除 pod 并使其进入运行状态并将其标记为就绪并终止另一个 pod。现在假设您的容器进程在那段时间没有出现,将没有 pod 来处理请求,因为一个 pod 还没有完全准备好,kubernetes 已经终止了另一个 pod 进行升级过程,因此数据丢失。
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
Run Code Online (Sandbox Code Playgroud)
编辑:在我的情况下,我使用以下 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
}
}
Run Code Online (Sandbox Code Playgroud)
这是在 statefulset 容器中设置就绪探针的方法。我将就绪探针设置为linux command,如果您有 http 探针,那么它会有所不同。
| 归档时间: |
|
| 查看次数: |
2699 次 |
| 最近记录: |