Istio 使用 Apache SkyWalking 进行服务链路追踪、链路监控告警

news2024/11/25 9:46:56

一、Istio 使用 Apache SkyWalking 链路追踪和告警

SkyWalking是一个开源的观测平台,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,SkyWalking 提供了一种简便的方式来清晰地观测分布式系统,甚至可以观测横跨不同云的系统,SkyWalking 更像是一种现代的应用程序性能监控(Application Performance Monitoring,即APM)工具,专为云原生,基于容器以及分布式系统而设计。

此外,SkyWalking 还提供了链路监控告警功能,允许用户在服务性能指标异常时及时得到通知。用户可以定义多种告警规则,如服务响应时间、成功率等指标的阈值,当指标超过阈值时触发告警。系统还会记录所有告警的历史信息,便于用户回顾和分析系统的稳定性问题。

在这里插入图片描述

Istio 针对链路追踪本身就支持多种方式,包括 Zipkin、JaegerSkyWalking,默认支持 Zipkin 格式的追踪数据,本篇文章实验 Istio 使用 SkyWalking 进行服务链路追踪和监控告警,其中告警本次采用钉钉机器人,所以在开启前请准备好一个钉钉机器人,机器人的安全验证模式,这里我采用的加签模式:

在这里插入图片描述

二、K8s 部署 Apache SkyWalking

这里将 SkyWalking 的数据存储至 ES 中,需要有一个可用的 ES 服务,如果没有可以参考下面文章在 K8s 中部署一个:

K8s 部署 elasticsearch-7.14.0 集群 及 kibana 客户端

编写 skywalking.yml 清单,注意其中 ES 和钉钉机器人的信息换成你的环境下的:

vi skywalking.yml
kind: ConfigMap
apiVersion: v1
metadata:
  name: alarm-settings
  namespace: istio-system
data:
  alarm-settings.yml: |-
    rules:
      # Rule unique name, must be ended with `_rule`.
      service_resp_time_rule: ## 服务的平均响应时间超过1000毫秒时,如果在过去10分钟内发生3次,就会触发告警。
        metrics-name: service_resp_time 
        op: ">"
        threshold: 1000
        period: 10
        count: 3
        silence-period: 5
        message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.
      service_sla_rule: ## 服务的成功响应率低于80%(即8000/10000)时,如果在过去10分钟内发生2次,就会触发告警。
        # Metrics value need to be long, double or int
        metrics-name: service_sla
        op: "<"
        threshold: 8000
        # The length of time to evaluate the metrics
        period: 10
        # How many times after the metrics match the condition, will trigger alarm
        count: 2
        # How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.
        silence-period: 3
        message: Successful rate of service {name} is lower than 80% in 2 minutes of last 10 minutes
      service_resp_time_percentile_rule: ## 服务的响应时间百分位数(p50, p75, p90, p95, p99)中的任何一个超过1000毫秒时,如果在过去10分钟内发生3次,就会触发告警。
        # Metrics value need to be long, double or int
        metrics-name: service_percentile
        op: ">"
        threshold: 1000,1000,1000,1000,1000
        period: 10
        count: 3
        silence-period: 5
        message: Percentile response time of service {name} alarm in 3 minutes of last 10 minutes, due to more than one condition of p50 > 1000, p75 > 1000, p90 > 1000, p95 > 1000, p99 > 1000
      service_instance_resp_time_rule: ## 服务实例的平均响应时间
        metrics-name: service_instance_resp_time
        op: ">"
        threshold: 1000
        period: 10
        count: 2
        silence-period: 5
        message: Response time of service instance {name} is more than 1000ms in 2 minutes of last 10 minutes
      database_access_resp_time_rule: ## 数据库访问的平均响应时间
        metrics-name: database_access_resp_time
        threshold: 1000
        op: ">"
        period: 10
        count: 2
        message: Response time of database access {name} is more than 1000ms in 2 minutes of last 10 minutes
      endpoint_relation_resp_time_rule: ## 端点关系的平均响应时间
        metrics-name: endpoint_relation_resp_time
        threshold: 1000
        op: ">"
        period: 10
        count: 2
        message: Response time of endpoint relation {name} is more than 1000ms in 2 minutes of last 10 minutes
    #  Active endpoint related metrics alarm will cost more memory than service and service instance metrics alarm.
    #  Because the number of endpoint is much more than service and instance.
    #
    #  endpoint_resp_time_rule:
    #    metrics-name: endpoint_resp_time
    #    op: ">"
    #    threshold: 1000
    #    period: 10
    #    count: 2
    #    silence-period: 5
    #    message: Response time of endpoint {name} is more than 1000ms in 2 minutes of last 10 minutes
    
    dingtalkHooks:
      textTemplate: |-
        {
          "msgtype": "text",
          "text": {
            "content": "Apache SkyWalking Alarm: \n %s."
          } 
        }
      webhooks:
        - url: https://oapi.dingtalk.com/robot/send?access_token=你的机器人token
          secret: 你的Secret

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-oap
  namespace: istio-system
  labels:
    app: skywalking-oap
spec:
  selector:
    matchLabels:
      app: skywalking-oap
  template:
    metadata:
      labels:
        app: skywalking-oap
        sidecar.istio.io/inject: "false"
    spec:
      containers:
        - name: skywalking-oap
          image: apache/skywalking-oap-server:9.1.0
          env:
            - name: SW_HEALTH_CHECKER
              value: default
            - name: SW_STORAGE
              value: elasticsearch
            - name: SW_STORAGE_ES_CLUSTER_NODES
              value: es.default.svc.cluster.local:9200
            - name: SW_ES_USER
              value: esuser
            - name: SW_ES_PASSWORD
              value: espassword
          volumeMounts:
            - name: alarm-settings
              mountPath: /skywalking/config/alarm-settings.yml
              subPath: alarm-settings.yml
          readinessProbe:
            exec:
              command:
              - /skywalking/bin/swctl
              - health
            initialDelaySeconds: 30
            periodSeconds: 5
      volumes:
        - name: alarm-settings
          configMap:                                
            name: alarm-settings
          
---
apiVersion: v1
kind: Service
metadata:
  name: tracing
  namespace: istio-system
  labels:
    app: skywalking-oap
spec:
  type: ClusterIP
  ports:
    - name: grpc
      port: 11800
      protocol: TCP
      targetPort: 11800
    - name: http-query
      port: 12800
      protocol: TCP
      targetPort: 12800
  selector:
    app: skywalking-oap
---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: skywalking-oap
  name: skywalking-oap
  namespace: istio-system
spec:
  ports:
    - port: 11800
      targetPort: 11800
      name: grpc
    - port: 12800
      targetPort: 12800
      name: http-query
  selector:
    app: skywalking-oap
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-ui
  namespace: istio-system
  labels:
    app: skywalking-ui
spec:
  selector:
    matchLabels:
      app: skywalking-ui
  template:
    metadata:
      labels:
        app: skywalking-ui
      annotations:
        sidecar.istio.io/inject: "false"
    spec:
      containers:
        - name: skywalking-ui
          image: apache/skywalking-ui:9.1.0
          env:
            - name: SW_OAP_ADDRESS
              value: http://skywalking-oap:12800
          readinessProbe:
            httpGet:
              path: /
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: tracing-ui
  namespace: istio-system
  labels:
    app: skywalking-ui
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: skywalking-ui
---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: skywalking-ui
  name: skywalking-ui
  namespace: istio-system
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      name: http
  selector:
    app: skywalking-ui

其中告警规则字段的解释如下:

metrics-name:监控的指标名称。
op:比较操作符(例如 > 表示大于)。
threshold:触发告警的阈值。
period:评估指标的周期(分钟)。
count:在周期内满足条件的最小次数,以触发告警。
silence-period:告警触发后的静默期(分钟)。
message:告警消息,其中 {name} 将被替换为实际的服务名、实例名或端点名。

提交:

kubectl apply -f skywalking.yml

查看 pod

kubectl get pods -n istio-system

在这里插入图片描述

查看 skywalking-uiNodePort 端口:

kubectl get svc -n istio-system

在这里插入图片描述

浏览器访问:http://{node ip}:32327:

在这里插入图片描述

三、Istio 配置向 SkyWalking 发送链路追踪

Istio 代理默认不向 SkyWalking 发送链路追踪,需要修改 Istio 配置文件,在 k8s 中是以 ConfigMap 的方式存储的:

kubectl get cm -n istio-system

在这里插入图片描述

修改 istio

kubectl edit cm istio -n istio-system

defaultProviders 下增加 :

    defaultProviders:
      metrics:
      - prometheus
      tracing:
      - "skywalking"

extensionProvidersskywalking 的地址指向上面部署的服务:

    extensionProviders:
    - name: skywalking
      skywalking:
        port: 11800
        service: tracing.istio-system.svc.cluster.local

整体配置如下:

在这里插入图片描述
保存后自动生效。

四、链路追踪测试

这里部署 istio 官方使用的 Bookinfo 示例应用,测试链路追踪,该应用的结构如下:

在这里插入图片描述

创建一个命名空间,将Bookinfo 服务放在该空间下:

kubectl create ns test

给该命名空间添加标签,指示在部署应用的时候,自动注入 Envoy 边车代理:

kubectl label namespace test istio-injection=enabled

部署 Bookinfo 示例应用:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/bookinfo/platform/kube/bookinfo.yaml -n test

查看 pod

kubectl get pods -n test

在这里插入图片描述

部署 Bookinfo 应用的 GatewayVirtualService ,允许外部访问:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/bookinfo/networking/bookinfo-gateway.yaml -n test

查看 istio-ingressgateway 入口的 NodePort 端口:

kubectl get svc istio-ingressgateway -n istio-system

在这里插入图片描述

80端口对应的是 30868 ,然后使用浏览器访问 http://{node port}:30868/productpage ,可以打开 Bookinfo的示例页面:

在这里插入图片描述
然后多刷新访问几次后,去 SkyWalking 中查看,可以看到服务信息已经记录上来了:

在这里插入图片描述

点击 Topology 可以看到服务链路模型

在这里插入图片描述

点击 Trace 可以看到详细追踪信息:

在这里插入图片描述

五、链路监控告警测试

修改 Bookinfo 应用 review 的访问规则,使用 VirtualService 注入随机故障:

vi reviews-vs.yml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews-dr
  namespace: test
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-vs
  namespace: test
spec:
  hosts:
    - "reviews"
  http:
    - route:
      - destination:
          host: reviews
          port:
            number: 9080
          subset: v1
        weight: 30
      - destination:
          host: reviews
          port:
            number: 9080
          subset: v2
        weight: 30
      - destination:
          host: reviews
          port:
            number: 9080
          subset: v3
        weight: 40
      fault:
        delay:
          percentage:
            value: 20
          fixedDelay: 5s
        abort:
          percentage:
            value: 80
          httpStatus: 500

这里随机注入了 20% 的请求产生 5 秒的延时,80% 的请求直接中止返回 500 状态码。

下面在浏览器多次访问 http://{node port}:30868/productpage ,等待片刻后观察 SkyWalking 中的告警信息:

在这里插入图片描述

已经出现告警了,此时钉钉机器人应该也收到了告警信息:

在这里插入图片描述

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

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

相关文章

Linux修炼之路之基础指令(2)+shell命令及运行原理

目录 一&#xff1a;基础指令 7.rm指令 和 rmdir指令 8.*通配符 9.man指令 10.echo指令 11.cat 指令 12.cp 指令 13.mv指令 14.alias 指令 15.less more head tail wc-l 指令 16.date 时间相关的指令 17.cal指令 18. find which whereis 三个查找文件指令…

Android内核之解决报错:error: ISO C90 forbids mixing declarations and code(七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

两个手机在一起ip地址一样吗?两个手机是不是两个ip地址

在数字时代的浩瀚海洋中&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着移动互联网的飞速发展&#xff0c;IP地址成为了连接手机与互联网的桥梁。那么&#xff0c;两个手机在一起IP地址一样吗&#xff1f;两个手机是不是两个IP地址&#xff1f;本文将带您一探究竟&a…

Python实战开发及案例分析(18)—— 逻辑回归

逻辑回归是一种广泛用于分类任务的统计模型&#xff0c;尤其是用于二分类问题。在逻辑回归中&#xff0c;我们预测的是观测值属于某个类别的概率&#xff0c;这通过逻辑函数&#xff08;或称sigmoid函数&#xff09;来实现&#xff0c;该函数能将任意值压缩到0和1之间。 逻辑回…

docker安装向量数据库milvus

Miluvs Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据(图片 / 视频 / 语音 / 文本)检索。 单节点 Milvus 可以在秒内完成十亿级的向量搜索,分布式架构亦能满足用户的水平扩展需求。 Milvus 向量数据库的应用场景包括:互联网娱乐(图片搜索 / 视频搜索)、新零售…

数据结构与算法===贪心算法

文章目录 定义适用场景柠檬水找零3.代码 小结 定义 还是先看下定义吧&#xff0c;如下&#xff1a; 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。 适用场景 由于…

基于gin框架的文件上传(逐行解析)

基于gin框架的文件上传(逐行解析)记录一下使用gin框架完成一个文件上传的功能&#xff0c;一下是实现该功能的代码&#xff0c;适合小白&#xff0c;代码都有逐行解释&#xff01; app.go: package routerimport ("chat/service""github.com/gin-gonic/gin&qu…

【matlab】matlab实现倒谱法基音频率检测和共振峰检测(源码+音频文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

校园卡没到期可以换套餐吗

校园卡没到期可以换套餐吗 校园卡是可以更换套餐的&#xff0c;但具体问题还是要具体分析&#xff0c;根据实际情况来进行选择。 校园卡改套餐分为两种情况&#xff0c;一种是没有签订任何协议的校园卡套餐&#xff0c;这种情况用户是可以随时更换通信资费套餐的&#xff1b;另…

【PHP【实战版】系统性学习】——登录注册页面的教程,让编写PHP注册变成一个简单的事情

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Oracle SQL优化案例-查询Null值走索引

网友发来一个SQL&#xff0c;说他们公司的一个SQL要优化帮忙看一下&#xff0c;执行计划如下&#xff1a; -------------------------------------SELECT * FROM (SELECT * FROM TXS C WHERE C.A ISNULL OR C.A ORDER BY ID_TXS DESC) WHERE ROWNUM<100​---------------…

集成平台建设方案(大数据中台技术方案)—Word原件

基础支撑平台主要承担系统总体架构与各个应用子系统的交互&#xff0c;第三方系统与总体架构的交互。需要满足内部业务在该平台的基础上&#xff0c;实现平台对于子系统的可扩展性。基于以上分析对基础支撑平台&#xff0c;提出了以下要求&#xff1a; 基于平台的基础架构&…

arm架构下安装conda

一、参考文章&#xff1a;感谢这位网友的分享&#xff0c;搬过来以备过几天使用&#xff0c;这种小众系统真的有些麻烦解决方案&#xff1a;ARM架构下安装Miniconda 离线配置Conda环境的全流程及踩坑避坑指南 - 技术栈 二、步骤 2.1 确认系统架构 uname -m 2.2 根据架构下载…

云贝教育 |【直播课】5月19日Oracle 19c OCM认证大师课 即将上课了!(附课件预览)

贝教育独家认证课OCM全网价格最低&#xff0c;性价比最高&#xff01;&#xff01;&#xff01; Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 1…

浅析vue3自定义指令

vue3中可以像下面这样使用自定义指令。 这里我们只是定义了一个vFoucs变量&#xff0c;vue怎么知道这是一个指令呢&#xff1f; 这是因为约定大于配置&#xff0c;vue3中有这样一个约定&#xff08;截图来自官方文档&#xff09;&#xff1a; 注意这里说的是驼峰命令&#x…

插入法(直接/二分/希尔)

//稳定耗时&#xff1a; 双向冒泡&#xff0c;可指定最大最小值个数MaxMinNum<nsizeof(Arr)/sizeof(Arr[0]), void BiBubbleSort(int Arr[],int n&#xff0c;int MaxMinNum){int left0,rightn-1;int i;bool notDone true;int temp;int minPos;while(left<right&&am…

《Linux运维总结:ARM64架构CPU基于docker-compose一离线部署rabbitmq 3.10.25容器版镜像模式集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

情感感知OCR:整合深度学习技术提升文字识别系统的情感理解能力

摘要&#xff1a;随着深度学习技术的发展&#xff0c;文字识别&#xff08;OCR&#xff09;系统在识别准确率和速度上取得了长足的进步。然而&#xff0c;在处理文本时&#xff0c;仅仅依靠字符和词语的识别并不足以满足用户对信息的全面理解需求。本文提出了一种新颖的方法&am…

Navicat 17:先睹为快

官方声明&#xff1a;Navicat 17&#xff08;英文版&#xff09;目前处于测试阶段中&#xff0c;并计划 5 月 13 日发布&#xff01; 如果你觉得 Navicat 16 已经推出很多令人兴奋的新功能&#xff0c;那么这次你可能要好好看看 Navicat 17&#xff0c;本次升级涵盖了更多的内容…

vscode切换分支及合并分支操作教程

工具&#xff1a;gitee、git 、vscode、Git Graph 点击可以看到分支管理明细。 一、前提 1、首先要有两个分支 &#xff08;1&#xff09;分支说明&#xff1a; test&#xff1a; 测试分支 feature/luo-20240508&#xff1a;自己的开发分支 &#xff08;2&#xff09;分支说…