11. Kubernetes - Deployment
Deployment
已经知道 ReplicaSet 控制器是用来维护集群中运行的 Pod 数量,但生产中一般不会直接使用它,而是会使用更上层封装的控制器,比如 Deployment。
Deployment(部署),和名字一样,其核心的功能就是实现了 Pod 的滚动更新。这对于线上的服务做到不中断发布非常重要。
通过命令可以查看到 Deployment 的资源清单参数(deployment 可以像 replicaset 一样简写为 deploy):
kubectl explain deploy
以一个 Deployment 的资源清单为例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
namespace: default
# 这里的标签只是起着说明和描述作用
labels:
serviceName: nginx
version: v1.0
spec:
# 等待指定时间后才升级,默认 0,意味着容器启动起来后就提供服务,在某些情况下可能会造成服务不正常
minReadySeconds: 10
# 副本数
replicas: 3
# 历史版本保留个数,用于回滚
revisionHistoryLimit: 10
# 标签选择器
selector:
matchLabels:
app: nginx
env: prod
# 更新策略
strategy:
# 支持 RollingUpdate(滚动更新)和 Recreate(重建)
type: RollingUpdate
# 滚动更新策略配置
rollingUpdate:
# 滚动更新过程中,不可用的副本数或者占期望值的最大比例,可以是具体值也可以是百分比
maxUnavailable: 1
# 滚动更新过程中,副本总数超过期望值的上限,可以是具体值也可以是百分比,两个值不能同时为 0
maxSurge: 1
# Pod 模板
template:
metadata:
labels:
app: nginx
env: prod
spec:
containers:
- name: nginx-containers
image: nginx:1.7.9
ports:
- containerPort: 80
配置方式和 ReplicaSet 几乎一致,只是多了 strategy 更新策略的配置。
查看创建的相关信息:
# 获取创建的 Deployment
kubectl get deploy
# 获取 Deployment 管理的 RS
kubectl get rs
# 获取 Deployment 详细信息
kubectl describe deploy deploy-nginx
# 获取 RS 详细信息
kubectl describe rs deploy-nginx-6bf679967d
# 查看相关 Pod 详细信息
kubectl describe pod deploy-nginx-6bf679967d-nzr86
通过上面的查看方式可以发现:
- Deployment 详细信息中
Annotations
中的revision
表示当前的版本。会面可以根据它实现版本回滚。 - ReplicaSet 详细信息中的
Controlled By: Deployment/deploy-nginx
说明了它是被 Deployment 管理的资源对象。 - Pod 详细信息中的
Controlled By: ReplicaSet/deploy-nginx-6bf679967d
说明了实际是 ReplicaSet 管理 Pod。
Deployment、ReplicaSet,Pod 的关系如图所示:
Deployment 中的容器重启策略必须是 restartPolicy=Always
。因为容器必须始终保证自己处于 Running 状态,ReplicaSet 才可以去明确调整 Pod 的个数。
Deployment 通过管理 ReplicaSet 的数量和属性来实现 水平扩展/收缩
以及 滚动更新
。
水平伸缩
水平扩展 / 收缩一般有两种方式:
- 修改资源清单中 Pod 副本数量,然后 apply,让 ReplicaSet 去更新。也可以通过命令来直接修改 Deployment 的镜像:
# 直接设置某些配置
kubectl set image deploy deploy-nginx nginx=nginx:1.9.1
# 直接编辑配置修改
kubectl edit deploy deploy-nginx
- 过命令行指定副本数进行扩缩容:
kubectl scale deploy deploy-nginx --replicas=4
通过命令进行的修改更适合临时调整,因为下一次修改资源清单 apply 的时候就会按照资源清单中定义重新变回原来的样子。
滚动更新
相对于 ReplicaSet 的资源配置清单,Deployment 中主要新增了滚动更新相关参数:
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
参数说明:
minReadySeconds
:等待指定的时间后才进行升级,默认为 0。- 配置这个值的作用在于,某些应用可能启动完成后过几秒钟就挂了,如果直接就接入流量过去,可能出现服务无法访问。
type=RollingUpdate
:设置更新策略为滚动更新。- 支持
Recreate(重新创建,一次性杀掉全部 Pod,然后启动一批新的)
和RollingUpdate(滚动更新)
两个值。默认 RollingUpdate。
- 支持
maxSurge
:升级过程中最多可以比原先设置多出的 Pod 数量。- 例如 maxSurage=1,replicas=5,更新就会先启动一个新的 Pod,完成后才删掉一个旧的 Pod,整个升级过程中最多会有 6 个 Pod。
maxUnavaible
:升级过程中最多有多少个 Pod 处于无法提供服务的状态,当 maxSurge 不为 0 时,该值也不能为 0。- 例如 maxUnavaible=1,则整个升级过程中最多会有 1 个 Pod 处于无法服务的状态。
滚动更新示意图:
滚动更新其实就是 Deployment 新建一个 ReplicaSet,然后滚动着慢慢往新的 RS 中迁移。
版本回滚
通过调整 Deployment 的资源清单多执行几次发布,然后查看历史版本:
# 查看历史版本
kubectl rollout history deploy deploy-nginx
# 查看更新过程
kubectl rollout status deploy deploy-nginx
# 暂停更新
kubectl rollout pause deploy deploy-nginx
# 恢复更新
kubectl rollout resume deploy deploy-nginx
# 查看指定历史版本的信息
kubectl rollout history deploy deploy-nginx --revision=1
# 回滚到上个版本
kubectl rollout undo deploy deploy-nginx
# 回滚到指定版本
kubectl rollout undo deploy deploy-nginx --to-revision=1
如果资源清单跟历史的某个版本调整为一致,Kubernetes 就会认为是在做回滚。