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

一、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 中的告警信息:

在这里插入图片描述

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm粘贴失灵?一文教你快速恢复!(如何解决Pycharm无法粘贴的问题)

文章目录 💢 问题 💢🏡 演示环境 🏡💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 "为什么你的代码编辑器突然变得不听话了?"最近在使用pycharm的时候遇到了一个问题,就是在pycharm中无法使用粘贴功能,后面经过一番折腾得到了解决,现在将我的解决…

03、SpringBoot 源码分析 - SpringApplication启动流程三

SpringBoot 源码分析 - SpringApplication启动流程三 初始化基本流程SpringApplication的setListeners设置监听器deduceMainApplicationClass对端主启动类rungetRunListeners获取SpringApplicationRunListener监听器EventPublishingRunListener的构造方法SimpleApplicationEven…

第十二篇:数据库系统导论 - 探索数据管理的基石

数据库系统导论 - 探索数据管理的基石 1 引言 数据的力量&#xff1a;揭秘数据库系统的核心 在信息时代&#xff0c;数据无处不在&#xff0c;它们成为了企业和社会运作的基础。我们如何储存、检索、更新和维护这些数据&#xff0c;决定了我们能否从这些数据中获得力量。数据…

C语言深入理解指针(4)--指针笔试题解析

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 C语言深入理解指针(4) 收录于专栏【C语言学习】 本专栏旨在分享学习C语言学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. size…

[嵌入式系统-75]:RT-Thread-快速上手:正点原子探索者 STM32F407示例

目录 正点原子探索者 STM32F407 上手指南 1. 简介 2. 准备工作 3. 运行第一个示例程序 3.1 编译下载 3.2 运行 继续学习 正点原子探索者 STM32F407 上手指南 1. 简介 探索者 STM32F407 是正点原子推出的一款基于 ARM Cortex-M4 内核的开发板&#xff0c;最高主频为 16…

启用dell服务器的iDRAC

插网线 观察到 dell服务器背板左侧有一个网口&#xff0c;标有iDRAC字样&#xff0c;使用网线将该网口和网段所在的交换机连接起来。 网络配置 重启计算机&#xff0c;依照屏幕显示按F2进入SystemSetup。选择iDRACsettings – Network&#xff0c;需要改动的如下&#xff08;现…

WPS表格:使用vlookup函数解决乱序数据对应问题

我们常常会遇到两个表格的内容相同&#xff0c;但是顺序不一致的情况。并且这种顺序无关于简单的排序&#xff0c;而是一种业务性很强的复杂排序规则。下面我举个例子&#xff0c;使用VLOOKUP复制数据。 假设太阳系行星举办了一次卖萌比赛&#xff0c;由太阳妈妈决定谁是最萌的…

Java | Leetcode Java题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; class Solution {public int largestRectangleArea(int[] heights) {int n heights.length;int[] left new int[n];int[] right new int[n];Arrays.fill(right, n);Deque<Integer> mono_stack new ArrayDeque<Integer>();f…

【git】通过JetBrains IDE对git的操作

应该适用于所有jetbrains产品。 一、拉取(pull)代码 上方工具栏-Git-克隆。然后填写git地址与本地存放地址。 二、搁置 修改代码后搁置代码&#xff08;不提交&#xff0c;但是也不撤销已修改的代码&#xff0c;把它暂存起来&#xff09;。 界面的左上角。1->2->3。…

[算法][差分数组][leetcode]1094. 拼车

地址&#xff1a; https://leetcode.cn/problems/car-pooling/description/ 解法一&#xff1a;暴力解法 class Solution {public boolean carPooling(int[][] trips, int capacity) {//特殊条件判断if(nulltrips||capacity<0){return false;}int [] d new int[1001];//暴…

Web自动化-日志收集

目标 1. 理解日志的相关概念 2. 掌握日志的基本用法 3. 掌握日志的高级用法 一、日志相关概念 目标 1. 了解日志的概念 2. 理解日志的作用 3. 掌握常见的日志级别 1. 日志 概念&#xff1a;日志就是用于记录系统运行时的信息&#xff0c;对一个事件的记录&#xff1b…

Qt---信号和槽

一、信号和槽机制 所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是没有目的的&#xff0c;类似广播。如果有对象对这个信号…

SpringBoot自定义初始化sql文件 支持多类型数据库

我在resources目录下有init.sql初始化sql语句 指定sql文件的地址 sql内容如下&#xff1a; /*角色表*/ INSERT INTO #{schema}ccc_base_role (id, create_time, create_user_id, is_delete, role_name, status, update_time, update_user_id) VALUES(b89e30d81acb88448d412…

2024数据分析管理、数字经济与教育国际学术会议(ICDAMDEE2024)

2024数据分析管理、数字经济与教育国际学术会议(ICDAMDEE2024) 会议简介 2024年数据分析管理、数字经济和教育国际学术会议&#xff08;ICDAMDEE 2024&#xff09;将在武汉举行。会议不仅展示了来自世界各地的研究专家围绕数据分析管理、数字经济和教育的最新科研成果&#xf…

C语言 | Leetcode C语言题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; int largestRectangleArea(int* heights, int heightsSize) {int st[heightsSize];int p[2];p[0]-1,p[1]heightsSize;int size0,result0;st[size]0;for(int i1;i<heightsSize;i){ while(size!0&&heights[i]<heights[st[size-1…

Elasticsearch入门基础和集群部署

Elasticsearch入门基础和集群部署 简介基础概念索引&#xff08;Index&#xff09;类型&#xff08;Type&#xff09;&#xff08;逐步弃用&#xff09;文档&#xff08;Document&#xff09;字段&#xff08;Field&#xff09;映射&#xff08;Mapping&#xff09;分片&#x…

从零自制docker-12-【overlayfs】

文章目录 overlayfsexec.Command("tar", "-xvf", busyboxTarURL, "-C", busyboxURL).CombinedOutput()exec.Command格式差异 挂载mount卸载unmount代码地址结果演示 overlayfs 就是联合文件系统&#xff0c;将多个文件联合在一起成为一个统一的…

HTTP1.1的优化措施

3.2 HTTP/1.1 如何优化&#xff1f; 可以从以下三个方面来优化http/1.1协议&#xff1a; 尽量避免发送 HTTP 请求&#xff1b; 在需要发送 HTTP 请求时&#xff0c;考虑如何减少请求次数&#xff1b; 减少服务器的 HTTP 响应的数据大小&#xff1b; 避免发送HTTP请求 对于…

【计算机网络】数据链路层的功能

数据链路层的基本功能&#xff1a; 封装成帧透明传输差错检测 数据链路层使用的信道主要有两种 点对点信道——PPP协议广播信道——CSMA/CD协议(有线局域网)、CSMA/CA协议(无线局域网) 数据链路层所处的地位 从图中可以看出&#xff0c;数据从主机H1送到主机H2需要在路径中…

苍穹外卖项目---------收获以及改进(9-12)

①Spring Task-------实现系统定时任务 概念&#xff1a; 应用场景&#xff1a; 使用步骤&#xff1a; 实现订单超时和前一天派送中的订单的自动任务处理&#xff1a; Component Slf4j public class Mytask {Autowiredprivate OrderServiceimpl orderServiceimpl;/*** 处理订…