5.3.3 升级Deployment
修改Pod模版相关的配置参数便能够完成Deployment控制器资源的更新。由于是声明式配置,因此对Deployment控制器资源的修改尤其适合使用apply和patch命令来进行;当然,如果仅是修改容器镜像,“set image”命令更为易用。
接下来通过更新此前创建的Deployment控制器deploy-example来了解更新操作过程的执行细节,为了使得升级过程更易于观察,这里使用“kubectl patch”命令为其spec.minReadySeconds
字段定一个等待时长,例如5s:
**[terminal]
**[delimiter $ ]**[command kubectl patch deployment myapp-deploy -p '{"spec": {"minReadySeconds": 5}}']
deployment.apps/myapp-deploy patched
patch命令的补丁形式为JSON格式,以-p指定选项,上面命令中的'{"spec":{"minReadySeconds": 5}}'表示设置spec.minReadySeconds
属性的值。若要改变myapp-deploy中myapp容器的镜像,也可以使用patch命令,如'{"spec": {"containers": ["name": "myapp","image": "ikubernetes/myapp:v2"]}}',不过,修改容器镜像有更为简单的专用命令“set image”。
修改Deployment控制器的minReadySeconds、replicas和strategy等字段的值并不会触发Pod资源的更新操作,因为他们不属于模板的内嵌字段,对现存的Pod对象不产生任何影响。
接着,使用“ikubernetes/myapp:v2”镜像文件修改Pod模板中的myapp容器,启动Deployment控制器的滚动更新过程:
**[terminal]
**[delimiter $ ]**[command kubectl set image deployments myapp-deploy myapp=ikubernetes/myapp:v2]
deployment.apps/myapp-deploy image updated
“kubectl rollout status”命令可用于打印滚动更新过程中的状态信息:
**[terminal]
**[delimiter $ ]**[command kubectl rollout status deployments myapp-deploy]
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "myapp-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "myapp-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "myapp-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "myapp-deploy" rollout to finish: 3 of 4 updated replicas are available...
deployment "myapp-deploy" successfully rolled out
另外,还可以使用“kubectl get deployments --watch”命令监控其更新过程中Pod对象的变动过程:
**[terminal]
**[delimiter $ ]**[command kubectl get replicasets -l app=myapp]
NAME DESIRED CURRENT READY AGE
myapp-deploy-5cbd66595b 2 2 2 45h
myapp-deploy-6685c8c7fc 3 3 1 5m10s
myapp-deplo控制器管控的Pod资源对象也将随之更新为以新版本ReplicaSet名称“myapp-deploy-6685c8c7fc”为前缀的Pod副本,命令结果如下所示:
**[terminal]
**[delimiter $ ]**[command kubectl get pods -l app=myapp]
NAME READY STATUS RESTARTS AGE
myapp-deploy-6685c8c7fc-b7c7n 1/1 Running 0 119s
myapp-deploy-6685c8c7fc-ck8l4 1/1 Running 0 2m15s
myapp-deploy-6685c8c7fc-dxv5g 1/1 Running 0 2m7s
myapp-deploy-6685c8c7fc-h4f7t 1/1 Running 0 2m15s
由于已经处于READY状态,因此上面命令列出的任一Pod资源均可正常向用户提供相关服务,例如,在集群内任一能使用kubectl的节点访问myapp-deploy-6685c8c7fc-dxv5g中的Web服务,命令如下:
**[terminal]
**[delimiter $ ]**[command curl $(kubectl get pods myapp-deploy-6685c8c7fc-b7c7n -o go-template={{.status.podIP}})]
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>