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>

results matching ""

    No results matching ""