一、Deployment的升级二、Deployment更新Pod流程
当集群中的某个服务需要升级时,需要停止目前与该服务相关的所有Pod,然后下载新版本镜像并创建新的Pod。集群规模比较大,需要先全部停止然后逐步升级的方式会导致较长时间的服务不可用。K8s提供了滚动升级功能来解决上述问题。
Pod是通过Deployment创建的,则用户可以在运行时修改Deployment的Pod定义(spec.template)或镜像名称,并应用到Deployment对象上,系统即可完成Deployment的自动更新操作。如果在更新过程中发生了错误,则还可以通过回滚(Rollback)操作恢复Pod的版本。
一、Deployment的升级以Deployment nginx为例:
nginx-deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
已运行的Pod副本数量有3个:
kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-4087004473-9jqqs 1/1 Running 0 1m nginx-deployment-4087004473-cq0cf 1/1 Running 0 1m nginx-deployment-4087004473-vxn56 1/1 Running 0 1m
现在Pod镜像需要更新为Nginx:1.9.1,可以通过kubectl set image命令为Deployment设置新的镜像名称:
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 deployment "nginx-deployment" image updated
另一种更新的方法是使用kubectl edit命令修改Deployment的配置,将spec.template.spec.containers[0].image从Nginx:1.7.9更改为Nginx:1.9.1
kubectl edit deployment/nginx-deployment deployment "nginx-deployment" edited
一旦镜像名(或Pod定义)发生了修改,则将触发系统完成Deployment所有运行Pod宕滚动升级操作。可以使用kubectl rollout status命令查看Deployment的更新过程
kubectl rollout status deployment/nginx-deployment
查看当前运行的Pod,名称已经更新了
kubectl get pods
查看Pod使用的镜像,已经更新为Nginx:1.9.1了:
kubectl describe pod/nginx-deployment-3599678771-s8p21二、Deployment更新Pod流程
使用kubectl describe deployments/nginx-deployment命令仔细观察Deployment的更新过程。
初始创建Deployment时,系统创建了一个ReplicaSet,并按用户的需求创建了3个Pod副本。当更新Deployment时,系统创建了一个新的ReplicaSet,并将其副本数扩展到1,然后将旧的ReplicaSet缩减为2系统继续按照相同的更新策略对新旧两个ReplicaSet进行逐个调整。最后,新的ReplicaSet运行了3个新版本Pod副本,旧的ReplicaSet副本数则缩减为0。



