【GitOps系列】如何实施自动化渐进式交付?

news2024/12/26 10:49:06

文章目录

      • 前言
      • 自动渐进式交付概述
      • 自动渐进式交付准备
        • 创建生产环境
        • 创建 AnalysisTemplate
        • 访问生产环境
        • 安装Prometheus
        • 配置 Ingress-Nginx 和 ServiceMonitor
        • 验证 Ingress-Nginx 指标
      • 自动渐进式交付实战
        • 自动渐进式交付成功
        • 自动渐进式交付失败
      • 结语

前言

在实施金丝雀发布的过程中,我们通过 Argo Rollout 的金丝雀策略将发布过程分成了 3 个阶段,每个阶段金丝雀的流量比例都不同,经过一段时间之后,金丝雀环境变成了新的生产环境。实际上,这也是一种渐进式的交付方式,它通过延长发布时间来保护生产环境,降低了发生生产事故的概率。
不过,这种渐进式的交付方式存在一个明显的缺点:无法自动判断金丝雀环境是否出错?
这可能会导致一种情况,当金丝雀环境在接收生产流量之后,它产生了大量的请求错误,在缺少人工介入的情况下,发布仍然按照计划进行,最终导致生产环境故障。
为了解决这个问题,我们希望渐进式交付变得更加智能,一个好的工程实践方式是: 通过指标分析来自动判断金丝雀发布的质量,如果符合预期,就继续金丝雀步骤;如果不符合预期,则进行回滚。 这样,也就能够避免将金丝雀环境的故障带到生产环境中了,这种分析方法也称之为金丝雀分析

自动渐进式交付概述

在这里插入图片描述

相比较金丝雀发布,自动渐进式交付增加了 Prometheus、Analysis Template 和 AnalysisRun 对象。其中,Analysis Template 定义用于分析的模板,AnalysisRun 是分析模板的实例化,Prometheus 是用来存储指标的数据库。

自动渐进式交付流程图:
在这里插入图片描述

自动渐进式交付开始时,首先会先将金丝雀环境的流量比例设置为20%并持续两分钟,然后将金丝雀环境的流量比例设置为40%并持续两分钟,然后再以此类推到 60%、80%,直到将金丝雀环境提升为生产环境为止。

从第二个阶段开始,自动金丝雀分析开始运行,在持续运行的过程中,如果金丝雀分析失败,那么金丝雀环境将进行自动回滚。这样就达到了自动渐进式交付的目的。

自动渐进式交付准备

创建生产环境

创建用于模拟生产环境的 Rollout 对象、Service 和 Ingress.

cat rollout-with-analysis.yaml 
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: canary-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: canary-demo
  strategy:
    canary:
      analysis:
        templates:
        - templateName: success-rate
        startingStep: 2
        args:
        - name: traefik
          value: traefik-service
        #- name: ingress
        #  value: canary-demo
      canaryService: canary-demo-canary
      stableService: canary-demo
      trafficRouting:
        traefik:
          weightedTraefikServiceName: traefik-service
        #nginx:
        #  stableIngress: canary-demo
      steps:
      - setWeight: 20
      - pause:
          duration: 2m
      - setWeight: 40
      - pause:
          duration: 2m
      - setWeight: 60
      - pause:
          duration: 2m
      - setWeight: 80
      - pause:
          duration: 2m
  template:
    metadata:
      labels:
        app: canary-demo
    spec:
      containers:
      - image: argoproj/rollouts-demo:blue
        imagePullPolicy: Always
        name: canary-demo
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        resources:
          requests:
            cpu: 5m
            memory: 32Mi

对比金丝雀发布的 Rollout 对象并没有太大差异,只是在 canary 字段下面增加了analysis字段,它的作用是指定金丝雀分析的模板,模板内容需单独创建。另外,这里同样使用了argoproj/rollouts-demo:blue镜像来模拟生产环境。

#创建生产环境和金丝雀环境所需要用到的 Service
cat canary-demo-service-v2.yaml 
apiVersion: v1
kind: Service
metadata:
  name: canary-demo
  labels:
    app: canary-demo
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: canary-demo
---
apiVersion: v1
kind: Service
metadata:
  name: canary-demo-canary
  labels:
    app: canary-demo
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: canary-demo

$ kubectl apply -f canary-demo-service-v2.yaml

#创建ingress
cat canary-demo-ingress-v2.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: canary-demo
  labels:
    app: canary-demo
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`progressive.auto`) && PathPrefix(`/`)
      kind: Rule
      services:
        - name: canary-demo
          port: http

创建 AnalysisTemplate

$ cat analysis-success.yaml 
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
spec:
  args:
  - name: traefik
  metrics:
  - name: success-rate
    interval: 10s
    failureLimit: 3
    successCondition: result[0] > 0.90
    provider:
      prometheus:
        address: http://prometheus-kube-prometheus-prometheus.prometheus:9090
        query: >+
          sum(
            rate(traefik_service_requests_total{traefik="{{args.traefik}}",status!~"[4-5].*"}[60s]))
            /
            sum(rate(traefik_service_requests_total{traefik="{{args.traefik}}"}[60s])
          )

介绍一下 AnalysisTemplate 对象字段的含义:
首先spec.args字段定义了参数,该参数会在后续的 query 语句中使用,它的值是从 Rollout 对象的 canary.analysis.args 字段传递进来的。
spec.metrics 字段定义了自动分析的相关配置。其中,interval 字段为频率,每 10 秒钟执行一次分析。failureLimit 字段代表“连续 3 次失败则金丝雀分析失败”,此时要执行回滚动作。successCondition 字段代表判断条件,这里的 result[0] 是一个表达式,代表的含义是当查询语句的返回值大于 0.90 时,说明本次金丝雀分析成功了。
spec.metrics.provider 字段定义了分析数据来源于 Prometheus,还定义了 Prometheus Server 的连接地址
query 字段是金丝雀分析的查询语句。这条查询语句的含义简单理解为:在 60 秒内 HTTP 状态码不为 4xx 和 5xx 的请求占所有请求的比例。换句话说,当 HTTP 请求成功的比例大于 0.90 时,代表一次金丝雀分析成功。

访问生产环境

http://progressive.auto/
在这里插入图片描述

安装Prometheus

由于金丝雀分析需要用到 Prometheus 来查询指标,可以通过helm安装或者用自己本地环境的Prometheus也可以。

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm upgrade prometheus prometheus-community/kube-prometheus-stack \
--namespace prometheus  --create-namespace --install \
--set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false

Release "prometheus" does not exist. Installing it now.
......
STATUS: deployed

--set 对安装参数进行了配置,这是为了让它后续能够顺利获取到 Ingress-Nginx 的监控指标

配置 Ingress-Nginx 和 ServiceMonitor

为了让 Prometheus 能够顺利地获取到 HTTP 请求指标,我们需要打开 Ingress-Nginx Metric 指标端口。

$ kubectl patch deployment ingress-nginx-controller -n ingress-nginx --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/ports/-", "value": {"name": "prometheus","containerPort":10254}}]'
deployment.apps/ingress-nginx-controller patched

然后,为 Ingrss-Nginx Service 添加指标端口。
$ kubectl patch service ingress-nginx-controller -n ingress-nginx --type='json' -p='[{"op": "add", "path": "/spec/ports/-", "value": {"name": "prometheus","port":10254,"targetPort":"prometheus"}}]'
service/ingress-nginx-controller patched

用Traefik的话开启metrics即可
        - containerPort: 9101
          hostPort: 9101
          name: metrics

创建 ServiceMonitor 对象,它可以为 Prometheus 配置指标获取的策略

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: nginx-ingress-controller-metrics
  namespace: prometheus
  labels:
    app: nginx-ingress
    release: prometheus-operator
spec:
  endpoints:
  - interval: 10s
    port: prometheus
  selector:
    matchLabels:
      app.kubernetes.io/instance: ingress-nginx
      app.kubernetes.io/name: ingress-nginx
  namespaceSelector:
    matchNames:
    - ingress-nginx

如果你使用的是Traefik,可以用以下配置:
cat servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: traefik-ingress-controller
  namespace: kubesphere-monitoring-system
  labels:
    app: traefik
spec:
  endpoints:
  - interval: 10s
    port: metrics
  selector:
    matchLabels:
      app: traefik
  namespaceSelector:
    matchNames:
    - traefik

在这里插入图片描述

验证 Ingress-Nginx 指标

测试Prometheus 是否已经成功获取到了 Ingress-Nginx 指标,这将决定自动金丝雀分析是否能成功获取到数据,博主此处用的是Traefik
在这里插入图片描述

自动渐进式交付实战

在这里插入图片描述
此次实战过程中,会按照这张流程图分别进行两个实验。

  • 自动渐进式交付成功(图中①号链路)
  • 自动渐进式交付失败(图中②号链路)

自动渐进式交付成功

验证的话只要更新 Rollout 对象的镜像版本即可。两种方式,第一直接编辑 Rollout 对象并通过 kubectl apply 的方法来更新镜像版本。第二种通过Argo Rollout kubectl插件来更新镜像。

kubectl argo rollouts set image canary-demo canary-demo=argoproj/rollouts-demo:green
rollout "canary-demo" image updated

过一会儿看到绿色方块开始出现,流量占比约为 20%,如下图所示:
在这里插入图片描述
也可以打开Argo Rollout 控制台观察自动渐进式交付过程。可以看到目前处在 20% 金丝雀流量的下一阶段,也就是暂停 2 分钟的阶段。
在这里插入图片描述
2 分钟后,将进入到 40% 金丝雀流量阶段,从这个阶段开始,自动金丝雀分析开始工作,直到最后金丝雀发布完成,金丝雀环境提升为了生产环境,这时自动分析也完成了.

自动渐进式交付失败

上述演示中,由于应用返回的 HTTP 状态码都是 200 ,所以金丝雀分析自然是会成功的。
接下来,我们来尝试进行自动渐进式交付失败的实验。
经过了自动渐进式交付成功的实验之后,当前生产环境中的镜像为 argoproj/rollouts-demo:green,我们继续使用Argo Rollout kubectl插件来更新镜像,并将镜像版本修改为yellow版本。

kubectl argo rollouts set image canary-demo canary-demo=argoproj/rollouts-demo:yellow
rollout "canary-demo" image updated

在这里插入图片描述

接下来,我们让应用返回错误的 HTTP 状态码。你可以滑动界面上的 ERROR 滑动块,将错误率设置为 50%
在这里插入图片描述
现在,你会在黄色方块中看到带有红色描边的方块,这代表本次请求返回的 HTTP 状态码不等于 200,说明 我们成功控制了一部分请求返回错误。
2 分钟后,金丝雀发布会进入到 40% 流量的阶段,此时自动分析将开始进行。可以通过 Argo Rollout 控制台实时观察。

等待一段时间后,金丝雀分析将失败,是预期内的!
此时,Argo Rollout 将执行自动回滚操作,这时候重新返回http://progressive.auto打开应用,你会看到黄色方块的流量消失,所有请求被绿色方块取代,说明已经完成回滚了,如下图所示:
在这里插入图片描述
到这里,一次完整的渐进式交付失败实验就完成了。

结语

跟之前金丝雀发布不同的是:渐进式交付在金丝雀发布的过程中加入了自动金丝雀分析,它可以验证新版本在生产环境中的表现,而这是单纯的金丝雀发布所无法实现的。借助渐进式交付,我们可以在发布过程通过指标实时分析金丝雀环境,兼顾发布的安全性和效率。

值得注意的是,为了能够查询到示例应用的 HTTP 指标,开启了 Ingress-Nginx/Traefik-controller的指标开关,这样所有经过 Ingress-Nginx 的流量都会被记录下来,结合Prometheus ServiceMonitor实现了 HTTP 请求指标的采集。

此外,为了让 ArgoCD 在渐进式交付时顺利运行金丝雀分析,我们还需要创建AnalysisTemplate对象,它实际上是 PromQL 编写的查询语句,ArgoCD 在交付过程中会用这条语句去 Prometheus 查询,并将返回的结果和预定义的阈值进行对比,以此控制渐进式交付应该继续进行还是回滚。

在实际的业务场景中,如果希望验证多个维度的指标,你可以创建多个AnalysisTemplate并将它配置到 Rollout 对象中,进一步提高分析的可靠性。另外,还可以在金丝雀发布的steps阶段里配置“内联”的分析步骤,比如在金丝雀环境 20% 和 40% 流量阶段的下一阶段分别运行不同的金丝雀分析,具体参考 https://argoproj.github.io/argo-rollouts/features/analysis/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/832942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang之路---03 面向对象——反射

反射 反射的存在意义 在开发中,你或许会碰到在有些情况下,你需要获取一个对象的类型,属性及方法,而这个过程其实就是反射。 golang中变量包括(type, value)两部分 静态类型 所谓的静态类型(…

【智慧校园】智慧班牌云平台源码,使用springboot vue框架

【智慧校园】智慧班牌云平台源码,使用springboot vue框架 前后端分离架构 1、使用springboot vue框架 2、数据库MySQL5.7 3、移动端小程序使用小程序原生语言开发 4、电子班牌固件安卓7.1;使用Java Android原生 5、java,elmentui &…

四、Unity中颜色空间

Unity中的设置 通过点击菜单Edit->Project Settings->Player页签->Other Settings下的Rendering部分进行修改,参数Color Space可以选择Gamma或Linear。 当选择Gamma Space时,Unity不会做任何处理。当选择Linear Space时,引擎的渲染…

电测知识分享——三千字解读时钟电路最重要部件,建议收藏!

晶振作为时钟电路中最重要的部件,在电路中起着产生震荡频率的作用,可以产生高度稳定的信号,并稳定工作环境,为系统提供基本的时钟信号,在工业、科技、车载、数码、电子等多个领域几乎都有应用场景。 今天,…

MySQL binLog问题

看到数据库目录下有很多OFF.*文件的时候很诧异,这玩意是啥,binlog不应该都是*bin-log.*​的文件吗?* [roottest ~]# cd /data/mysql_data [roottest mysql_data]# ls ansible hap_attach_yl hap_func_yl hap_msg_yl h…

区块链媒体发稿:区块链媒体宣发常见问题解析

据统计,由于区块链应用和虚拟货币的兴起,越来越多媒体对区块链领域开展报导,特别是世界各国媒体宣发全是热火朝天。但是,随着推卸责任媒体宣发的五花八门,让很多人因而上当受骗,乃至伤害一大笔资产。身为投…

【TiDB理论知识08】HATP概述

1 HTAP技术 OLTP 在线事务 支付 转账 高并发 每次操作的数据量少 ,行存 OLAP 报表分析 每次操作大量数据 列存储 2 传统解决方案 数据抽取到数仓或者数据湖 ETL有延迟 ,一般会有T1 T2 数据多副本 3 HTAP的要求 4 TIDB的HTAP架构 TiFlash特点&…

IO进程线程day6(2023.8.3)

一、Xmind整理&#xff1a; 进程与线程关系&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;pthread_create 功能&#xff1a;创建一个线程 原型&#xff1a; #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, vo…

【新版系统架构补充】-七层模型

网络功能和分类 计算网络的功能 &#xff1a;数据通信、资源共享、管理集中化、实现分布式处理、负载均衡 网络性能指标&#xff1a;速率、带宽&#xff08;频带宽度或传送线路速率&#xff09;、吞吐量、时延、往返时间、利用率 网络非性能指标&#xff1a;费用、质量、标准化…

三、基本流程控制结构

3.1结构化程序设计 基本控制结构&#xff1a; 顺序结构选择结构循环结构 C语句&#xff1a; 说明语句控制语句函数调用语句表达式语句空语句复合语句 3.2选择结构语句 if语句&#xff1a; &#xff08;1&#xff09;单选条件语句 if(表达式) 语句 if(x>y) cout<&l…

Tomcat的介绍和安装配置、eclipse中动态web项目的创建和运行、使用IDEA创建web项目并运行

一、Tomcat的介绍和安装配置 安装tomcat&#xff1a; 环境变量的配置&#xff1a; 配置之后重启cmd&#xff0c;执行startup命令&#xff0c;启动tomcat 在localhost:8080&#xff0c;能进入tomcat主界面&#xff0c;说明配置成功 二、eclipse中动态web项目的创建和运行 tomca…

基于回溯算法实现八皇后问题

八皇后问题是一个经典的计算机科学问题&#xff0c;它的目标是将8个皇后放置在一个大小为88的棋盘上&#xff0c;使得每个皇后都不会攻击到其他的皇后。皇后可以攻击同一行、同一列和同一对角线上的棋子。 一、八皇后问题介绍 八皇后问题最早由国际西洋棋大师马克斯贝瑟尔在18…

王道《操作系统》学习(二)—— 进程管理(二)

2.1 处理机调度的概念、层次 2.1.1 调度的基本概念 2.1.2 调度的三个层次 &#xff08;1&#xff09;高级调度&#xff08;作业调度&#xff09; &#xff08;2&#xff09;中级调度&#xff08;内存调度&#xff09; 补充知识&#xff1a;进程的挂起状态和七状态模型 &#x…

Three.js室内场景

Three.js实现三维可视化室内场景 1.效果 2.安装 要安装three 的 npm 模块,请在你的项目文件夹里打开终端窗口,并运行: npm install three 或 yarn add three包将会被下载并安装。然后你就可以将它导入你的代码了: import * as THREE from three引入性能监视器: impor…

MySQL日志——错误日志、二进制日志

错误日志二进制日志查询日志慢查询日志 1.错误日志 查看日志位置&#xff1a; show variables like %log_error%查看错误日志&#xff1a; tail -f /var/log/mysql.log2.二进制日志 show variables like %log_bin%;cd /var/lib/mysql ll2.1 日志格式 查看日志格式指令&…

第9章 CSS-DOM

三位一体的网页 游览器由结构层&#xff0c;表现层&#xff0c;行为层组成 结构层 网页的结构层&#xff08;structural layer&#xff09;由HTML或XHTML之类的标记语言负责创建。 表现层 表示层&#xff08;presentation layer&#xff09;由CSS负责完成。CSS描述页面内容…

腾讯云COS+PicGO+截图工具+Obsidian+Typora+蚁小二:打造丝滑稳定的Markdown写作和分发环境

背景 很久很久以前&#xff0c;我写过一篇《有道云笔记EverythingTyporaGitHub图床PicGojsDelivr加速截图工具——创造丝滑免费的Markdown写作环境》&#xff08;https://blog.csdn.net/qq_43721542/article/details/9685957&#xff09;&#xff0c;当时的目的是打造一个云同…

中国艺术孙溟㠭篆刻作品《活着》

人人为生活挣扎着&#xff0c;做着不想做的事&#xff0c;说着不想说的话&#xff0c;为生活低头弯腰委屈求全人生苦多甜少&#xff0c;何时了&#xff01;何时了&#xff01;甜来人生到头了…… 孙溟㠭篆刻作品《活着》 孙溟㠭篆刻作品《活着》 孙溟㠭篆刻作品《活着》 文/九钵

美团基础架构面经总结汇总

美团基础架构的面经。 问的全是基础,一个编程语言的问都没有。 问题记录 MySQL-MVCC InooDB是通过 MVCC 实现可重复读的隔离级别的,MVCC 就是多版本并发控制,它其实记录了历史版本的数据,解决了读写并发冲突问题。有一个版本编码,然后它进入了各种操作下的数据状态,能…

2023华数杯数学建模A题思路 - 隔热材料的结构优化控制研究

# 1 赛题 A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性&#xff0c;在航天、军工、石化、建筑、交通等 高科技领域中有着广泛的应用。 目前&#xff0c;由单根隔热材料 A 纤维编织成的织物&#xff0c;其热导率可以直接测出&#xff1b;但是 单根隔热…