[英]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
以及minReadySeconds
和minReadySeconds
/ 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.