Kubernetes滚动更新无需停机?

7
2个回答

7

要想在升级 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 片段:

 "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命令,如果您使用的是http探针,则会不同。

1
请访问以下链接了解如何进行零停机升级:https://medium.com/platformer-blog/enable-rolling-updates-in-kubernetes-with-zero-downtime-31d7ec388c81 - Prafull Ladha
这些参数仅适用于部署(Deployment),而不适用于有状态集合(StatefulSet)。 - Kok How Teh
让我们在聊天中继续这个讨论 - Prafull Ladha
不,有状态集也没有可用的就绪探针参数... :( - Kok How Teh
现在,您是否尝试使用就绪性参数升级有状态副本集的滚动更新,以便如果有状态副本集逐个升级副本并且仅在先前升级的副本已准备好提供请求时才启动下一个副本。 - Prafull Ladha
显示剩余5条评论

1

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


1
这些参数仅适用于部署(Deployment),而不适用于有状态集合(StatefulSet)。 - Kok How Teh
是的,对于有状态集(StatefulSets)来说它不适用,只有分区(Partitions)适用。 - Nick_Kh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接