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。