目标
用户期望应用程序始终可用,为此开发者/运维者在更新应用程序时要分多次完成。在 Kubernetes 中,这是通过 Rolling Update 滚动更新完成的。
Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机。新的 Pod 将在具有可用资源的 Node(节点)上进行调度。
Kubernetes 更新多副本的 Deployment 的版本时,会逐步的创建新版本的 Pod,逐步的停止旧版本的 Pod,以便使应用一直处于可用状态。这个过程中,Service 能够监视 Pod 的状态,将流量始终转发到可用的 Pod 上。
在上一个模块中,我们学习了将应用程序 Scale Up(扩容)为多个实例,这是执行更新而不影响应用程序可用性的前提(如果只有 1 个实例那还玩啥)。默认情况下,Rolling Update 滚动更新 过程中,Kubernetes 逐个使用新版本 Pod 替换旧版本 Pod(最大不可用 Pod 数为 1、最大新建 Pod 数也为 1)。这两个参数可以配置为数字或百分比。在Kubernetes 中,更新是版本化的,任何部署更新都可以恢复为以前的(稳定)版本。
滚动更新概述
- 原本 Service A 将流量负载均衡到 4 个旧版本的 Pod (当中的容器为 绿色)上

- 更新完 Deployment 部署文件中的镜像版本后,master 节点选择了一个 worker 节点,并根据新的镜像版本创建 Pod(紫色容器)。新 Pod 拥有唯一的新的 IP。同时,master 节点选择一个旧版本的 Pod 将其移除。此时,Service A 将新 Pod 纳入到负载均衡中,将旧Pod移除

- 同步骤2,再创建一个新的 Pod 替换一个原有的 Pod

- 如此 Rolling Update 滚动更新,直到所有旧版本 Pod 均移除,新版本 Pod 也达到 Deployment 部署文件中定义的副本数,则滚动更新完成

滚动更新允许以下操作:
使用kubectl
修改 nginx-deployment.yaml 文件
修改文件中 image 镜像的标签,如下所示
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentlabels:app: nginxspec:replicas: 4selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.8 #使用镜像nginx:1.8替换原来的nginx:1.7.9ports:- containerPort: 80
执行命令
kubectl apply -f nginx-deployment.yaml
查看过程及结果
执行命令,可观察到 pod 逐个被替换的过程。
watch kubectl get pods -l app=nginx
使用Kuboard
点击左侧菜单中的 调整镜像版本 按钮
针对 Nginx部署 点击修改填写新的 nginx 版本号: 1.8, 如下图所示:

- 点击 变更
- 点击 应用
- 点击 完成可观察到 Kubernetes 对 Nginx部署 执行滚动更新的过程,如下图所示

~~呱唧呱唧,恭喜您,即将成为k8s的大神的您,已经迈进了您k8s的最重要的一步了—入门,那么接下来请再接再厉,继续征服k8s的高峰!!!
