ACK的灰度发布功能除了手动发布方式外,还提供了自动发布方式。自动发布模式可以让您全自动化地完成灰度发布流程。

步骤一:创建测试应用

本文使用以下YAML文件模板作为测试示例。该示例使用Deployment部署一个Web应用,并通过路由(Ingress)向外暴露服务(Service)。有关如何使用YAML模板创建应用的具体步骤,请参见通过编排模板创建Linux应用

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: '2'
  creationTimestamp: '2020-10-12T09:33:16Z'
  generation: 5
  labels:
    app: podinfo
  name: podinfo
  namespace: default
  resourceVersion: '821586823'
  selfLink: /apis/apps/v1/namespaces/default/deployments/podinfo
  uid: b169eb56-b622-44af-b109-4806e472495c
spec:
  minReadySeconds: 5
  progressDeadlineSeconds: 60
  replicas: 4
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: podinfo
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: podinfo
    spec:
      containers:
        - image: 'registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:blue'
          imagePullPolicy: IfNotPresent
          name: podinfod
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            initialDelaySeconds: 5
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 8080
            timeoutSeconds: 5
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

---

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: '2020-10-12T09:32:10Z'
  name: my-podinfo-svc
  namespace: default
  resourceVersion: '821593380'
  selfLink: /api/v1/namespaces/default/services/my-podinfo-svc
  uid: 64465020-490d-4471-9a92-b10dd6f46fb8
spec:
  clusterIP: 172.24.8.231
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: podinfo
  sessionAffinity: None
  type: ClusterIP

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  creationTimestamp: '2020-10-12T09:32:10Z'
  generation: 1
  labels:
    app: podinfo
  name: podinfo
  namespace: default
  resourceVersion: '821265085'
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/podinfo
  uid: 746fef1a-c876-41e8-a246-031ba3e3b6b4
spec:
  rules:
    - host: app.example.com
      http:
        paths:
          - backend:
              serviceName: my-podinfo-svc
              servicePort: 80

步骤二:创建灰度发布

创建灰度发布时,设置上述创建的Deployment、Service、Ingress,然后设置发布方式为自动发布。有关创建灰度发布的具体操作,请参见创建灰度发布
注意
您在配置自动发布模式时,需要注意以下两点:
  • 和手动发布不同,使用自动发布模式时,您需要在创建灰度发布的时候编辑发布对象里面的YAML以设置需要更新的新版本Deployment。本文示例将发布的版本镜像blue修改成green
  • 您需要设置权重调整步长。该值设置每次以多少步长来调整新版本的权重流量。本文以20为例,期初会以0%的流量切至新版本。随着新版本的Pod创建出来后,第一次切换20%的流量至新版本Pod,然后随着新版本的Pod数量变多,流量逐步切换到40%,60%,80%,直到100%。
blue-green

完成创建灰度发布后,发布流程会全自动化地进行。当一个新版本的Pod创建出来后,流量切换百分之20至新版本Pod,此时旧版本的一个Pod会被删除,然后系统会再继续创建一个新的Pod删除一个旧版Pod,以此类推,直到完毕。