Kubernetes 滚动更新无需停机?

标签 kubernetes patch downtime kubernetes-statefulset live-update

根据 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 probe 告诉 kubernetes Controller 管理器该 pod 已准备好处理请求,您可以开始向其发送请求。

    在进行零停机升级时非常重要的原因是假设您有两个 statefulset 副本,并且您在没有准备就绪探针集的情况下开始滚动升级。 kubernetes 会以相反的顺序删除 pod 并使其进入运行状态并将其标记为就绪并终止另一个 pod。现在假设您的容器进程在那段时间没有出现,将没有 pod 来处理请求,因为一个 pod 还没有完全准备好,kubernetes 已经终止了另一个 pod 进行升级过程,因此数据丢失。
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
      successThreshold: 1
    

    编辑:在我的情况下,我使用以下 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
                 }
          }
    

    这是在 statefulset 容器中设置就绪探针的方法。我将就绪探针设置为 linux command , 如果您有 http 探针,则情况会有所不同。

    关于Kubernetes 滚动更新无需停机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54309631/

    相关文章:

    docker - 在 docker swarm 中推出更新

    node.js - 在 kubernetes 上使用主机作为 localhost 公开 Node js 应用程序

    kubernetes - 版本 "v1"中的 Secret 不能作为 Secret : v1. Secret.Data : ReadMapCB: expect { or n, but found ",在 #10 字节中发现错误

    javascript - 修补 StockForecasted Javascript Odoo

    windows-vista - 如何防止 Vista 在 patch.exe 上要求提升?

    postgresql - 在没有停机的情况下将 `int` 迁移到 PostgresQL 中的 `bigint`?

    azure - 错误: Rotate certificates in Azure Kubernetes Service (AKS)

    kubernetes - 如何手动恢复 PV

    python 模拟 : mock. patch.object 陷阱