基于ACK One Gitops使用Kruise Rollout实现金丝雀发布

ACK One整合了ArgoCD GitOps的能力,同时结合渐进式发布组件Kruise Rollout,通过Git Commit实现全自动的金丝雀发布。本文介绍如何通过ACK One GitOps结合Kruise Rollout组件快速构建应用的金丝雀发布能力。

前提条件

  • 已开启舰队管理功能。具体操作,请参见开启舰队管理功能

  • 已创建ACK集群,并将其关联至ACK One Fleet实例。具体操作,请参见创建Kubernetes托管版集群添加关联集群

    • 如需使用A/B Testing或金丝雀发布的能力,集群版本需为1.19及以上版本。

    • 如需使用分批发布能力,则集群版本需为1.16及以上版本。

  • 已从ACK One控制台获取Fleet实例的KubeConfig,并通过kubectl连接至Fleet实例。

  • 已安装kubectl-kruise。关于kubectl-kruise安装路径,请参见kubectl-kruise

Kruise Rollout介绍

Kruise Rollout是OpenKruise社区开源的渐进式交付框架。Kruise Rollout支持配合流量和实例灰度的灰度发布、蓝绿发布、A/B Testing发布。基于Prometheus Metrics指标,Kruise Rollout还可以实现发布过程的自动化分批与暂停,并提供旁路的无感对接、兼容已有的多种工作负载(Deployment、CloneSet、StatefulSet)。更多信息,请参见Kruise Rollout

Kruise Rollout是一种旁路式的工作机制。您只需配置一份Rollout资源并将其下发到K8s集群中,后续的业务发布、升级均无需额外操作,并且可以与Helm、PaaS平台低成本地无缝对接。使用Kruise Rollout实现灰度发布架构如下图所示。gray

注意事项

  • 如果您选择GitHub仓库,则不推荐使用中国内地地域。如需在中国内地地域运行,您可以选择适合的Git服务提供商。

  • 本文舰队管理的Fleet实例和关联的ACK集群的地域均以中国香港地域为例。

步骤一:在ACK集群中部署Kruise Rollout组件

安装Kruise Rollout组件。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击应用管理页签,然后在ack-kruise卡片右下方,单击安装

  4. 在弹出的对话框确认信息后,单击确定

步骤二:使用ACK One GitOps发布应用

通过GitOps发布应用支持以下两种方式。

  • 通过ArgoCD CLI的方式发布应用。下文以此方式为例,介绍如何使用GitOps发布应用。

  • 通过GitOps控制台发布应用。具体操作,请参见GitOps使用快速入门

  1. 执行以下命令,添加Git Repo。

    argocd repo add https://github.com/openkruise/samples.git --name gitops-demo

    预期输出:

    Repository 'https://github.com/openkruise/samples.git' added

    执行以下命令,查看已添加的Git Repo列表。

    argocd repo list

    预期输出:

    TYPE NAME REPO INSECURE OCI LFS CREDS STATUS MESSAGE PROJECT
    git gitops-demo https://github.com/openkruise/samples.git false false false false Successful
  1. 执行以下命令,查看Cluster列表。

    argocd cluster list

    预期输出:

    SERVER NAME VERSION STATUS MESSAGE PROJECT
    https://192.168.XX.XX:6443 c76073b011afb4de2a8****-ack-gitops-demo-192-10-110-0-0-16 1.26+ Successful
    https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.
  1. 执行以下命令,通过Application方式创建应用,其中revision为稳定版本的Tag。

    argocd app create rollouts-demo --repo https://github.com/openkruise/samples.git --project default --sync-policy none --revision gitops-demo-version-stable --path gitops-demo --dest-namespace default --dest-server https://192.168.XX.XX:6443
  1. 执行以下命令,查看应用列表。

    argocd app list

    预期输出:

    NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
    
    rollouts-demo https://192.168.XX.XX:6443 default default OutOfSync Healthy <none> <none> https://github.com/openkruise/samples.git gitops-demo 616b4b6 
  1. 执行以下命令,同步应用。

    argocd app sync rollouts-demo

    预期输出:

    Name: argocd/rollouts-demo
    Project: default
    Server: https://192.168.XX.XX:6443
    Namespace: default
    URL: https://127.0.0.1:61231/applications/rollouts-demo
    Repo: https://github.com/openkruise/samples.git
    Target: 616b4b6
    Path: gitops-demo
    SyncWindow: Sync Allowed
    Sync Policy: <none>
    Sync Status: Synced to 616b4b6
    Health Status: Progressing
    
    Operation: Sync
    Sync Revision: 616b4b6e010ba4d71a92c0e7d050162956b169b7
    Phase: Succeeded
    Start: 2023-08-07 16:02:12 +0800 CST
    Finished: 2023-08-07 16:02:13 +0800 CST
    Duration: 1s
    Message: successfully synced (all tasks run)
    
    GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
     Service default echo-server Synced Healthy service/echo-server created
    apps Deployment default echo-server Synced Progressing deployment.apps/echo-server created
    networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo created
    rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo created
  1. 在ArgoCD UI中Applications中单击rollouts-demo应用,应用详情如下图所示。

    image.png

  1. 执行以下命令,查看Rollouts运行状态。

    kubectl get rollout --kubeconfig <子集群KubeConfig文件路径>
    重要
    • 查看Rollouts运行状态需要在子集群查看,通过kubectl get rollout查看时需要指定子集群的KubeConfig文件路径。

    • 您也可以通过设置KUBECONFIG环境变量或其他方式来切换到子集群的KubeConfig。

    预期输出:

    NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE
    rollouts-demo Healthy 4 Completed workload deployment is completed 3m22s

步骤三:开始金丝雀发布

Git仓库中的rollout.yaml文件为Rollouts配置文件。rollout配置如下所示,发布过程分为四步:

  • 将旧版本应用的20%更新为新版本应用,并将20%的流量转发至新版本应用中,需要手动确认继续发布

  • 将旧版本应用的40%更新为新版本应用,并将40%的流量转发至新版本应用中,暂停60秒后自动继续发布

  • 将旧版本应用的60%更新为新版本应用,并将60%的流量转发至新版本应用中,暂停60秒后自动继续发布

  • 将旧版本应用的80%更新为新版本应用,并将80%的流量转发至新版本应用中,暂停60秒后自动继续发布

apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
  annotations:
    rollouts.kruise.io/rolling-style: partition
spec:
  objectRef:
    workloadRef:
      apiVersion: apps/v1
      kind: Deployment
      name: echo-server
  strategy:
    canary:
      steps:
      - replicas: 20%
        weight: 20 # 该发布步骤不设置暂停时间,需要手动确认继续发布
      - replicas: 40%
        weight: 40
        pause:
          duration: 60
      - replicas: 60%
        weight: 60
        pause:
          duration: 60
      - replicas: 80%
        weight: 80
        pause:
          duration: 60
      trafficRoutings:
      - service: echo-server
        ingress:
          classType: nginx
          name: ingress-demo
  1. 执行以下命令,同步应用至新版本,其中revision为新版本的Tag。

    argocd app sync rollouts-demo --revision gitops-demo-version-canary

    预期输出:

    Name: argocd/rollouts-demo
    Project: default
    Server: https://192.168.XX.XX:6443
    Namespace: default
    URL: https://127.0.0.1:62461/applications/rollouts-demo
    Repo: https://github.com/openkruise/samples.git
    Target: 616b4b6
    Path: gitops-demo
    SyncWindow: Sync Allowed
    Sync Policy: <none>
    Sync Status: OutOfSync from 616b4b6
    Health Status: Progressing
    
    Operation: Sync
    Sync Revision: 3d14cc011bb090dd2243f70a3741e9b8f5332cb9
    Phase: Succeeded
    Start: 2023-08-07 16:20:07 +0800 CST
    Finished: 2023-08-07 16:20:07 +0800 CST
    Duration: 0s
    Message: successfully synced (all tasks run)
    
    GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
     Service default echo-server Synced Healthy service/echo-server unchanged
    apps Deployment default echo-server OutOfSync Suspended deployment.apps/echo-server configured
    networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo unchanged
    rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo configured
  1. 等待本步完成,在执行以下命令,查看Rollouts运行状态。

    kubectl get rollout --kubeconfig <子集群KubeConfig文件路径>
    重要
    • 查看Rollouts运行状态需要在子集群查看,通过kubectl get rollout查看时需要指定子集群的KubeConfig文件路径。

    • 您也可以通过设置KUBECONFIG环境变量或其他方式来切换到子集群的KubeConfig。

    预期输出如下,提示需要手动继续下一步发布:

    NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE
    rollouts-demo Progressing 1 StepPaused Rollout is in step(1/4), and you need manually confirm to enter the next step 7m57s
  1. 执行以下命令,恢复金丝雀发布。

    kubectl-kruise rollout approve rollout/rollouts-demo  --kubeconfig <子集群KubeConfig文件路径>
    重要
    • 需要在子集群执行kubectl-kruise命令来恢复发布,命令中需要指定子集群的KubeConfig文件路径。

    • 您也可以通过设置KUBECONFIG环境变量或其他方式来切换到子集群的KubeConfig。

    预期输出:

    rollout.rollouts.kruise.io/rollouts-demo approved
  1. 等待本步完成,执行以下命令,查看Rollouts运行状态。

    kubectl get rollout --kubeconfig <子集群KubeConfig文件路径>
    重要
    • 查看Rollouts运行状态需要在子集群查看,通过kubectl get rollout查看时需要指定子集群的KubeConfig文件路径。

    • 您也可以通过设置KUBECONFIG环境变量或其他方式来切换到子集群的KubeConfig。

    预期输出如下,提示60秒后将进入下一步发布。

    NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE
    rollouts-demo Progressing 2 StepPaused Rollout is in step(2/4), and wait duration(60 seconds) to enter the next step 9m56s
  1. 之后Kruise Rollout将每隔60秒开始下一次发布,直至发布完成。

  2. 等待发布完成,执行以下命令,查看Rollouts运行状态。

    kubectl get rollout --kubeconfig <子集群KubeConfig文件路径>
    重要
    • 查看Rollouts运行状态需要在子集群查看,通过kubectl get rollout查看时需要指定子集群的KubeConfig文件路径。

    • 您也可以通过设置KUBECONFIG环境变量或其他方式来切换到子集群的KubeConfig。

    预期输出如下,提示发布完成。

    NAME            STATUS    CANARY_STEP   CANARY_STATE   MESSAGE                                  AGE
    rollouts-demo   Healthy   4             Completed      Rollout progressing has been completed   15m

(可选)步骤四:金丝雀发布回滚

在金丝雀发布过程中,如果您发现应用异常,可以将应用的revison同步至旧版本commit进行回滚。

执行以下命令,同步应用至旧版本,其中revision为旧版本的Tag。

argocd app sync rollouts-demo --revision gitops-demo-version-stable

预期输出:

Project: default
Server: https://192.168.XX.XX:6443
Namespace: default
URL: https://127.0.0.1:49922/applications/rollouts-demo
Repo: https://github.com/Kuromesi/samples.git
Target: 616b4b6
Path: gitops-demo
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to 616b4b6
Health Status: Progressing

Operation: Sync
Sync Revision: 616b4b6e010ba4d71a92c0e7d050162956b169b7
Phase: Succeeded
Start: 2023-08-07 16:52:53 +0800 CST
Finished: 2023-08-07 16:52:54 +0800 CST
Duration: 1s
Message: successfully synced (all tasks run)

GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
 Service default echo-server Synced Healthy service/echo-server unchanged
apps Deployment default echo-server Synced Suspended deployment.apps/echo-server configured
networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo unchanged
rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo unchanged

相关文档