Argo Rollouts是用于渐进式交付的Kubernetes 控制器,是Argo开源项目的一部分。为Kubernetes提供高级部署功能,具有渐进式交付、蓝绿发布、金丝雀发布和金丝雀分析等功能。

  • 蓝绿更新策略
  • 金丝雀更新策略
  • 更加细粒度、加权流量拆分
  • 自动回滚
  • 手动判断
  • 可定制的指标查询和业务 KPI 分析
  • Ingress 控制器集成:NGINX,ALB
  • 服务网格集成:Istio,Linkerd,SMI
  • Metrics 指标集成:Prometheus、Wavefront、Kayenta、Web、Kubernetes Jobs、Datadog、New Relic

工作原理

在这里插入图片描述

与Deployment对象类似,Argo Rollouts控制器将管理replicsets的创建、伸缩和删除。这些replicsets是由Rollout资源中的spec.template字段定义的,该字段使用与部署对象相同的pod模板。

当spec.template被更改时,它会向Argo Rollouts控制器发出信号,表示将引入一个新的replicset。控制器将使用spec.strategy字段中的策略集,以确定如何从旧的副本集进展到新的副本集。一旦新的replicset被放大(并可选地通过Analysis),控制器将把它标记为“ stable ”。

在这里插入图片描述

如果在从稳定副本到新副本的转换过程中,spec.template中发生了另一项更改(例如,在rollout的中间更改了应用程序版本),那么之前新的副本将按比例缩小,控制器将尝试前进反映更新的spec.template字段的ReplicasSet。

相关概念

Rollouts

Rollout 是一个等效于 Deployment 的 Kubernetes 的工作负载资源,在需要更高级的部署或渐进式交付功能的情况下,Rollout 取代 Deployment 对象,Rollout 提供了 Kubernetes Deployment 所不能提供的功能。

  • 蓝绿部署
  • 金丝雀部署
  • 入口控制器和服务网格集成,用于高级流量路由
  • 用于分析的指标提供程序集成
  • 根据成功或失败指标的自动升级与回滚

渐进式交付

渐进式交付为我们提供CI/CD,也提供了安全措施和控制手段,以降低不断将新代码推入生产环境的风险。渐进式交付让我们能够安全地执行CI/CD。

部署策略

以下是 Argo Rollouts 提供的各种部署策略

  • Rolling Update(滚动更新):这是Deployment对象默认的更新策略。当新版本的出现,旧版本会依次减少,保持应用的总量不变。
  • Recreate(重新创建): 在启动新版本之前删除旧版本的应用程序,确保不会有两个版本的应用程序同时运行。但是,这种部署策略会导致停机。
  • Blue-Green(蓝绿): 蓝绿部署是不停老版本,部署新版本进行测试,确认正常后将流量逐步切到新版本。蓝绿部署无需停机,并且风险较小。
  • Canart(金丝雀):金丝雀也成灰度发布。将一部分用户暴露在新版本的应用程序中,而将其余流量提供给旧版本,验证数据正常,新版本取代旧版本。

安装

控制器安装

通过kubernetes控制器安装Argo Rollouts,

$ kubectl create namespace argo-rollouts
$ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

运行一下命令创建名为Argo Rollouts的命名空间

[root@ycloud install]# kubectl get po -n argo-rollouts
NAME                                       READY   STATUS    RESTARTS   AGE
argo-rollouts-845b79ff9-jwcpq              1/1     Running   0          24d

可以到query仓库找到最新的容器镜像

Helm 安装

通过 Helm 安装 Argo Rollouts,

helm repo add argo https://argoproj.github.io/argo-helm

helm install my-release argo/argo-rollouts

安装后,使用以下命令安装 Argo 仪表板

--set dashboard.enabled=true

可通过端口转发访问web 31000端口

kubectl port-forward service/argo-rollouts-dashboard 31000:3100

Kubectl 插件安装

但可以方便地从命令行管理和可视化部署。

$ curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
$ chmod +x ./kubectl-argo-rollouts-linux-amd64
$ mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kuberollout

检测确保安装成功

[root@ycloud install]# kuberollouts version
kubectl-argo-rollouts: v1.3.0-rc1+0ec5ac1
  BuildDate: 2022-07-29T18:58:16Z
  GitCommit: 0ec5ac18a307ae579787b974e17f3e4c0bf41cff
  GitTreeState: clean
  GoVersion: go1.18.4
  Compiler: gc
  Platform: linux/amd64

使用

接下来我们通过部署、升级、升级和中止部署来演示 Argo Rollouts 的各种概念和功能

使用 Argo Rollouts 部署 Canary

1.部署

首先我们部署一个 Rollout 资源和一个针对该资源的 Service 对象,

---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
spec:
  replicas: 5
  strategy: #升级策略
    canary:	#金丝雀发布
      steps: #发布阶段
      - setWeight: 20
      - pause: {}  #表示暂停
      - setWeight: 40
      - pause: {duration: 10} #暂停 10s
      - setWeight: 60
      - pause: {duration: 10}
      - setWeight: 80
      - pause: {duration: 10}
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: rollouts-demo
  template:
    metadata:
      labels:
        app: rollouts-demo
    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:blue
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP
        resources:
          requests:
            memory: 32Mi
            cpu: 5m
---
apiVersion: v1
kind: Service
metadata:
  name: rollouts-demo
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: rollouts-demo
---

任何 Rollout 的初始创建都会立即将副本扩展到 100%(跳过任何金丝雀升级步骤、分析等),因为没有发生升级。

在这里插入图片描述

2.更新

每次在Rollout中更新pod的spec.template时,都将部署一个新版本

运行以下命令以rollouts-demo使用“黄色”版本的容器更新 Rollout

[root@ycloud install]# kuberollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
rollout "rollouts-demo" image updated

rollout策略制定新版本应仅部署20%的流量,然后暂停。
在这里插入图片描述

当 rollout demo 到第二步时,我们可以从插件中看到 Rollout 处于暂停状态,现在 5 个副本中有 1 个在运行新版本的 pod 模板,5 个副本中有 4 个在运行旧版本。这相当于 setWeight: 20步骤定义的 20% 金丝雀重量。

3.推广

strategy 配置表明,将金丝雀扩展至 20% 后,Rollout 应该无限期停止并等待操作员。使用这个命令来推广 Rollout 进入下一过程

[root@ycloud install]# kuberollouts promote rollouts-demo
rollout 'rollouts-demo' promoted

推广之后Rollout会执行剩下的所有步骤,查看rollout状态

在这里插入图片描述

4.中止

接下来我们来了解如何在更新过程中手动中止 Rollout,使用set image命令部署一个red版本的容器, 并等待部署再次到达暂停的步骤

[root@ycloud install]# kuberollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:
red
rollout "rollouts-demo" image updated

这次我们通过使用abort命令,在更新过程中中止Rollout,这样它就回到 stable版本

[root@ycloud install]# kuberollouts abort rollouts-demo
rollout 'rollouts-demo' aborted

当rollout中止,它将放大ReplicaSet的stable版本(黄色图像),并缩小其他任何版本。 尽管 ReplicaSet 的稳定版本可能正在运行并且是健康的,但仍会考虑整体推出Degraded,因为所需的版本(红色图像)不是实际运行的版本。

在这里插入图片描述

为了使 Rollout 再次被认为是健康的而不是有问题的版本,有必要将所需的状态改回以前的稳定版本。

[root@ycloud install]# kubectl get rs
NAME                                          DESIRED   CURRENT   READY   AGE
rollouts-demo-5747959bdb                      0         0         0       11m
rollouts-demo-687d76d795                      0         0         0       77m
rollouts-demo-6cf78c66c5                      5         5         5       30m

根据rs生成时间可以确认,版本以回到上一阶段的版本(yellow)

我们可以简单地使用之前的 yellow 镜像重新运行 set image 命令即可。

[root@ycloud install]# kuberollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
rollout "rollouts-demo" image updated

在这里插入图片描述

Dashboard

kubelet插件可以提供本地 UI 仪表板来可视化您的 Rollouts。

要启动它,kuberollout dashboard请在包含您的 Rollouts 的命名空间中运行。然后访问localhost:3100查看用户界面。

在这里插入图片描述

可查看到rollouts-demo升级策略的详细信息,也可对rollout进行相关操作

结论

Argo Rollouts拓展了 Kubernetes 部署对象的功能,榜之我们能够轻松实施高级渐进式交付策略。我们带领尝试了金丝雀发布更新,还有很多功能等着我们去探索。

参考文献

https://argoproj.github.io/argo-rollouts/

https://artifacthub.io/packages/helm/argo/argo-rollouts

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐