声明式部署

为什么声明式部署(更新)

声明式部署模式的核心是Kubernetes的部署资源,这个抽象封装了一组容器的升级和回滚过程,且在过程的执行可以重复和自动化。

摘自Kubernetes设计模式 第三章

在版本的升级或回滚过程中很可能需要编写大量重复的脚本,在这个过程中也极易出错。使用声明式部署可以自动化地做这些事情。

声明式部署做些什么

部署的核心是按照预期启动和停止一组Pod的能力。

在部署开始时,会创建一个新的ReplicaSet用于存放更新后的Pod,然后执行更新策略,在旧的ReplicaSet中的所有Pod全部被移除,且新的ReplicaSet中的Pod全部启动成功后,Deployment将会指向新的ReplicaSet,并删除旧的ReplicaSet

Kubernetes提供了两种更新方式重新创建和滚动更新。

声明式更新的触发方式

以下3种方式可以触发声明式更新:

  • kubectl replace命令,使用旧的部署替换掉新的部署
  • 打补丁(kubectl patch)或者交互式编辑(kubectl edit),为容器设置新版本的新容器镜像
  • 使用kubectl set image,在部署中设置新镜像

重新创建

此策略会删除所有现有的Pod,然后创建新的Pod

Demo

1
2
3
4
5
6
7
...
spec:
...
strategy:
type: Recreate
...
...

格式

  • type: 必须准确写为Recreate。

滚动更新

滚动更新(RollingUpdate)是Kubernetes的默认部署方式,它能够保证不会出现停机。

不停机的实现需要就绪探针(readinessProbe),以用于确定容器真的可用。

缺点: 在更新过程中,新旧版本会同时存在,可能会造成程序的不一致。

Demo

1
2
3
4
5
6
7
8
9
10
...
spec:
...
strategy:
type: RollingUpdate
roolingUpdate:
maxSurge: 1
maxUnavailable: 1
...
...

格式

  • type: 必须准确写为RollingUpdate

  • roolingUpdate: 滚动更新的描述

    • maxUnavailable: 最大不可用,一个非负整数或百分比(百分比会被向下取整到整数),用来指定更新过程中不可用的 Pod 的个数上限。如果这个值是0,那么maxSurge不能为0。这个值的默认值为25%。

    • maxSurge: 最大峰值,一个非负整数或百分比(百分比会被向上取整到整数),用来指定可以创建的超出期望Pod个数的 Pod 数量,如果MaxUnavailable为0,则此值不为0。这个值的默认值为25%。

策略

首先会删除旧的Pod,并启动新的Pod。当一个新的Pod可用时会删除下一个旧的Pod,当一个旧的Pod停止后会启动一个新的Pod,但在这过程中,会满足maxUnavaliablemaxSurge的要求。

蓝绿部署

蓝绿部署是一种发布策略,可以最大限度减少停机风险,缺点是在过程中会需要双倍的资源,且过程中新旧版本同时处于运行状态。

使用蓝绿部署需要服务网格(Service Mesh)或者Knative等扩展,否则就需要自己写脚本。

策略

首先创建新版本的Pods,但不相应任何请求。在新版本的Pods全部成功启动后,将流量从旧版本的Pods迁移至新版本的Pods,当流量完成迁移,即可将旧版本的Pods删除

金丝雀发布

金丝雀发布是一种平滑的发布策略。使用新的实例替换掉一小部分新的实例,这种技术只让一小部分消费者使用更新后的版本,以降低迁移风险。

策略

为新版本的容器(Pod)创建一个副本集,且只包含少量副本,并将一些消费者定向到新的Pod的实例上,如果确信新版本能够符合预期地工作便可对副本集进行拓展,并减少旧的副本集直至0。

文章目录
  1. 1. 为什么声明式部署(更新)
  2. 2. 声明式部署做些什么
  3. 3. 声明式更新的触发方式
  4. 4. 重新创建
    1. 4.1. Demo
    2. 4.2. 格式
  5. 5. 滚动更新
    1. 5.1. Demo
    2. 5.2. 格式
    3. 5.3. 策略
  6. 6. 蓝绿部署
    1. 6.1. 策略
  7. 7. 金丝雀发布
    1. 7.1. 策略
|