赛尔校园公共服务平台 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
赛尔校园公共服务平台 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 分布式云容器平台ACK One
  4. 实践教程
  5. CICD
  6. ACK One GitOps最佳实践
  7. 基于ACK One Gitops使用Kruise Rollout实现金丝雀发布

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

  • ACK One GitOps最佳实践
  • 发布于 2025-04-18
  • 0 次阅读
文档编辑
文档编辑

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

前提条件

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

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

    • 如需使用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

相关文档

  • GitOps概述

  • GitOps快速入门

  • OpenKruise官网文档

  • OpenKruise Github

相关文章

最佳实践概述 2025-04-18 18:06

在完整的CI/CD流水线中,您可以通过修改代码自动触发CI构建,并将镜像推送到容器镜像服务ACR,然后触发ACK One GitOps将应用持续部署到各个集群。本文通过示例介绍完整流程中ACK One GitOps最佳实践的相关概念和流程。 相关概念

基于ACK One GitOps部署的应用示例介绍 2025-04-18 18:06

本文介绍基于ACK One GitOps部署的应用示例。 应用部署仓库的目录结构 一个完整的CI/CD流水线中,涉及业务代码仓库和应用部署代码仓库两类。ACK One GitOps本实践的仓库说明如下。 业务代码仓库包含2个,分别从echo-server项目

使用ACK One分布式工作流集群构建容器镜像CI 2025-04-18 18:06

本文介绍如何使用ACK One分布式工作流集群构建容器镜像CI。 前提条件 已创建工作流集群,从ACK One控制台获取分

使用ACK One GitOps部署应用 2025-04-18 18:06

ACK One GitOps托管并完全兼容ArgoCD相关能力,支持持续迭代,可通过使用Git部署模板代替模板化分发能力。本文介绍如何通过ACK One GitOps控制台或CLI的方式部署应用。 前提条件 已开启舰队管理功能。具体操作,请参见

基于ACK One GitOps和ACR构建CICD流水线 2025-04-18 18:06

ACK One GitOps可实现多集群GitOps应用的持续交付,容器镜像服务ACR支持绑定业务代码仓库,以实现应用的持续集成。本实践基于这两者构建开发(Dev)、预发(Staging)、生产(Production)集群的CI/CD流水线,实现代码修改提交到代码仓库后,自动将最新镜像更新至应用,并

基于ACK One Gitops使用Argo Rollouts实现金丝雀发布 2025-04-18 18:05

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

目录
Copyright © 2025 your company All Rights Reserved. Powered by 赛尔网络.
京ICP备14022346号-15
gongan beian 京公网安备11010802041014号