Kubernetes 原生的应用升级基于终态模型,一旦发布出现问题无法暂停,只能通过YAML回滚应用。为了使 Kubernetes 应用发布过程更加可控。Flow 提供了 Kubernetes 分批发布的能力,以让发布过程更加可控。
背景信息
- Kubernetes 使用 Service 在集群内暴露服务 。 
- Service 与Deployment 的 Pod 实例之间使用 Lables 进行关联,Service 的流量会转到关联的 Deployment 实例 。 
- 假设 serviceA 关联了应用 app-v1 并且其 Replicas 副本数 > 1 。分批发布开始创建 app-v2 并继承 app-v1 的所有标签,此时 serviceA 的流量会随机转发到 v1 和 v2。 
- 分批发布过程通过扩容 app-v2 和缩容 app-v1 实现应用的发布 。发布过程暂停时,用户可以选择继续发布,直到 app-v2 达到预期状态 。或者回滚移除 app-v2 并恢复 app-v1 的副本数。 
前提条件
- Deployment 上不能关联 HPA,否则会导致旧版本无法缩容,发布可能超时失败。 
- Deployment 的 labels 内包含有 Service 的全部 selector labels,例如: - --- apiVersion: apps/v1 kind: Deployment metadata: labels: run: spring-boot-sample name: spring-boot-sample spec: replicas: 2 selector: matchLabels: run: spring-boot-sample template: metadata: labels: run: spring-boot-sample spec: containers: - image: ${IMAGE} name: app --- apiVersion: v1 kind: Service metadata: name: spring-boot-service labels: test: test labele2: label spec: ports: - name: http port: 8080 protocol: TCP targetPort: 8080 - name: https port: 443 protocol: TCP targetPort: 443 selector: run: spring-boot-sample sessionAffinity: None type: ClusterIP
添加分批发布任务
在流水线Flow 控制台,选择目标流水线,添加“Kubernetes 分批发布”任务。
配置发布任务
在目标流水线任务步骤中,配置Kubernetes 分批发布任务。
| 参数 | 说明 | 
| 集群连接 | 使用集群连接,连接到自定义Kubernetes或者阿里云容器服务集群,如果第一次使用可以新建连接,详情可参见Kubernetes 服务连接。 | 
| Kubectl版本 | Kubectl 版本为当前步骤中使用的kubectl客户端版本。请选择与集群适配的Kubectl版本。 | 
| 命名空间 | 选择Kubernetes集群中目标自定义命名空间或者默认命名空间。 | 
| 服务Service | 分批发布中使用Service关联多个应用版本。 | 
| 关联 Workloads 类型 | 选择您要升级的Workloads(工作负载)类型。就是Kubernetes集群中的资源对象类型。 | 
| 分批策略 | 分批暂停时用户可以对发布进行验证并选择继续发布或者回滚。 | 
| 分批数 | 分批发布批次。 | 
| 容器名称 | Kubernetes一个应用中可能存在多个容器,这里需要指定具体的容器名称。 | 
| 镜像 | 将使用该镜像升级对应的容器版本。 | 

执行分批发布
- 保存并运行流水线任务,当第一批发布完成,第一批暂停后,卡片会显示暂停状态,并提示用户继续下一批次或者回退。  
- 在人工验证完成,选择继续发布,后续批次将会执行发布完成。 