我有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
答案 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 = 0
和minReadySeconds
的设置以及活跃性/就绪性探测,可以实现所需的状态: 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
并返回上一个修订版。