Kubernetes 分批发布

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 中的容器名称。镜像需要由上游镜像构建步骤产生: 

执行分批发布

当使用分批发布第一批暂停,当第一批次发布完成后,卡片会显示暂停状态,并提示用户继续下一批次或者回滚 

在人工验证完成后,选择继续发布完成后续批次的发布