6

根据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 提供服务?

4

2 回答 2

7

是的,要使statefulsets升级停机时间为零,您应该具备提到的所有要点:

  1. .spec.updateStrategy调成RollingUpdate
  2. .spec.podManagementPolicyOrderedReady默认设置为OrderedReady
  3. .spec.replicas设置为最小值 2。

另一个,你需要确保你的 statefulset 没有停机时间是正确的readiness探针集。探针告诉 kubernetes 控制器管理器该readinesspod 已准备好为请求提供服务,您可以开始向它发送请求。

在进行零停机升级时它非常重要的原因是假设您有两个 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 探针,那么它会有所不同。

于 2019-01-22T14:33:59.500 回答
1

我同意@Prafull Ladha 的观点,readinessProbe这里的主要作用是保证在此期间创建的新 podRollingUpdate已准备好在终止旧 pod 之前接受请求。但是,您也可以通过指定适当的可选参数来控制滚动更新过程,如官方 Kubernetes文档中所述。

于 2019-01-23T11:14:50.420 回答