Kubernetes滚动更新而不会停机吗?

时间:2019-01-22 13:42:23

标签: 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服务?

2 个答案:

答案 0 :(得分:1)

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

  1. .spec.updateStrategy设置为RollingUpdate
  2. .spec.podManagementPolicy设置为OrderedReady,默认情况下为OrderedReady
  3. .spec.replicas设置为最低2。

另外,要确保状态集没有停机,您需要做的事情是正确的readiness探针集。 readiness探测告诉kubernetes控制器管理器该Pod已准备好处理请求,您可以开始向其发送请求。

进行零停机时间升级时非常重要的原因是,假设您有两个副本的statefulset,并且在没有准备就绪探针集的情况下开始了滚动升级。 kubernetes将以相反的顺序删除容器,使其处于运行状态,并将其标记为就绪并终止另一个容器。现在让我们说您的容器流程在那个时候没有出现,因为没有一个容器可以满足请求,因为一个容器尚未完全准备就绪,而kubernetes已经终止了另一个容器进行升级,因此导致数据丢失。

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

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

答案 1 :(得分:1)

我同意@ {Prafull Ladha,这是readinessProbe的主要角色,以保证在RollingUpdate期间创建的新Pod可以随时接受请求,然后再终止旧Pod。 但是,您还可以通过指定适当的可选参数来控制滚动更新过程,如官方Kubernetes documentation中所述。

相关问题