Kubernetes 滚动更新无需停机?

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

Pra*_*dha 5

是的,要实现零停机statefulsets升级,您应该具备所有提到的要点:

  1. .spec.updateStrategy 设置 RollingUpdate
  2. .spec.podManagementPolicy设置为OrderedReady默认情况下OrderedReady
  3. .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 探针,那么它会有所不同。