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一个应用中可能存在多个容器,这里需要指定具体的容器名称。 |
镜像 | 将使用该镜像升级对应的容器版本。 |
执行分批发布
保存并运行流水线任务,当第一批发布完成,第一批暂停后,卡片会显示暂停状态,并提示用户继续下一批次或者回退。
在人工验证完成,选择继续发布,后续批次将会执行发布完成。