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
添加分批发布任务
用户可以通过添加流水线任务并选择 ”Kubernetes 分批发布“任务:
配置发布任务
首次使用 Kubernetes 相关发布功能的用户需要首先建立 Kubernetes 服务连接。
选择发布的目标 Service 以及 Service 关联的 Deployment 中的容器名称。镜像需要由上游镜像构建步骤产生:
执行分批发布
当使用分批发布第一批暂停,当第一批次发布完成后,卡片会显示暂停状态,并提示用户继续下一批次或者回滚
在人工验证完成后,选择继续发布完成后续批次的发布