Argo Rollouts介绍

介绍

Argo Rollouts是Kubernetes的控制器和一组crd,提供先进的部署能力,如蓝绿、金丝雀、金丝雀分析、实验和渐进交付功能。

Argo Rollouts(可选)集成了入口控制器和服务网格,利用它们的流量整型能力,在更新期间逐步将流量转移到新版本。此外,rollout可以验证不同的KPI指标,并自动在更新期间推动更新或回滚。

支持的特性

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

概念

Rollout

Rollout是一个Kubernetes的CRD,相当于Deployment对象,它的目的是在需要更高级的部署或渐进式交付功能的情况下代替Deployment对象,Rollout提供了Deployment所不能提供的功能:

  • 蓝绿部署
  • 金丝雀部署
  • 与 Ingress 控制器和服务网格整合,实现高级流量路由
  • 和metric集成,进行蓝绿和金丝雀部署分析
  • 根据成功或失败的指标,自动发布或回滚

渐进式交付

渐进式交付是以一种可控的、渐进式的方式发布产品更新的过程,从而减少发布的风险,通常结合自动化和指标分析来驱动更新的自动升级或回滚。

渐进交付通常被描述为持续交付的演变,将CI/CD中的速度优势扩展到部署过程。这是通过将新版本发布给一部分用户,观察和分析正确的行为,然后逐步增加对更多的流量,同时不断验证正确性来实现的。

部署策略

  • RollingUpdate(滚动更新):慢慢地用新版本替换旧版本,随着新版本的增加,旧版本会慢慢缩减,以保持应用的总数。这是Deployment的默认策略。
  • Recreate(重新创建):Recreate 会在启动新版本之前删除旧版本的应用程序,这可确保应用程序的两个版本永远不会同时运行,但在部署期间会出现停机时间。
  • Blue-Green(蓝绿):蓝绿发布(有时称为红黑)指同时部署了新旧两个版本的应用程序,在此期间,只有旧版本的应用程序会收到生产流量,这允许开发人员在将流量切到新版本之前对新版本进行测试。
  • Canary(金丝雀):金丝雀发布指将一部分流量给新版本的应用,而将其余流量给旧版本,一旦新版本被验证是正确的,新版本可以逐渐取代旧版本。Ingress 控制器和服务网格,比如 nginx-ngress和Istio,可以使金丝雀的流量拆分模式比原生的更复杂(例如,实现非常细粒度的流量分割,或基于 HTTP 头的分割)。

架构

file

  • Rollout Controller
    这是主控制器,用于监视集群的事件并在rollout类型的资源发生变更时做出反应。控制器将读取rollout的所有详细信息,并使集群处于rollout定义中描述的状态。

  • Rollout 资源
    Rollout资源是Argo Rollouts引入和管理的一个CRD,它与原生的Deployment基本兼容,但有额外的字段来控制更加高级的部署方法,比如金丝雀和蓝绿部署。

    Argo Rollouts 控制器只对Rollout资源中的变化做出反应,不会对正常的Deployment做任何事情,所以如果你想用 Argo Rollouts管理你的Deployment,你需要将你的Deployment迁移到Rollouts。

  • 旧版和新版的ReplicaSets
    就是标准的ReplicaSet实例,Argo Rollouts给它们添加了一些额外的元数据,以便跟踪属于应用程序的不同版本。参加Rollout的ReplicaSet完全由控制器自动管理,不应该用外部工具来篡改它们。

  • Ingress/Service
    用户的流量进入集群后,被重定向到合适的版本,Argo Rollouts 使用标准的Service,并添加了一些额外的元数据。

  • AnalysisTemplate和AnalysisRun
    Analysis是一个CRD,它将Rollout连接到metrics providers ,并为某些指标定义特定阈值,这些阈值将决定Rollout是否成功。对于每个Analysis,你可以定义一个或多个指标查询及其预期结果,如果指标查询正常,则Rollout将继续操作;如果指标显示失败,则自动回滚;如果指标无法提供成功/失败的答案,则暂停发布。

    AnalysisTemplate包含关于查询什么指标的说明。附加到Rollout上的是AnalysisRun自定义资源。可以在特定的Rollout上定义一个AnalysisTemplate,也可以在集群全局上定义一个ClusterAnalysisTemplate,由多个Rollout共享。AnalysisRun资源在特定的rollout上限定范围。

  • Metric Providers
    Argo Rollouts支持多个原生的Metric Providers,你可以在Analysis资源中使用,来自动升级或回滚。

原理

Argo Rollouts原理和Deployment差不多,只是加强rollout的策略和流量控制。当spec.template发送变化时,Argo Rollout就会根据spec.strategy进行rollout,通常会产生一个新的ReplicaSet,逐步scale down之前的ReplicaSet的pod数量。

应用场景

Argo Rollouts支持多种更新策略,意味着可以支持多种应用场景,蓝绿发布和金丝雀发布的场景它都支持。比如逐步增加新版本的流量;新旧版本同时存在,新版本测试通过后再把流量切到新版本等。

安装

官方文档:https://argoproj.github.io/argo-rollouts/installation/

安装argo-rollouts

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

file

安装argo-rollouts的kubectl plugin

curl -LO https://github.91chi.fun//https://github.com//argoproj/argo-rollouts/releases/download/v1.2.1/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
kubectl argo rollouts version

file

自动补全

source <(kubectl-argo-rollouts completion bash)

file

使用

这里使用官网的金丝雀栗子,通过Rollout的部署、升级、发布和中断等操作来展示Rollouts的各种功能。

1.部署rollout

kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/rollout.yaml
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/service.yaml

1.1文件说明

cat rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
spec:
  replicas: 5   # 定义5个副本
  strategy:     # 定义部署策略
    canary:     # 金丝雀发布
      steps:
      - setWeight: 20
      - pause: {}   # 没有跟duration则需要手动更新
      - setWeight: 40   # 设置流量的权重
      - pause: {duration: 10}
      - 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
---
cat service.yaml
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

Argo Rollouts 的 kubectl 插件允许我们可视化 Rollout 以及相关资源对象,并展示实时状态变化。

kubectl argo rollouts get rollout rollouts-demo --watch

file

3.更新rollout

更新Rollout通常是修改容器镜像的版本,然后执行 kubectl apply ,为了方便,rollouts插件还单独提供了一个 set image 的命令:

kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow

在rollout更新期间,控制器将通过rollout更新策略中定义的步骤进行。这个示例的rollout为金丝雀设置了20%的流量权重,并一直暂停rollout,直到用户取消或升级发布。在更新镜像后,再次观察rollout,直到它达到暂停状态。

file

rollout到达第二步时,可以看到,rollout处于暂停状态,现在只有1个运行新版本的pod,其余4个仍然运行旧版本,这相当于setWeight: 20 步骤所定义的20%的金丝雀权重。

4.恢复更新

argo rollouts提供了promote来进行后续的更新,剩余的步骤是完全自动化的。
promote 命令还支持用 –full 参数跳过所有剩余步骤和分析。

kubectl argo rollouts promote rollouts-demo

file

5.中断更新

先使用 set image 命令部署一个新的 red 版本的容器,并等待 rollout 再次暂停。

kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:red

file

这次我们将中止更新,而不是将滚动切换到下一步,这样它就回到了stabl 版本,该插件同样提供了一个abort命令,可以在更新过程中的任何时候手动中止 Rollout。

kubectl argo rollouts abort rollouts-demo

file

5.1恢复状态为Healthy

kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow

file

当Rollout还没有达到预期状态(例如,它被中止了,或者正在更新中),稳定版本的资源清单被重新应用,Rollout检测到这是一个回滚,而不是一个更新,并将通过跳过分析和步骤快速部署稳定的ReplicaSet。

6.回退更新

kubectl argo rollouts undo  rollouts-demo --to-revision=1

可以看到没有revision为1的版本,而是重新创建了一个为5的版本,而且第一步处于暂停状态。

file

6.1执行promote命令继续后续的更新。

kubectl argo rollouts promote rollouts-demo

可以看到回退到我们最初版本为blue的镜像了。

file

Dashboard

执行下面的命令,即可启动dashboard

kubectl argo rollouts dashboard &

file

访问 ip:3100。
file

查看rollout详情
file

0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x