2025,每天10分钟,跟我学K8S(二十四)- 对象属性 - Rolling Update

        在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过程。这个过程大致如下:

  1. 创建新Pod‌:Kubernetes会首先创建一个新的Pod,使用更新后的镜像(nginx:1.18.0)。
  2. 逐步替换旧Pod‌:一旦新Pod成功启动并运行,Kubernetes会开始逐步替换旧的Pod。默认情况下,它会每次替换一个Pod,以确保集群中的Pod数量始终保持不变(在本例中为3个)。
  3. 验证新Pod‌:在替换每个旧Pod之前,Kubernetes会等待新Pod变得“就绪”(即能够通过 readiness probe,如果有的话)。
  4. 完成更新‌:一旦所有旧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处于不可用状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值