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 的关系如图所示:

image

Deployment 中的容器重启策略必须是 restartPolicy=Always 。因为容器必须始终保证自己处于 Running 状态,ReplicaSet 才可以去明确调整 Pod 的个数。

Deployment 通过管理 ReplicaSet 的数量和属性来实现 水平扩展/收缩 以及 滚动更新

水平伸缩

水平扩展 / 收缩一般有两种方式:

  1. 修改资源清单中 Pod 副本数量,然后 apply,让 ReplicaSet 去更新。也可以通过命令来直接修改 Deployment 的镜像:
# 直接设置某些配置
kubectl set image deploy deploy-nginx nginx=nginx:1.9.1

# 直接编辑配置修改
kubectl edit deploy deploy-nginx

  1. 过命令行指定副本数进行扩缩容:
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 处于无法服务的状态。

滚动更新示意图:

image

滚动更新其实就是 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 就会认为是在做回滚。

posted @ 2022-10-20 10:50  不知名换皮工程师  阅读(111)  评论(0编辑  收藏  举报