当需要升级集群中的某个服务时,需要停止该服务相关的Pod,pull最新的docker镜像,然后重新启动。 如果一下把所有Pod都停止,服务在升级的时间内会不可用。因此,Kubernetes提供了滚动升级的功能。
kubectl rolling-update命令滚动升级
集群中有下面的RC:
tomcat-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: tomcat
spec:
replicas: 5
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:7
ports:
- containerPort: 8080kubectl get pod -o wide | grep tomcat
tomcat-0f1bc 1/1 Running 0 7s 10.244.3.15 cent1
tomcat-4l3s3 1/1 Running 0 7s 10.244.2.12 cent2
tomcat-6zw8s 1/1 Running 0 7s 10.244.3.14 cent1
tomcat-9mmfg 1/1 Running 0 7s 10.244.2.11 cent2
tomcat-q728k 1/1 Running 0 7s 10.244.3.13 cent1现在需要升级tomcat这个RC下的Pod,这里的需求只是将tomcat镜像从7升级到8:
kubectl rolling-update tomcat --image=tomcat:8
Created tomcat-d88a9205146d65acff8e0543aa3b6b62
Scaling up tomcat-d88a9205146d65acff8e0543aa3b6b62 from 0 to 5, scaling down tomcat from 5 to 0 (keep 5 pods available, don't exceed 6 pods)
Scaling tomcat-d88a9205146d65acff8e0543aa3b6b62 up to 1
Scaling tomcat down to 4
Scaling tomcat-d88a9205146d65acff8e0543aa3b6b62 up to 2
Scaling tomcat down to 3
Scaling tomcat-d88a9205146d65acff8e0543aa3b6b62 up to 3
Scaling tomcat down to 2
Scaling tomcat-d88a9205146d65acff8e0543aa3b6b62 up to 4
Scaling tomcat down to 1
Scaling tomcat-d88a9205146d65acff8e0543aa3b6b62 up to 5
Scaling tomcat down to 0
Update succeeded. Deleting old controller: tomcat
Renaming tomcat to tomcat-d88a9205146d65acff8e0543aa3b6b62
replicationcontroller "tomcat" rolling updated从上面命令的输出可以看出,升级过程是先创建一个新版的Pod,然后再停止一个旧版本的Pod,逐步完成整个RC的更新。 升级完成后,查看rc:
kubectl get rc tomcat -o wide
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
tomcat 5 5 5 5m tomcat tomcat:8 app=tomcat,deployment=d88a9205146d65acff8e0543aa3b6b62可以看到RC增加了一个deployment=88a9205146d65acff8e0543aa3b6b62的Label,是由RC的内容HASH计算得到的,作为签名用于表示RC是否发生变化。
如果滚动升级过程中发现问题,可以回滚:
kubectl rolling-update tomcat --image=tomcat:7 --rollback