Deployment滚动更新

创建Deployment

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  progressDeadlineSeconds: 600
  replicas: 10
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx-deployment
  strategy:
    rollingUpdate:
      # 升级过程中最多比replicas多出的新增Pod数量
      maxSurge: 25%
      # 升级过程中最多的无法提供服务的Pod数量
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
        - name: nginx-deployment
          image: nginx:1.9
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80

创建应用

kubectl create -f nginx-deployment.yaml

更新镜像

kubectl set image deploy/nginx-deployment nginx-deployment=nginx:1.9.3

滚动更新过程

观察rs变化
kubectl get rs -w

1. 创建newRS,设置replicas是3。

// 10*25%=2.5
// 向上取整为3
maxSurge = replicas * deployment.spec.strategy.rollingUpdate.maxSurge

2. 缩容oldRS,设置replicas是8。

// 10*0.25=2.5
// 向下取整为2
maxUnavailable = replicas * deployment.spec.strategy.rollingUpdate.maxUnavailable

3. newRS不断增加到10个,oldRS不断减少到0个。变化过程中,Pod总数控制在13个以内,正常Pod控制在8个以上。

// 8 = 10 - 2
minAvailable := *(deployment.Spec.Replicas) - maxUnavailable

问题:数量2的deploy无法滚动更新

deploy数量2的pod部署在反亲和的仅有的2个节点上,滚动更新时新pod会一直Pending,旧pod不会进入Terminating。
因为2*0.25向下取整是0,正常pod保持在2个以上,只有新pod正常了,才会删除老pod。
修改滚动更新配置,不按百分比,按数量。

strategy:
  rollingUpdate:
  # 升级过程中最多比replicas多出的新增Pod数量
  maxSurge: 1
  # 升级过程中最多的无法提供服务的Pod数量
  maxUnavailable: 1
  type: RollingUpdate

滚动更新时,旧pod会进入Terminating。

posted on 2023-02-05 15:01  王景迁  阅读(43)  评论(0编辑  收藏  举报

导航