# argo-resource **Repository Path**: wadequ/argo-resource ## Basic Information - **Project Name**: argo-resource - **Description**: cicd 中argo中蓝绿发布灰度发布实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-27 - **Last Updated**: 2025-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **argo rollout 介绍和使用* Argo Rollouts 是一个 Kubernetes Operator 实现,它为 Kubernetes 提供更加高级的部署能力,如蓝绿、金丝雀、金丝雀分析、实验和渐进式交付功能,为云原生应用和服务实现自动化、基于 GitOps 的逐步交付。 支持如下特性: - 蓝绿更新策略 - 金丝雀更新策略 - 更加细粒度、加权流量拆分 - 自动回滚 - 手动判断 - 可定制的指标查询和业务 KPI 分析 - Ingress 控制器集成:NGINX,ALB - [服务网格](https://cloud.tencent.com.cn/product/tcm?from_column=20065&from=20065)集成:Istio,Linkerd,SMI - Metrics 指标集成:[Prometheus](https://cloud.tencent.com.cn/product/tmp?from_column=20065&from=20065)、Wavefront、Kayenta、Web、Kubernetes Jobs、Datadog、New Relic、Graphite、InfluxDB ### 如下图为argorollout的架构图形 ![使用 Argo Rollouts 实现应用渐进式发布-鸿蒙开发者社区](https://dl-harmonyos.51cto.com/images/202311/482a6d392fe950d705972696c563f8c8f77300.png) 相关组件如下: **Rollout Controller** ##### 这是主控制器,用于监控集群中的事件并在rollout类型的资源发生变化时做出反应。控制器读取rollout的所有的信息,并实集群处于rollout定义中描述的相公状态。argo Rollouts 不会篡改或响应正常 Deployment 资源上发生的任何变更,这意味着你可以在一个使用其他方法部署应用的集群中安装 Argo Rollouts。 ### Rollout 资源 Rollout 资源是 Argo Rollouts 引入和管理的一种自定义 Kubernetes 资源,它与原生的 Kubernetes Deployment 资源基本兼容,但有额外的字段来控制更加高级的部署方法,如金丝雀和蓝/绿部署。Argo Rollouts 控制器将只对 Rollout 资源中的变化做出反应,不会对正常的 Deployment 资源做任何事情,所以如果你想用 Argo Rollouts 管理你的 Deployment,你需要将你的 Deployment 迁移到 Rollouts。 ### AnalysisTemplate 与 AnalysisRun `Analysis` 是一种自定义 Kubernetes 资源,它将 Rollout 连接到指标提供程序,并为某些指标定义特定阈值,这些阈值将决定 Rollout 是否成功。对于每个 Analysis,你可以定义一个或多个指标查询及其预期结果,如果指标查询正常,则 Rollout 将继续发布;如果指标显示失败,则自动回滚;如果指标无法提供成功/失败的结果,则暂停发布。 为了执行分析,Argo Rollouts 提供了两个自定义的 Kubernetes 资源:`AnalysisTemplate` 和 `AnalysisRun`。 `AnalysisTemplate` 包含有关要查询哪些指标的说明。附加到 `Rollout` 的实际结果是 `AnalysisRun` 自定义资源,可以在特定 的 `Rollout` 上定义 `AnalysisTemplate`,也可以在集群上定义全局的 `AnalysisTemplate`,以供多个 `Rollout` 共享作为 `ClusterAnalysisTemplate`,而 `AnalysisRun` 资源的范围仅限于特定的 rollout。 请注意,在 Rollout 中使用分析和指标是完全可选的,你可以通过 API 或 CLI 手动暂停和继续发布,也可以使用其他外部方法(例如冒烟测试)。你不需要仅使用 Argo Rollouts 的指标解决方案,你还可以在 Rollout 中混合自动(即基于分析)和手动步骤。 除了指标之外,你还可以通过运行 Kubernetes Job 或运行 webhook 来决定发布的成功与否。 ### Metric Providers Argo Rollouts 包括多个流行指标提供程序的本机集成,您可以在分析资源中使用这些提供程序来自动升级或回滚部署。有关特定设置选项,请参阅每个提供商的文档。 Argo Rollouts 包括几个流行的指标提供者的集成,你可以在分析资源中使用,来自动升级或回滚发布。 #### **安装与使用** $ kubectl create namespace argo-rollouts $ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.6.0/install.yaml **下载客户端** \# https://ghproxy.com/https://github.com//argoproj/argo-rollouts/releases/download/v1.6.0/kubectl-argo-rollouts-linux-amd64 $ curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.6.0/kubectl-argo-rollouts-linux-amd64 $ chmod +x ./kubectl-argo-rollouts-linux-amd64 $ sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts ``` root@test-k8s-master1:~/test/argo-rollout# kubectl argo rollouts version kubectl-argo-rollouts: v1.8.2+0775302 BuildDate: 2025-03-21T19:14:39Z GitCommit: 0775302f6fd901f557a0c14be327e31ce75bb45a GitTreeState: clean GoVersion: go1.23.7 Compiler: gc Platform: linux/amd64 ``` #### 实现金丝雀发布(灰度发布) apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: myapp-rollout namespace: istio-demo spec: replicas: 5 strategy: canary: steps: - setWeight: 10 - pause: {} - setWeight: 15 # 这里将流量从 10% 增加到 15% - pause: {duration: 10} - setWeight: 20 # 进一步增加流量 - pause: {duration: 10} - setWeight: 30 # 继续增加 - pause: {duration: 10} - setWeight: 40 revisionHistoryLimit: 2 selector: matchLabels: app: front-tomcat template: metadata: labels: app: front-tomcat spec: containers: - name: front-tomcat image: harbor.assistfc.com/middleware/tomcat-7.0:latest ports: - containerPort: 80` `对应svc的资源如下` ``` # basic-service.yaml apiVersion: v1 kind: Service metadata: name: rollouts-nginx spec: ports: - port: 80 targetPort: http protocol: TCP name: http selector: app: front-tomcat ``` #### 常见的操作命令 查看更新rollout的版本 ``` 查看 root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts get rollout myapp-rollout -n istio-demo Name: myapp-rollout Namespace: istio-demo Status: ✔ Healthy Strategy: Canary Step: 9/9 SetWeight: 100 ActualWeight: 100 Images: harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable) Replicas: Desired: 5 Current: 5 Updated: 5 Ready: 5 Available: 5 NAME KIND STATUS AGE INFO ⟳ myapp-rollout Rollout ✔ Healthy 6h3m ├──# revision:2 │ └──⧉ myapp-rollout-9cc8fbbf9 ReplicaSet ✔ Healthy 5h2m stable │ ├──□ myapp-rollout-9cc8fbbf9-kf6wl Pod ✔ Running 5h2m ready:1/1 │ ├──□ myapp-rollout-9cc8fbbf9-7vrdg Pod ✔ Running 4h59m ready:1/1 │ ├──□ myapp-rollout-9cc8fbbf9-4zq2k Pod ✔ Running 4h59m ready:1/1 │ ├──□ myapp-rollout-9cc8fbbf9-6hqsd Pod ✔ Running 4h59m ready:1/1 │ └──□ myapp-rollout-9cc8fbbf9-gr87n Pod ✔ Running 4h59m ready:1/1 └──# revision:1 └──⧉ myapp-rollout-7f4db77cf7 ReplicaSet • ScaledDown 6h3m 更新对应的rollout kubectl argo rollouts set image myapp-rollout myapp-rollout=harbor.assistfc.com/middleware/tomcat-7.0:latest root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts -n istio-demo get rollout myapp-rollout Name: myapp-rollout Namespace: istio-demo Status: ॥ Paused Message: CanaryPauseStep Strategy: Canary Step: 1/9 SetWeight: 10 ActualWeight: 16 Images: harbor.assistfc.com/middleware/tomcat-7.0:latest (canary) harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable) Replicas: Desired: 5 Current: 6 Updated: 1 Ready: 6 Available: 6 NAME KIND STATUS AGE INFO ⟳ myapp-rollout Rollout ॥ Paused 6h12m ├──# revision:3 │ └──⧉ myapp-rollout-7f4db77cf7 ReplicaSet ✔ Healthy 6h12m canary │ └──□ myapp-rollout-7f4db77cf7-gp5zh Pod ✔ Running 59s ready:1/1 └──# revision:2 └──⧉ myapp-rollout-9cc8fbbf9 ReplicaSet ✔ Healthy 5h11m stable ├──□ myapp-rollout-9cc8fbbf9-kf6wl Pod ✔ Running 5h11m ready:1/1 ├──□ myapp-rollout-9cc8fbbf9-7vrdg Pod ✔ Running 5h9m ready:1/1 ├──□ myapp-rollout-9cc8fbbf9-4zq2k Pod ✔ Running 5h8m ready:1/1 ├──□ myapp-rollout-9cc8fbbf9-6hqsd Pod ✔ Running 5h8m ready:1/1 └──□ myapp-rollout-9cc8fbbf9-gr87n Pod ✔ Running 5h8m ready:1/1 让发布的 东西继续运行 root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts promote myapp-rollout -n istio-demo rollout 'myapp-rollout' promoted root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts -n istio-demo get rollout myapp-rollout Name: myapp-rollout Namespace: istio-demo Status: ॥ Paused Message: CanaryPauseStep Strategy: Canary Step: 3/9 SetWeight: 15 ActualWeight: 16 Images: harbor.assistfc.com/middleware/tomcat-7.0:latest (canary) harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable) Replicas: Desired: 5 Current: 6 Updated: 1 Ready: 6 Available: 6 NAME KIND STATUS AGE INFO ⟳ myapp-rollout Rollout ॥ Paused 6h17m ├──# revision:3 │ └──⧉ myapp-rollout-7f4db77cf7 ReplicaSet ✔ Healthy 6h17m canary │ └──□ myapp-rollout-7f4db77cf7-gp5zh Pod ✔ Running 5m24s ready:1/1 └──# revision:2 └──⧉ myapp-rollout-9cc8fbbf9 ReplicaSet ✔ Healthy 5h16m stable ├──□ myapp-rollout-9cc8fbbf9-kf6wl Pod ✔ Running 5h16m ready:1/1 ├──□ myapp-rollout-9cc8fbbf9-7vrdg Pod ✔ Running 5h13m ready:1/1 ├──□ myapp-rollout-9cc8fbbf9-4zq2k Pod ✔ Running 5h13m ready:1/1 ├──□ myapp-rollout-9cc8fbbf9-6hqsd Pod ✔ Running 5h13m ready:1/1 └──□ myapp-rollout-9cc8fbbf9-gr87n Pod ✔ Running 5h13m ready:1/1 ``` 至此实现灰度发布就ok了