【问题标题】:Kubernetes deployment not doing rolling updateKubernetes 部署不进行滚动更新
【发布时间】:2016-07-12 04:56:13
【问题描述】:

我在 Kubernetes 中有以下部署:

 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
   labels:
     run: hello-node
   name: hello-node
   namespace: default
 spec:
   replicas: 2
   selector:
     matchLabels:
       run: hello-node
   strategy:
     rollingUpdate:
       maxSurge: 2
       maxUnavailable: 0
     type: RollingUpdate
   template:
     metadata:
       creationTimestamp: null
       labels:
         run: hello-node
     spec:
       containers:
       - image: <image>:<tag>
         imagePullPolicy: Always
         name: hello-node
         livenessProbe:
           httpGet:
             path: /rest/hello
             port: 8081
           initialDelaySeconds: 15
           timeoutSeconds: 1
         ports:
         - containerPort: 8081
           protocol: TCP
         resources:
           requests:
             cpu: 400m
         terminationMessagePath: /dev/termination-log
       dnsPolicy: ClusterFirst
       restartPolicy: Always
       securityContext: {}
       terminationGracePeriodSeconds: 30

问题是,当我更新我的部署以假设我的映像的新版本时,Kubernetes 将立即用旧映像杀死两个 pod,并用新映像带来两个新 pod。在新 pod 启动时,我遇到了服务中断。

由于rollingUpdatelivenessProbe 我期待Kubernetes 执行以下操作:

  1. 使用新映像启动一个 pod
  2. 等待基于livenessProbe 的新 pod 运行良好
  3. 用旧图像杀死一个 pod
  4. 重复直到所有 pod 都迁移完毕

我在这里遗漏了什么?

【问题讨论】:

    标签: amazon-web-services kubernetes


    【解决方案1】:

    您需要的是readinessProbe

    初始延迟前Liveness的默认状态为Success,而初始延迟前Readiness的默认状态为Failure

    如果您希望在探测失败时终止并重新启动容器,请指定 LivenessProbeAlwaysOnFailure 中的 RestartPolicy

    如果您希望仅在探测成功后才开始向 Pod 发送流量,请指定 ReadinessProbe

    更多详情请见container probes

    要具有您描述的滚动更新行为,请将maxSurge 设置为1(默认值)。这告诉部署“一次最多扩展一个副本”。有关详细信息,请参阅docs of maxSurge

    【讨论】:

    • 谢谢。 readinessProbe 确实帮助中断了服务。现在k8s 将启动 2 个新 pod,等待它们准备好,当它们准备好时,它将杀死 2 个旧 pod。这更好,但我仍然没有得到滚动更新行为。知道为什么吗?
    • 您能否详细说明“未获得滚动更新行为”?请注意,.strategy.rollingUpdate.maxSurge 设置为 2maxUnavailable 设置为 0,这意味着您希望 Deployment 最多有 4 个副本和至少 2 个可用副本(因为您没有设置 @987654343 @ 这意味着 2 个正在运行的副本)。所以你看到的是预期的。
    • 从 Kubernetes 网站上的视频中,我了解到,在滚动更新期间,kubernetes 会在删除旧 pod 和添加新 pod 之间交替进行。如果有 3 个 pod,它将是 [3,0]、[2.1]、[1,2]、[0,3]。因此,有一段时间,流量由两个版本的服务提供服务。我知道以旧的滚动更新方式(即不使用部署对象)有一个参数来定义每次更新之间的时间段。我错过了吗?
    • 我猜你的意思是--update-period 标志kubectl rolling-update。如果您希望新 pod 在准备好后等待一段时间,然后再考虑可用,请设置 minReadySeconds。如果您希望它一个一个地放大/缩小新/旧副本,您可以将maxSurge 设置为 1(默认值)。由于您告诉部署一次再扩展 2 个,因此它按预期运行。见deployment's doc on maxSurge
    • 好的,非常感谢,我误解了maxSurge 是什么。您可以在答案中添加有关maxSurge 的详细信息吗?那我就可以接受答案了。
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多