根据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服务?
答案 0 :(得分:1)
是的,statefulsets
升级的停机时间为零,所以您应该提到所有要点:
.spec.updateStrategy
设置为RollingUpdate
.spec.podManagementPolicy
设置为OrderedReady
,默认情况下为OrderedReady
.spec.replicas
设置为最低2。另外,要确保状态集没有停机,您需要做的事情是正确的readiness
探针集。 readiness
探测告诉kubernetes控制器管理器该Pod已准备好处理请求,您可以开始向其发送请求。
进行零停机时间升级时非常重要的原因是,假设您有两个副本的statefulset,并且在没有准备就绪探针集的情况下开始了滚动升级。 kubernetes将以相反的顺序删除容器,使其处于运行状态,并将其标记为就绪并终止另一个容器。现在让我们说您的容器流程在那个时候没有出现,因为没有一个容器可以满足请求,因为一个容器尚未完全准备就绪,而kubernetes已经终止了另一个容器进行升级,因此导致数据丢失。
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
}
}
这是您可以在statefulset容器中设置就绪探针的方法。我将就绪探针设置为linux command
,如果您有http探针,那么它将有所不同。
答案 1 :(得分:1)
我同意@ {Prafull Ladha,这是readinessProbe
的主要角色,以保证在RollingUpdate
期间创建的新Pod可以随时接受请求,然后再终止旧Pod。
但是,您还可以通过指定适当的可选参数来控制滚动更新过程,如官方Kubernetes documentation中所述。