部分推出Kubernetes Pod

时间:2018-07-29 10:10:58

标签: docker kubernetes google-cloud-platform

我有1个节点和3个容器。我想在三个Pod中的一个中推出新图像,而其他2 Pod与旧图像保持一致。有可能吗?

第二个问题。我尝试推出一个包含错误的新图像,并且我已经定义了maxUnavailable。但是kubernetes仍然可以部署所有Pod。我认为,一旦kubernetes在第一个Pod中发现错误,kubernetes将停止推出整个Pod。我们需要手动停止推出吗?

这是我的部署脚本。

# Service setup
apiVersion: v1
kind: Service
metadata:
  name: semantic-service
spec:
  ports:
    - port: 50049
  selector:
    app: semantic
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: semantic-service
spec:
  selector:
    matchLabels:
      app: semantic
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: semantic
    spec:
      containers:
      - name: semantic-service
        image: something/semantic-service:v2

2 个答案:

答案 0 :(得分:0)

正如@David Maze在评论中所写,您可以考虑使用canary,在其中可以区分不同版本的部署或具有多个标签的同一组件的配置,然后跟踪这些标签并指向不同的版本,有关Canary deployments的更多信息,请参见here。实现目标的另一种方法是Blue/Green deployment,以防万一,您想使用两个完全相同的不同环境,并通过全面的方法随时在蓝/绿环境和回滚部署之间进行切换。

回答第二个问题取决于给定图像包含哪种错误以及Kubernetes如何在Pod中识别此问题,因为maxUnavailable: 1参数指出了在更新期间不可用的Pod的最大数量。在群集部署控制器中的Deployment update过程中,创建一个新Pod,然后假定可用Pod的数量与rollingUpdate策略参数匹配,则删除旧Pod。

此外,Kubernetes使用liveness/readiness probes来检查Pod在部署更新期间是否准备就绪(处于活动状态),并使旧Pod保持运行状态,直到在新副本上probes成功为止。我建议在部署尝试在整个集群Pod中推出更新时,检查probes以确定Pod的状态。

答案 1 :(得分:0)

关于问题1:

我有1个节点和3个容器。我想在其中的1个中推出新图像 三个豆荚,另外两个豆荚与旧图像保持一致。是吗 可能吗?

答案:
将策略中的maxSurge更改为0

replicas: 3
strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1 <------ From the 3 replicas - 1 can be unavailable
      maxSurge: 0       <------ You can't have more then the 3 replicas of pods at a time

关于问题2:

我尝试推出包含错误的新图像,但我已经 定义maxUnavailable。但是kubernetes仍然可以部署所有Pod。一世 曾经认为kubernetes将停止推出整个豆荚 kubernetes在第一个pod中发现一个错误。我们需要手动操作吗 停止推出?

A)为了使kubernetes停止推出整个Pod,请使用minReadySeconds指定应将创建的Pod考虑多少时间ready(使用建议使用诸如“ @Nick_Kh”这样的活跃性/就绪性探针。 如果在minReadySeconds间隔完成之前其中一个探测失败,则将阻止所有部署。

因此,结合使用maxSurge = 0minReadySeconds的设置以及活跃性/就绪性探测,可以实现所需的状态: 3个窗格:2个包含旧图像,1个窗格与新图片

B)如果是A,则无需手动停止推广。

但是如果必须这样做,可以运行:

$ kubectl rollout pause deployment <name>

调试无法正常运行的Pod,并采取相应措施。

如果您决定恢复部署,则可以运行:

$ kubectl rollout undo deployment <name> --to-revision=1

(使用$ kubectl rollout history deployment <name>查看修订)。

请注意,pause d推出后,您需要使用以下方法resume

$ kubectl rollout resume deployment <name>

即使您决定undo并返回上一个修订版。