首页 > 其他分享 >13、Argo Rollouts请求分析和渐进式交付

13、Argo Rollouts请求分析和渐进式交付

时间:2023-04-22 10:31:38浏览次数:42  
标签:13 name Rollouts spring boot prom helloworld prometheus Argo

请求分析和渐进式交付

Argo Rollouts中的分析(Analysis)是用于根据阶段性交付效果的测量结果来推动渐进式交付的机制
   ◼ 分析机制通过分析模板(AnalysisTemplate CRD)定义,而后在Rollout中调用它
   ◼ 运行某次特定的交付过程时,Argo Rollouts会将该Rollout调用的AnalysisTemplate实例化为AnalysisRun(CRD)

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付

AnalysisTemplate资源与AnalysisRun CRD
示例说明
   ◼ 定义了一个名为service-name的参数
      ◆用于传递要测量的服务的名称
   ◼ 定义了success-rate指标
      ◆测试指定服务的请求成功率
   ◼ 每隔20s查询一次prometheus服务,共执行三次
   ◼ 成功条件为:第1个指标(下标为0)的结果值大于等于0.95
   ◼ 遇到3次错误即终止进一步的测试

AnalysisRun CRD
   ◼ 配置格式与AnalysisTemplaste大致相同,所不同的是,AnalysisRun用于调用并实例化分析模板
结合Prometheus指标进行analysis
一:让ingress-controller能够允许prometheus过来抓指标
修改ingress-nginx-controller

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_02

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_03

二:部署Prometheus
克隆仓库,进行部署
git clone https://github.com/iKubernetes/k8s-prom.git

[root@ubuntu2004 ~]#cd k8s-prom/
[root@ubuntu2004 k8s-prom]#ls
k8s-prometheus-adapter  namespace.yaml  podinfo     prometheus-ingress
kube-state-metrics      node_exporter   prometheus  README.md

创建名称空间
[root@ubuntu2004 k8s-prom]#cat namespace.yaml 
---
apiVersion: v1
kind: Namespace
metadata:
  name: prom

[root@ubuntu2004 k8s-prom]#kubectl apply -f namespace.yaml 

把prometheus目录下的资源进行部署(相关文件内容不在展示,请克隆自行查看)
[root@ubuntu2004 k8s-prom]#kubectl apply -f prometheus/ -n prom

查看prom名称空间下的pod
[root@ubuntu2004 k8s-prom]#kubectl get pods -n prom
三:让prometheus能够在集群外部进行访问,使用ingress把其发布出去
[root@ubuntu2004 k8s-prom]#kubectl apply -f prometheus-ingress -n prom
在桌面系统对域名进行解析,然后打开页面

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_04

外部请求都是正确的

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_05

再起一终端修改外部请求,如修改请求到错误的Url上
while true; do curl hello.magedu.com/magedu.com; sleep $[$RAMDOM%20]; done

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_06

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_07

四:拆掉之前的rollouts资源,建立基于prometheus监控,自动执行更新的rollouts资源
[root@ubuntu2004 ~]#cd learning-jenkins-cicd/09-argocd-and-rollout/rollout-demos/
[root@ubuntu2004 rollout-demos]#ls
01-basic-rollouts-demo.yaml                           04-rollouts-bluegreen-demo.yaml
02-rollouts-with-ingress-nginx-traffic-shifting.yaml  05-rollouts-bluegreen-with-analysis.yaml
03-rollouts-with-prometheus-analysis.yaml             06-argocd-application-and-rollouts.yaml

拆除
[root@ubuntu2004 rollout-demos]#kubectl delete -f 02-rollouts-with-ingress-nginx-traffic-shifting.yaml

取消所有的外部访问,不取消会产生大量的错误

部署新的示例
[root@ubuntu2004 rollout-demos]#cat 03-rollouts-with-prometheus-analysis.yaml 
# CopyRight: MageEdu <[email protected]>
#
---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
spec:
  args:
  - name: service-name
  - name: namespace
  metrics:
  - name: success-rate
    # NOTE: prometheus queries return results in the form of a vector.
    # So it is common to access the index 0 of the returned array to obtain the value
    successCondition: result[0] >= 0.95
    interval: 20s 
    count: 5
    failureLimit: 3
    provider:
      prometheus:
        address: http://prometheus.prom.svc.cluster.local:9090
        query: |
          sum(irate(nginx_ingress_controller_requests{service=~"{{args.service-name}}",namespace=~"{{args.namespace}}",status!~"[4-5].*"}[1m])) / 
          sum(irate(nginx_ingress_controller_requests{service=~"{{args.service-name}}",namespace=~"{{args.namespace}}"}[1m]))
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-helloworld-with-traffic-shifting
spec:
  replicas: 10 
  strategy:
    canary:
      analysis:
        templates:
        - templateName: success-rate
        args:
        - name: service-name
          value: spring-boot-helloworld
        - name: namespace
          value: default
      canaryService: spring-boot-helloworld-canary
      stableService: spring-boot-helloworld
      trafficRouting:
        nginx:
          stableIngress: spring-boot-helloworld
      steps:
      - setCanaryScale:
          matchTrafficWeight: true
      - setWeight: 5
      - pause: {duration: 2m}
      - setWeight: 10
      - pause: {duration: 1m}
      - setWeight: 20
      - pause: {duration: 40}
      - setWeight: 40
      - pause: {duration: 20}
      - setWeight: 60
      - pause: {duration: 20}
      - setWeight: 80
      - pause: {duration: 20}
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: spring-boot-helloworld
  template:
    metadata:
      labels:
        app: spring-boot-helloworld
    spec:
      containers:
      - name: spring-boot-helloworld
        image: ikubernetes/spring-boot-helloworld:v0.9.2
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
        resources:
          requests:
            memory: 32Mi
            cpu: 50m
        livenessProbe:
          httpGet:
            path: '/'
            port: 80
            scheme: HTTP
          initialDelaySeconds: 3
        readinessProbe:
          httpGet:
            path: '/'
            port: 80
            scheme: HTTP
          initialDelaySeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-helloworld
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: spring-boot-helloworld
---
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-helloworld-canary
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: spring-boot-helloworld
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-boot-helloworld
spec:
  ingressClassName: "nginx"
  rules:
    - host: hello.magedu.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: spring-boot-helloworld
                port:
                  number: 80
---

kubectl apply -f 03-rollouts-with-prometheus-analysis.yaml
部署完成之后,继续发起外部的访问请求

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_08

再打开一终端,进行非正常访问

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_09

进行版本更新

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_10

进行分析,查询5次,得平均值,如果满足>0.95得条件,则会自动更新,反之,会回滚

13、Argo Rollouts请求分析和渐进式交付_请求分析和渐进式交付_11

标签:13,name,Rollouts,spring,boot,prom,helloworld,prometheus,Argo
From: https://blog.51cto.com/mfc001/6215069

相关文章

  • P1350 车的放置 题解
    一、题目描述:给你一个网格棋盘,a,b,c,d 表示了对应边长度,也就是对应格子数。例如,当a=b=c=d=2时,对应如下面这样一个棋盘:想要在这个棋盘上放 k棋子,也就是这 k 个棋子没有两个在同一行,也没有两个在同一列,问有多少种方案。数据保证 0......
  • Eigensequence UVA - 11133
    给你一个递增序列的第一位a1,最后一位an,求有多少个序列满足:以a1为首,an为尾 1、B(1)=A(1)2、后面每项满足A[j]=B[j], A(j-1)<B(j)≤A(j),且bj能整除A(j)-A(j-1)。   F[i][j]最后一位为j的方案数#include<iostream>#include<cstring>#include<a......
  • 数据结构 玩转数据结构 13-3 红黑树与2-3树的等价性
    0课程地址https://coding.imooc.com/lesson/207.html#mid=15082 1重点关注1.12-3树的绝对平衡性演示推导  1.22-3树的绝对平衡性归纳a插入2节点,直接融合b插入3节点,融合后向上分裂c循环 3节点分裂后依次判断父节点是......
  • [ARC138D] Differ by K bits 题解
    小清新构造题。首先\(K=1\)的情况是trival的,直接格雷码即可。对于\(K>1\),我们发现题目的约束相当于\(\operatorname{popcount}(P_i\oplusP_{(i+1)\bmod2^N})=K\),考虑\(P_i\)的差分序列\(D_i\),那么\(D_i\)一定是一个恰好有\(K\)位\(1\)的二进制数,记\(S=\{i\mid......
  • Java-Day-13(抽象类 + 接口 + 内部类)
    Java-Day-13抽象类(abstract)当父类的某些方法需要声明,但是又不确定如何实现时(主要在于子类的重写时),可以将其声明为抽象方法,那么这个类就是抽象类所谓抽象方法就是没有实现的方法,而所谓没有实现就是指没有方法体当一个类中存在抽象方法时,需要将该类声明为abstract......
  • 猛读论文13 |【CVPR 2022 UDA】Unleashing Potential of Unsupervised Pre-Training w
    动机解决(1)对比学习管道中的增强通常会扭曲人物图像中的判别线索(2)细粒度的局部特征人物图像尚未得到充分探索。 思路    方法 ......
  • 多态性13
    #include<iostream>usingnamespacestd;classBaseClass{ public: BaseClass(){ cout<<"constructBaseClass"<<endl; } ~BaseClass(){ cout<<"destructBaseClass"<<endl; }};classDerived:publicBaseClass{ p......
  • c++训练打卡(13)
    分糖果问题:10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样......
  • 什么是EAN13条码及其如何制作
    EAN13条码是世界通用的条形码,由前缀码、厂商识别码、商品项目代码和校验码组成,总共13位数字,其编码遵循唯一性原则,能够保证在全世界范围内不重复。 EAN13条码由左侧空白区、起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符、右侧空白区及供人识别字符组成。我国......
  • 求出11-12+13-14…
    求出1/1-1/2+1/3-1/4…..1/100的和vari=1;(倒数和)首先分析题目,可以找出规律,分母为奇数时为累加,分母为偶数时累减。由此可以写出循环逻辑<script>letsum=0 //首先定义一个变量用来存放加减结果for(leti=1;i<=100;i++){if(i......