Istio生态系统ON ASM(2):在阿里云服务网格ASM中集成Argo Rollouts进行金丝雀发布

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
简介: 背景ArgoCD职责主要是监听Git仓库中的应用编排的变化,并集群中应用真实运行状态进行对比,自动/手动去同步拉取应用编排的变更到部署集群中。Argo Rollouts提供了更强大的蓝绿、金丝雀部署能力。在实践中可以将两者结合来提供基于GitOps 的渐进式交付能力。前提条件创建Istio版本为1.12.4.50或更高版本的阿里云服务网格 (ASM) 企业版实例。

背景

ArgoCD职责主要是监听Git仓库中的应用编排的变化,并集群中应用真实运行状态进行对比,自动/手动去同步拉取应用编排的变更到部署集群中。Argo Rollouts提供了更强大的蓝绿、金丝雀部署能力。在实践中可以将两者结合来提供基于GitOps 的渐进式交付能力。

前提条件

  • 创建Istio版本为1.12.4.50或更高版本的阿里云服务网格 (ASM) 企业版实例。
  • 创建容器服务Kubernetes (ACK) 集群。
  • 将ACK集群添加到阿里云服务网格ASM实例。
  • 已安装Argo Rollouts(本文档以v1.2.1为例)

安装Argo Rollout

使用数据面集群的kubeconfig,执行如下命令,安装Argo Rollout服务端。更多详情可参考Arog Rollout官网

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

执行如下命令安装Kubectl Argo Rollout插件,方便通过kubectl进行管理。

brew install argoproj/tap/kubectl-argo-rollouts

启用阿里云服务网格ASM的数据面KubeAPI访问能力

金丝雀发布

创建Rollout

将一下内容保存为rollout.yaml。

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: istio-rollout
spec:
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: istio-rollout
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "true"
      labels:
        app: istio-rollout
    spec:
      containers:
      - name: istio-rollout
        image: argoproj/rollouts-demo:blue
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP
        resources:
          requests:
            memory: 32Mi
            cpu: 5m
  strategy:
    canary:
      canaryService: istio-rollout-canary
      stableService: istio-rollout-stable
      trafficRouting:
        istio:
          virtualService:
            name: istio-rollout-vsvc
            routes:
            - primary
      steps:
      - setWeight: 10
      - pause: {}         # 手工卡点
      - setWeight: 20
      - pause: {duration: 20s}
      - setWeight: 30
      - pause: {duration: 20s}
      - setWeight: 40
      - pause: {duration: 20s}
      - setWeight: 50
      - pause: {duration: 20s}
      - setWeight: 60
      - pause: {duration: 20s}
      - setWeight: 70
      - pause: {duration: 20s}
      - setWeight: 80
      - pause: {duration: 20s}
      - setWeight: 90
      - pause: {duration: 20s}

使用数据面集群的kubeconfig,执行如下命令:

kubectl apply -f rollout.yaml 

创建Service

将一下内容保存为service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: istio-rollout-canary
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: istio-rollout

---
apiVersion: v1
kind: Service
metadata:
  name: istio-rollout-stable
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: istio-rollout

执行如下命令进行创建

kubectl apply -f service.yaml 

创建Istio相关资源

1. 创建虚拟服务VirtualService

由于启用了ASM的数据面KubeAPI访问能力,可以通过数据面的kubeconfig访问ASM中的VirtualService和Gateway、DestinationRule等Istio资源。也可以通过ASM控制台或者ASM kubeconfig创建Istio资源。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: istio-rollout-vsvc
spec:
  gateways:
    - istio-rollout-gateway
  hosts:
    - '*'
  http:
    - match:
        - uri:
            prefix: /
      name: primary
      route:
        - destination:
            host: istio-rollout-stable
          weight: 100
        - destination:
            host: istio-rollout-canary

2. 创建网关规则Gateway

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: istio-rollout-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - '*'
      port:
        name: http
        number: 80
        protocol: HTTP

创建阿里云服务网格ASM网关

选择阿里云服务网格的ASM网关作为我们测试访问的入口,端口设置为80。

查看创建状态

执行如下命令进行查看:

kubectl argo rollouts get rollout istio-rollout
kubectl argo rollouts get rollout istio-rollout
Name:            istio-rollout
Namespace:       default
Status:          ✔ Healthy
Strategy:        Canary
  Step:          18/18
  SetWeight:     100
  ActualWeight:  100
Images:          argoproj/rollouts-demo:blue (stable)
Replicas:
  Desired:       1
  Current:       1
  Updated:       1
  Ready:         1
  Available:     1

NAME                                       KIND        STATUS     AGE  INFO
⟳ istio-rollout                            Rollout     ✔ Healthy  52s  
└──# revision:1                                                        
   └──⧉ istio-rollout-7f96d86486           ReplicaSet  ✔ Healthy  52s  stable
      └──□ istio-rollout-7f96d86486-vpqvb  Pod         ✔ Running  52s  ready:2/2

测试初始状态

在阿里云服务网格 -> ASM网关处,可以获取到刚刚创建的ASM网关的IP地址,在浏览器中输入 http ://{ASM网关IP}/,即可访问。

访问效果如下所示,此界面会并发调用http ://{ASM网关IP}/color,将获取到颜色信息填充到方格中。因为在Rollout istio-rollout中,我们指定的颜色为blue,并且还未进行金丝雀发布,所以显示的只有蓝色。

滚动更新

1:更新镜像版本

我们接下来希望将格子中的颜色逐渐变为黄色。执行如下命令来设置镜像版本的:

kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow" 

此时,rollout中的image更新为了yellow版本。

yellow版本(金丝雀版本)的pod被创建出来,但blue版本(稳定版)依然保存。

2:查询效果

再次查看 http ://{ASM网关IP}/ 

可以看到有10%的方格被设置成了黄色。

3:原因解释

直接原因是因为在服务网格ASM中,之前配置的虚拟服务VirtualService的权重发生了变化,stable(蓝色)的权重从100被修改为了90。canary(黄色)为金丝雀版本,权重从0变为了10。

这个的变化是有Rollout控制的,我们开始创建的Rollout 的第一个step的setWeight中设置了金丝雀版本的权重为10,在开始滚动时,由Argo Rollout的控制器会修改Rollout中配置的VirtualService的权重。pause设置为空,表示需要人工卡点确认,才进到下一阶段。

4. 继续发布

执行如下命令继续发布,VirtualService中的权重会根据Rollout中的配置继续调整。由于后面的步骤中设置了时间,则会等待一段时间后自动调整。

kubectl argo rollouts promote istio-rollout 

5. 更新完成

等待一段时间后所有的颜色块都变为了黄色。

查看Rollout状态,此时stabel的image更新为了yellow。

kubectl argo rollouts get rollout istio-rollout --watch
Name:            istio-rollout
Namespace:       default
Status:          ✔ Healthy
Strategy:        Canary
  Step:          18/18
  SetWeight:     100
  ActualWeight:  100
Images:          argoproj/rollouts-demo:yellow (stable)
Replicas:
  Desired:       1
  Current:       1
  Updated:       1
  Ready:         1
  Available:     1

NAME                                       KIND        STATUS        AGE  INFO
⟳ istio-rollout                            Rollout     ✔ Healthy     48m  
├──# revision:4                                                           
│  └──⧉ istio-rollout-5fcf5864c4           ReplicaSet  ✔ Healthy     27m  stable
│     └──□ istio-rollout-5fcf5864c4-vw6kh  Pod         ✔ Running     26m  ready:2/2
├──# revision:3                                                           
│  └──⧉ istio-rollout-897cb5b6d            ReplicaSet  • ScaledDown  27m  
└──# revision:1                                                           
   └──⧉ istio-rollout-7f96d86486           ReplicaSet  • ScaledDown  48m

和Prometheus结合自动回滚

在金丝雀过程中可以手工执行如下命令进行回滚,会回退到stable版本。更优雅的方式是和Prometheus监控系统结合,当监控指标异常时,自动回滚到stable版本,并标记为降级。

kubectl argo rollouts abort istio-rollout 

在阿里云服务网格ASM中启用Prometheus

参考文档:集成ARMS Prometheus实现网格监控集成自建Prometheus实现网格监控

配置Argo AnalysisTemplate

将阿里云服务网格ASM的prometheus地址配置在AnalysisTemplate的address处。

apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: istio-success-rate
spec:
  args:
  - name: service
  - name: namespace
  metrics:
  - name: success-rate
    initialDelay: 60s
    interval: 20s
    successCondition: result[0] > 0.90
    provider:
      prometheus:
        address: http://xxx.aliyuncs.com:9090/api/v1/prometheus/
        query: >+
          sum(irate(istio_requests_total{
            reporter="source",
            destination_service=~"{
  {args.service}}.{
  {args.namespace}}.svc.cluster.local",
            response_code!~"5.*"}[40s])
          )
          /
          sum(irate(istio_requests_total{
            reporter="source",
            destination_service=~"{
  {args.service}}.{
  {args.namespace}}.svc.cluster.local"}[40s])
          )

为Rollout关联Analysis

在strategy中配置analysis,从第二步开启使用analysis进行监控,自动回滚。初始image为yellow(黄色),将一下内容保存为rollout.yaml。执行kubectl apply -f rollout.yaml对istio-rollout进行更新。

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: istio-rollout
spec:
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: istio-rollout
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "true"
      labels:
        app: istio-rollout
    spec:
      containers:
      - name: istio-rollout
        image: argoproj/rollouts-demo:yellow
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP
        resources:
          requests:
            memory: 32Mi
            cpu: 5m
  strategy:
    canary:
      canaryService: istio-rollout-canary
      stableService: istio-rollout-stable
      analysis:
        startingStep: 1   # index of step list, of when to start this analysis
        templates:
        - templateName: istio-success-rate
        args:
        - name: service 
          value: canary
        - name: namespace
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
      trafficRouting:
        istio:
          virtualService:
            name: istio-rollout-vsvc
            routes:
            - primary
      steps:
      - setWeight: 10
      - pause: {}         # 手工卡点
      - setWeight: 20
      - pause: {duration: 20s}
      - setWeight: 30
      - pause: {duration: 20s}
      - setWeight: 40
      - pause: {duration: 20s}
      - setWeight: 50
      - pause: {duration: 20s}
      - setWeight: 60
      - pause: {duration: 20s}
      - setWeight: 70
      - pause: {duration: 20s}
      - setWeight: 80
      - pause: {duration: 20s}
      - setWeight: 90
      - pause: {duration: 20s}

修改颜色为橙色

kubectl argo rollouts set image istio-rollout "*=argoproj/rollouts-demo:orange" 

人工卡点确认

执行如下命令,进入到后续的自动金丝雀状态,并且从第二步开始,会结合Prometheus监控,如果金丝雀版本错误率高于90%,则触发回滚。

kubectl argo rollouts promote istio-rollout

人工卡点通过后,会自动后续的渐进式发布,通过如下命令可以查看:

kubectl argo rollouts get rollout istio-rollout --watch

设置Error

在后续渐进式发布中,我们可以手动设置Error。移动Error至100%后,所有的金丝雀版本(橙色)都有一个红框,表示错误。同时等待片刻后,将自动切换回只有黄色的(稳定版)。

(金丝雀中)

(自动回滚到稳定版)

总结

在阿里云服务网格ASM中,因为使用了Sidecar模式,更有助于统一服务中使用的指标,方便对金丝雀中的应用健康状态进行监控,及时自动发现问题进行回滚。

目录
相关文章
|
2月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
云原生信息提取系统:容器化流程与CI/CD集成实践
|
2月前
|
机器学习/深度学习 人工智能 监控
CI/CD与模型监控平台集成MLOps系统实现的全面路径
MLOps是机器学习模型在生产环境中持续优化、部署和维护的关键。通过CI/CD流水线和模型监控平台的结合,可以大大提高模型开发和运维的效率,实现高效、稳定的模型服务。随着AI技术的快速发展,MLOps将在企业级AI应用中发挥越来越重要的作用。
CI/CD与模型监控平台集成MLOps系统实现的全面路径
|
3月前
|
机器学习/深度学习 数据采集 存储
朴素贝叶斯处理混合数据类型,基于投票与堆叠集成的系统化方法理论基础与实践应用
本文探讨了朴素贝叶斯算法在处理混合数据类型中的应用,通过投票和堆叠集成方法构建分类框架。实验基于电信客户流失数据集,验证了该方法的有效性。文章详细分析了算法的数学理论基础、条件独立性假设及参数估计方法,并针对二元、类别、多项式和高斯分布特征设计专门化流水线。实验结果表明,集成学习显著提升了分类性能,但也存在特征分类自动化程度低和计算开销大的局限性。作者还探讨了特征工程、深度学习等替代方案,为未来研究提供了方向。(239字)
141 5
朴素贝叶斯处理混合数据类型,基于投票与堆叠集成的系统化方法理论基础与实践应用
|
6月前
|
人工智能 监控 数据可视化
Agent TARS:一键让AI托管电脑!字节开源PC端多模态AI助手,无缝集成浏览器与系统操作
Agent TARS 是一款开源的多模态AI助手,能够通过视觉解析网页并无缝集成命令行和文件系统,帮助用户高效完成复杂任务。
3384 13
Agent TARS:一键让AI托管电脑!字节开源PC端多模态AI助手,无缝集成浏览器与系统操作
|
4月前
|
移动开发 Java 测试技术
HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
本文详细介绍了鸿蒙系统(HarmonyOS)与mPaaS框架的集成方法。鸿蒙系统作为华为开发的分布式操作系统,具备分布式架构、微内核设计等特性;mPaaS是蚂蚁金服推出的移动开发平台,提供金融级组件和全生命周期管理能力。文章从环境准备、核心功能集成(如初始化、用户认证、支付功能)、适配问题解决到调试测试及最佳实践,全方位指导开发者高效集成两者。通过遵循指南,可充分利用鸿蒙的特性和mPaaS的金融能力,构建高性能、高安全性的应用,同时避免常见兼容性问题,缩短开发周期。
217 0
|
6月前
|
人工智能 BI API
Dify-Plus:企业级AI管理核弹!开源方案吊打SaaS,额度+密钥+鉴权系统全面集成
Dify-Plus 是基于 Dify 二次开发的企业级增强版项目,新增用户额度、密钥管理、Web 登录鉴权等功能,优化权限管理,适合企业场景使用。
911 3
Dify-Plus:企业级AI管理核弹!开源方案吊打SaaS,额度+密钥+鉴权系统全面集成
|
5月前
|
存储 安全 API
LarkXR云渲染平台:如何实现应用管理、访问权限控制,并与业务系统嵌入集成
本文讨论了功能完备的PaaS平台LarkXR ,重点介绍其“应用管理”功能。关键要点包括:​ 平台级安全访问控制:构建LarkXR平台开放页面到公网时,可将特定应用设为私有应用,通过设置口令、生成分享链接、禁用分享链接等操作控制访问权限。​ 打造SaaS平台:将LarkXR“工作空间”功能引入业务系统,分别设置用户和应用的工作空间,通过工作空间ID筛选用户可访问的应用列表。​ 接入业务系统:业务系统管理用户和应用,动态展示应用列表,在LarkXR为默认工作空间设置密钥,结合时间戳确保应用访问安全。​ 多业务系统接入与管理:在平台级通过创建不同组别划分渲染池和应用池,绑定不同网络环境的渲染机器。
|
6月前
|
安全 数据可视化 搜索推荐
点晴OA系统:无缝集成,打造高效办公生态圈
在数字化转型浪潮中,企业办公效率的提升已成为决定竞争力的关键因素。点晴OA系统以其卓越的无缝集成能力,正在重塑现代企业的办公生态,为组织带来前所未有的效率提升。
178 5
|
6月前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
230 0
课时5:阿里云容器服务:最原生的集成Docker和云服务

热门文章

最新文章