【问题标题】:Kubernetes rolling update without downtime?Kubernetes 滚动更新不停机?
【发布时间】:2019-06-16 00:05:26
【问题描述】:

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

【问题讨论】:

    标签: kubernetes patch downtime kubernetes-statefulset live-update


    【解决方案1】:

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

    1. .spec.updateStrategy 设置为 RollingUpdate
    2. .spec.podManagementPolicy 设置为 OrderedReady,默认为 OrderedReady
    3. .spec.replicas 设置为最小值 2。

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

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

    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
      successThreshold: 1
    

    编辑:在我的情况下,我使用以下 json sn-p 滚动更新 statefulsets:

     "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
                 }
          }
    

    这是您在有状态集容器中设置就绪探测的方法。我将就绪探针设置为linux command,如果您有http探针,那么它会有所不同。

    【讨论】:

    • 请通过以下链接了解如何进行零停机升级medium.com/platformer-blog/…
    • 这些参数仅适用于 Deployment。不是 StatefulSet。
    • 我已经更新了我的答案。您也可以在 statefulset 中使用就绪探针。我添加了用于升级 statefulsets 的 sn-p
    • 根据github.com/ubuntu/microk8s/issues/294,这些参数不是用于StatefulSet,仅用于Deployment..?
    • 不能在rollingupdate策略中设置maxUnavailablemaxSurge参数不适用于statefulsets。我在就绪探测中提到的参数适用于有状态集。
    【解决方案2】:

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

    【讨论】:

    • 这些参数仅适用于 Deployment。不是 StatefulSet。
    • 是的,你对有状态集是正确的,它不适用,只是Partitions
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多