在Kubernetes中,Rolling Update 是一种用于在不中断服务的情况下更新应用程序的策略。它通过逐步替换旧版本的Pods来实现无缝更新。
举个例子,一个deployment中有10个nginx1.17版本的pod副本,当想将这个nginx版本进行升级到1.18,我们想的当然是不能所有pod一起更新,最好是能下线一部分,上线一部分,按照这样的轮询,直至将所有的pod更新完毕,以免影响pod的对外服务业务。
Rolling Update示例场景
假设我们有一个运行nginx的Deployment,现在想要更新nginx的镜像版本。
初始Deployment YAML文件
首先,我们创建一个名为nginx-deployment.yaml
的Deployment文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: m.daocloud.io/docker.io/nginx:1.17.9 # 使用nginx的1.17.9版本
ports:
- containerPort: 80
创建Deployment:
kubectl apply -f nginx-deployment.yaml
更新Deployment以进行Rolling Update
现在,我们想要将nginx的镜像更新到1.18.0版本。为此,我们只需修改nginx-deployment.yaml
文件中的image
字段,然后使用kubectl apply
命令应用更改。
修改后的nginx-deployment.yaml
文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: m.daocloud.io/docker.io/nginx:1.18.0 # 更新为nginx的1.18.0版本
ports:
- containerPort: 80
然后,使用以下命令应用更改:
kubectl apply -f nginx-deployment.yaml
Rolling Update过程
当您运行kubectl apply
命令时,Kubernetes会启动Rolling Update过程。这个过程大致如下:
- 创建新Pod:Kubernetes会首先创建一个新的Pod,使用更新后的镜像(nginx:1.18.0)。
- 逐步替换旧Pod:一旦新Pod成功启动并运行,Kubernetes会开始逐步替换旧的Pod。默认情况下,它会每次替换一个Pod,以确保集群中的Pod数量始终保持不变(在本例中为3个)。
- 验证新Pod:在替换每个旧Pod之前,Kubernetes会等待新Pod变得“就绪”(即能够通过 readiness probe,如果有的话)。
- 完成更新:一旦所有旧Pod都被新Pod替换,Rolling Update过程就完成了。
您可以使用以下命令查看Rolling Update的进度:
kubectl rollout status deployment/nginx-deployment
或者,您可以查看Pod的状态来观察Rolling Update的进展:
kubectl get pods -l app=nginx -w
这个命令会显示所有带有app=nginx
标签的Pod,并实时更新它们的状态。您会看到旧的Pod被终止,新的Pod被创建和启动。
maxSurge和maxUnavailable
那带来一个问题,我如何确认10个pod每次更新的数量呢?其实是有2个参数可以调节的。
在Kubernetes中,maxSurge
和 maxUnavailable
是与滚动更新(rolling update)策略相关的两个参数,用于控制更新过程中Pod的增加和减少。这两个参数可以帮助你更精细地控制更新过程,以避免服务中断或性能下降。
maxSurge
maxSurge
指定了在滚动更新过程中可以超过期望的副本数(Replicas)的最大Pod数量。它可以是绝对数(例如,5),也可以是相对于期望副本数的百分比(例如,25%)。默认值是25%,意味着在滚动更新过程中,最多可以临时增加到期望副本数的25%的额外Pod数量。
例如,如果你有一个Deployment,其副本数设置为10个Pod,那么在滚动更新过程中,最多可以有3个额外的Pod(10 * 25% = 2.5,取整为3)同时运行。
maxUnavailable
maxUnavailable
指定了在滚动更新过程中可以比期望的副本数少的最小Pod数量。它同样可以是绝对数或相对于期望副本数的百分比。默认值是25%,意味着在滚动更新过程中,最多可以减少到期望副本数的25%的Pod数量。
例如,对于上述10个Pod的Deployment,最多可以减少3个Pod(10 * 25% = 2.5,取整为2)。
示例配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 10
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 允许的最大额外Pod数或百分比
maxUnavailable: 1 # 允许的最大不可用Pod数或百分比
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: m.daocloud.io/docker.io/nginx:1.17.9 # 使用nginx的1.17.9版本
ports:
- containerPort: 80
在这个配置中,strategy.rollingUpdate.maxSurge
和 strategy.rollingUpdate.maxUnavailable
参数用于控制滚动更新的行为:
-
maxSurge
:指定在滚动更新过程中可以同时存在的额外Pod数(相对于期望的副本数)。这可以是一个具体的数字,也可以是一个百分比(格式为XX%
)。在本例中,我们设置为1,意味着在更新过程中最多可以同时存在11个Pod(10个旧Pod + 1个新Pod)。 -
maxUnavailable
:指定在滚动更新过程中可以同时处于不可用状态的Pod数(相对于期望的副本数)。这同样可以是一个具体的数字,也可以是一个百分比。在本例中,我们设置为1,意味着在更新过程中最多可以有1个Pod处于不可用状态。