部署的难题
对开发人员来说,在部署程序的新版本之前,需要考虑很多事情:
- 如何在多台机器实现自动部署?
- 在部署的过程,如何保证服务的高可用?
- 如何知道新版本是否出现问题,健康检查要怎么做?
- 如果新版本出现问题,能够做到回滚?
很幸运,Kubernetes 提供了 Deployment 功能,帮助开发人员解决这些问题。
如何部署应用
下面的配置文件定义了一个 Deployment,其中包含两个 Nginx Pod:
接着,创建这个 Deployment:
可以观察到,这个 Deployment 管理着两个 Nginx Pod:
比较 Deployment 与 ReplicaSet
在 Kubernetes 入门指南 我们说到了 ReplicaSet,ReplicaSet 也是用来管理多个 Pod 的副本,那么 Deployment 和 ReplicaSet 的区别在哪里呢?
当我们创建了 Deployment 之后,实际上也创建了 ReplicaSet,所以说 Deployment 管理着 ReplicaSet(实际上 Deployment 比 ReplicaSet 有着更多功能)。
这里可以验证一下:
由于 ReplicaSet 可以伸缩 Pod 的数量,因此 Deployment 也可以做到:
Deployment 管理着 ReplicaSet,因此当 Deployment 伸缩时,由它管理的 ReplicaSet 也会发生伸缩:
但反过来,如果我们直接伸缩 ReplicaSet,那么 Deployment 也会相应发生伸缩吗?答案是不会的。
滚动更新
更新版本时,如何保证服务的高可用?可以借助 Deployment 的滚动更新功能,例如下面的例子中,我们将 Nginx 从1.7.9
升级到1.9.0
版本:
上述的配置文件中,我们指定更新策略为RollingUpdate
(即滚动更新)。在这种策略下,更新版本的过程是渐进性的,分多次进行,每次都只更新少数几个 Pod,直到所有 Pod 都更新完毕。
有两个参数可用用来配置滚动更新策略:
maxUnavailable
表示在更新过程中,最多有多少个 Pod 不可用(这个数值也可以是百分比,例如 20% 表示最多有 20% 的 Pod 不可用)。譬如说,如果设置maxUnavailable
为 1,那么更新过程会分多次进行,每次都是先销毁 1 个旧的 Pod,然后创建 1 个新的 Pod 替换它。- 在更新的过程,如果需要保证服务的 100% 可用,可以使用
maxSurge
,同时将maxUnavailable
设置为 0。譬如说,将maxSurge
设置为 1,同时将maxUnavailable
设置为 0,那么更新过程会分多次进行,每次都是先创建 1 个新的 Pod,如果新的 Pod 可用了,这时才会替换掉旧的 Pod。
使用下面的命令开始滚动升级:
查看升级过程的状态:
回滚
如果新版本出现问题,如何回滚呢?首先,先查看更新的历史:
可以看到,有两个版本号,可以查看某个版本的具体细节:
假设我们想回滚到上一个版本,上一个版本的版本号是 1,那么可以执行:
接着,查看更新的历史,可以看到已经成功回滚了:
版本号为 1 的那个版本不见了,说明被版本 3 替换掉了。