繁体   English   中英

部分推出 Kubernetes Pod

[英]Partially Rollout Kubernetes Pods

我有 1 个节点和 3 个 pod。 我想在三个 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

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

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

此外,Kubernetes 使用活性/就绪探针在部署更新期间检查 Pod 是否准备好(活动),并使旧 Pod 保持运行状态,直到probes在新副本上成功。 当部署尝试跨集群 Pod 推出更新时,我建议检查probes以识别 Pod 的状态。

关于问题1:

我有 1 个节点和 3 个 pod。 我想在三个 pod 中的一个中推出新图像,而其他 2 个 pod 保留旧图像。 是否可以?

回答:
将您的策略​​中的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 在第一个 pod 中发现错误,kubernetes 将停止推出整个 pod。 我们是否需要手动停止发布?

A )为了让 kubernetes 停止推出整个 pod - 使用minReadySeconds指定应将创建的 pod 视为ready (使用@Nick_Kh 建议的活性/就绪探针)。
如果其中一个探测在minReadySeconds间隔结束之前失败,则所有推出将被阻止。

因此,结合maxSurge = 0以及minReadySecondsminReadySeconds / readiness 探针的设置,您可以实现所需的状态: 3 个 pod:2 个带有旧图像,1 个 pod 带有新图像

B )在 A 的情况下 - 您不需要手动停止推出。

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

$ kubectl rollout pause deployment <name>

调试不起作用的 Pod 并采取相关操作。

如果您决定恢复推出,您可以运行:

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

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

请注意,在pause发布后,您需要使用以下命令resume它:

$ kubectl rollout resume deployment <name>

即使您决定undo并返回到以前的修订版。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM