K8S学习笔记0626

分布式链路追踪系统

APM概述

早期监控工具功能比较单一,主要以监控CPU使用率、IO、内存资源、网速等网络基础设施为主(cacti、 nagios)

后来随着中间件技术的不断发展,APM也开始监控缓存、数据库、MQ等各种基础组件的性能(zabbix、Prometheus)

微服务兴起之后,系统功能被模块化,再加上k8s与容器化的兴起及应用数量的爆炸式增长,各模块和服务之的调用链路、响应时间、负载等越来越不好通过传统的工具进行监控和统计,此时APM系统诞生了(应运而生)。

APM的特点

收集应用程序性能

APM系统的核心作用是收集并展示应用程序接收请求和构建响应的性能,从而掌握整条链路的途径和性能,通过APM可以帮助运维人员快速统计出应用程序中访问量最多的URL、响应最慢的URL以及应用程序需要优化的URL等。

监控应用程序调用的中间件的性能(依赖调用):

程序也可能由于其依赖的中间件或者其它的API的性能有问题、例如被调用的数据库、缓存、Web服务器、第三方服务等响应慢而导致应用程序变慢,因此不仅要监控应用程序自身,还要监控其所有的外部依赖项。

在代码级别实现性能分析:

通过在代码级别分析应用程序中的class等,APM工具可以深入了解并分析导致应用程序性能较低的代码,另外目前安卓、IOS等手机APP都有Agent用于记录APP的启动时间、首屏加载时间、使用的网络类型、版本信息、崩溃记录等信息并提交到服务端进行统计分析和展示。

监控应用程序资源使用情况

监控资源使用情况尤其是CPU和内存的使用情况至关重要(如java程序的内存使用等),尤其是想根据资源利用率实现自动弹性伸缩应用程序。

统一展示监控数据和日志

应用程序的性能统计、访问和错误日志在统一的平台进行展示(devops运维平台),方便快速查询与故障定位。

APM项目

CAT:由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、 Python、Go等语言的客户端,监控数据会全量统计,国内很多公司在用,例如美团点评、携程、拼多多等,CAT需要开发人员手动在应用程序中埋点,对代码侵入性比较强。

Zipkin:—由Twitter公司开发并开源,基于Java语言实现,侵入性相对于CAT要低一点,需要对web.xml等相关配置文件进行修改,但依然对系统有一定的侵入性,Zipkin可以轻松与Spring Cloud进行集成,也是Spring Cloud推荐的APM系统。

jaeger是Uber推出的一款开源分布式追踪系统,主要使用go语言开发,对业务代码侵入性较少. 

Pinpoint:韩国团队开源的APM产品,运用了字节码增强技术,只需要在启动时添加启动参数即可实现APM功能,对代码无侵入,目前支持Java和 PHP语言,底层采用HBase来存储数据,探针收集的数据粒度非常细,但性能损耗较大,因其出现的时间较长,完成度也很高,文档也较为丰富,应用的公司较多. 

SkyWalking: Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目,2017年12月 SkyWalking成为Apache国内首个个人孵化项目,2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目,目前SkyWalking支持Java、.Net、Node.js、go.python等探针,数据存储支持MySQL、 ElasticSearch等,SkyWalking与Pinpoint相同,对业务代码无侵入,不过探针采集数据粒度相较于Pinpoint来说略粗,但性能表现优秀,目前SkyWalking增长势头强劲,社区活跃,中文文档齐全,没有语言障碍,支持多语言探针,这些都是SkyWalking的优势所在,还有就是SkyWalking支持很多框架,包括很多国产框架,例如,Dubbo、gRPC.SOFARPC等等,同时也有很多开发者正在不断向社区提供更多插件以支持更多组件无缝接入SkyWalking。

开源的:piwik等 

商业:百度统计/growingio等 

K8S学习笔记0626_第1张图片

由于以上APM系统较多,各个分布式链路追踪产品的API并不兼容,如果用户在各个产品之间进行切换,成本非常高,因此社区成立了OpenTracing组织,OpenTracing通过制定统一的API标准和数据结构模型,从而帮助开发人员和用户能够方便地使用或更换追踪系统。

 Skywalking

 Skywalking特点

实现从请求跟踪、指标收集和日志记录的完整信息记录。
多语言自动探针,支持Java、GO、Python.PHP、NodeJS、LUA、Rust等客户端。
内置服务网格可观察性,支持从lstio+Envoy Service Mesh收集和分析数据。
模块化架构,存储、集群管理、使用插件集合都可以进行自由选择。
支持告警。
优秀的可视化效果。

skywalking简介-组件

K8S学习笔记0626_第2张图片

上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。
下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。
右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
左部分 SkyWalking UI :负责提供控台,查看链路等等。

数据库支持es、MySQL、tidb、h2等,推荐es

OAP平台(ObservabilityAnalysis Platform,可观测性分析平台)或OAP Server,它是一个高度件化的轻量级分析程序,由兼容各种探针Receiver、流式分析内核和查询内核三部分构成。 11800为数据写入端口,12800为查询端口

探针:基于无侵入式的收集,并通过HTTP或者gRPC方式发送数据到OAP Server。

存储实现(Storage lmplementors),SkyWalking OAP Server支持多种存储实现并且提供了标准接口,可支持不同的存储后端。

UI模块(SkyWalking),通过标准的GraphQL(Facebook在2012年开源)协议进行统计数据查询和展示。前端服务,端口号8080

二进制部署skywalking 

部署es

使用es来存取数据

K8S学习笔记0626_第3张图片

部署skywalking 

提前安装jdk
wget https://archive.apache.org/dist/skywalking/


vim config/application.yml
storage:
  selector: ${SW_STORAGE:elasticsearch7}

  elasticsearch7:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.226.151:9200}


[root@lvs-master apache-skywalking-apm-bin-es7]# ./bin/startup.sh 
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!

K8S学习笔记0626_第4张图片

案例一 java命令运行halo博客实现链路追踪

准备工作

安装java环境
apt install openjdk-11-jre-headless

从1.4.3起,版本要求为11以上的版本。1.4.3以下需要1.8以上的版本。

下载skywalking java agent包和halo博客包

wget https://archive.apache.org/dist/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz

wget https://github.com/halo-dev/halo/releases/download/v1.5.3/halo-1.5.3.jar

修改skywalking java agent 配置

vim /data/skywalking-agent/config/agent.config 

# The agent namespace
agent.namespace=${SW_AGENT_NAMESPACE:halo}

# The service name in UI
agent.service_name=${SW_AGENT_NAME:halo}

# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.226.151:11800}

启动app

java -javaagent:/data/skywalking-agent/skywalking-agent.jar -jar /apps/halo-1.5.3.jar

验证

K8S学习笔记0626_第5张图片

K8S学习笔记0626_第6张图片

 skywalking仪表盘简介

global:显示服务的全局统计详情。

服务(Service)表示对请求提供相同行为的一系列或一组工作负载(服务名称),在使用Agent或SDK的时候,可以自定义服务的名字,如果不定义的话,SkyWalking将会使用你在平台(例如说Istio)上定义的名字。

服务实例(Instance)上述的一组工作负载中的每一个工作负载称为一个实例(一个服务运行的节点)一个服务实例可以是一个kubernetes中的pod或者是一个虚拟机甚至是物理机。

端点(Endpoint):对于特定服务所接收的请求路径,如HTTP的URI路径和gRPC服务的类+方法签名,如/api/v1/

K8S学习笔记0626_第7张图片

CPM-calls per minute:服务平均每分钟请求数

Slow Services (ms:慢响应服务,单位ms)

Un-Health services(Apdex):Apdex 性能指标,1为满分

Slow Endpoints(ms):全局维度的慢响应端点(APl),例如一个接口,显示的是全局慢响应Top N的数据,通过这个可以观测平台性能情况.

Global Response Latencypercentile inms):全局响应延迟百分位数统计,单位ms.

Global Heatmap:服务响应时间热力分布图,根据当前时间段内不同响应时间(0ms,100ms)的数量用不同颜色表示

 K8S学习笔记0626_第8张图片

Service Apdex(数字):当前服务的评分

Service Apdex(折线图):一段时间内Apdex评分

Service Avg Response Times (ms) :平均响应廷时,单位ms

Service Response Time Percentile:百分比响应延时,参考Global Response Latency (percentilein ms)

Successful Rate (数字):请求成功率

Successful Rate(折线图):一段时间的请求成功率

Servce Load (CPM / PPM)(数字)﹔每分钟请求数,

Servce Load (CPM / PPM)(折线图):不同时间的每分钟请求数

Service Throughput (Bytes):该指标只适用于TCP服务。当前服务的吞吐量.

Servce Instances Load (CPM/ PPM):每个服务实例的每分钟请求数

Show Service Instance:每个服务实例的最大延时

Service Instance Successful Rate:每个服务实例的请求成功率

K8S学习笔记0626_第9张图片

Service lInstance Load (CPM /PPM):当前实例的每分钟请求数。

Service Instance Throughput (Bytes) :该指标只适用于TCP服务,显示当前服务实例的吞吐量.

Service Instance Successful Rate (%) .当前实例的请求成功率.

Service Instance Latency (ms) :当前实例的响应延时。

Service Instance Successful Rate (%) .当前实例的请求成功率.

Service Instance Latency (ms) :当前实例的响应延时。

JVM CPU (ava Service) : jvm占用CPU的百分比。

JVM Memory (Java Service): JVM内存占用大小,单位m,包括堆内存,与堆外内存(直接内存).

JVM GC Count JVM垃圾回收次数,包含YGC和OGc

JVM GC Count JVM垃圾回收次数,包含YGC和OGc

JVM Thread Count (Java Service).

 K8S学习笔记0626_第10张图片

端点整体统计:
Endpoint Load in Current Service (CPM/ PPM):每个端点(API)每分钟请求数

Slow Endpoints in Current Service(ms):每个端点(API)的最慢响应请求时间,单位ms

Successful Rate in Current Service:(%)∶每个端点(API)的请求成功率

当前端点统计:

Endpoint Avg Response Time:当前端点每个时间段的请求行响应时间

Endpoint Load:当前端点每个时间段的请求数据

Endpoint Response Time Percentile(ms):当前端点每个时间段的响应时间占比

Endpoint Successful Rate (%):当前端点每个时间段的请求成功率

K8S学习笔记0626_第11张图片

Database Avg Response Time (ms) :当前数据库事件平均响应时间,单位ms

Database Access Successful Rate (%):当前数据库访问成功率

Database Traffic (CPM: Calls PerMinute) :当前数据库每分钟请求数

Database Access Latency Percentile(ms):数据库不同比例的响应时间,

Slow Statements (ms) :前N个慢查询,单位ms

All Database Loads (CPM: Calls PerMinute):所有数据库中请求量排序

Un-Health Databases:所有数据库不健康排名,请求咸功率排名,失败最多的请求在最上。

 K8S学习笔记0626_第12张图片

 K8S学习笔记0626_第13张图片

K8S学习笔记0626_第14张图片

jar(Java Archive,java归档文件):通常指包含 class、properties 文件,体积通常较小、运行简单,在dubbo、springCloud等微服务场合使用较多.

war(Web application Archive,Web应用程序归档): war 是 Sun提出的一种 Web应用程序格式, tomcat运行的webapp通常是个单体服务,服务中包含JSP页面、JAR库文件、HTML及XML等文件,一个war包可以理解为是一个web项目,里面是项目的所有资源,这种项目通常打包为NAME.war类型的压缩包,然后保存在 tomcat的 webapps目录下,tomcat成功启动后即可访问.

ear(Enterprise Archive file,企业级归档文件):除了包括JAR、WAR 以外,还包括EJB组件,EJB(Enterprise Java Beans)是基于分布式事务处理的企业级应用程序的组件, ear需要使用jboss,weblogic,websphere 等商业运行环境, tomcat不支持.

tomcat运行Jenkins并实现链路追踪

准备工作

部署jdk
下载tomcat jar包
wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.81/bin/apache-tomcat-8.5.81-deployer.tar.gz
下载jenkins war包
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/2.357/jenkins.war
mv jenkins.war /apps/apache-tomcat-8.5.81/webapps/

配置tomcat启动参数

K8S学习笔记0626_第15张图片

https://skywalking.apache.org/docs/skywalking-java/v8.8.0/en/setup/service-agent/java-agent/readme/
[root@lvs-master ~]# vim /apps/apache-tomcat-8.5.81/bin/catalina.sh 

CATALINA_OPTS="$CATALINA_OPTS -javaagent:/data/skywalking-agent/skywalking-agent.jar"; export CATALINA_OPTS

修改skywalking java agent配置

[root@lvs-master ~]# vim /data/skywalking-agent/config/agent.config 

# The agent namespace
agent.namespace=${SW_AGENT_NAMESPACE:jenkins}

# The service name in UI
agent.service_name=${SW_AGENT_NAME:jenkins}

启动tomcat并部署Jenkins

[root@lvs-master ~]# /apps/apache-tomcat-8.5.81/bin/catalina.sh run

K8S学习笔记0626_第16张图片

 验证

K8S学习笔记0626_第17张图片

K8S学习笔记0626_第18张图片

 虚拟机环境运行微服务并实现链路追踪

启动zookeeper

/apps/zookeeper/bin/zkServer.sh start

修改producer和consumer配置

dubbo.registry.address=zookeeper://192.168.226.144:2181

 添加skywalking Java agent启动参数

java -javaagent:/data/skywalking-agent/skywalking-agent.jar -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC -classpath /apps/dubbo-demo-provider-2.1.5/conf:/apps/dubbo-demo-provider-2.1.5/lib/cache-api-0.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/commons-codec-1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/commons-logging-1.1.1.jar:/apps/dubbo-demo-provider-2.1.5/lib/commons-pool-1.5.5.jar:/apps/dubbo-demo-provider-2.1.5/lib/dubbo-2.1.5.jar:/apps/dubbo-demo-provider-2.1.5/lib/dubbo-demo-2.1.5.jar:/apps/dubbo-demo-provider-2.1.5/lib/dubbo-demo-provider-2.1.5.jar:/apps/dubbo-demo-provider-2.1.5/lib/fastjson-1.1.8.jar:/apps/dubbo-demo-provider-2.1.5/lib/gmbal-api-only-3.0.0-b023.jar:/apps/dubbo-demo-provider-2.1.5/lib/grizzly-core-2.1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/grizzly-framework-2.1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/grizzly-portunif-2.1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/grizzly-rcm-2.1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/hessian-4.0.7.jar:/apps/dubbo-demo-provider-2.1.5/lib/hibernate-validator-4.2.0.Final.jar:/apps/dubbo-demo-provider-2.1.5/lib/httpclient-4.1.2.jar:/apps/dubbo-demo-provider-2.1.5/lib/httpcore-4.1.2.jar:/apps/dubbo-demo-provider-2.1.5/lib/javassist-3.15.0-GA.jar:/apps/dubbo-demo-provider-2.1.5/lib/jedis-2.0.0.jar:/apps/dubbo-demo-provider-2.1.5/lib/jetty-6.1.26.jar:/apps/dubbo-demo-provider-2.1.5/lib/jetty-util-6.1.26.jar:/apps/dubbo-demo-provider-2.1.5/lib/jline-0.9.94.jar:/apps/dubbo-demo-provider-2.1.5/lib/log4j-1.2.16.jar:/apps/dubbo-demo-provider-2.1.5/lib/management-api-3.0.0-b012.jar:/apps/dubbo-demo-provider-2.1.5/lib/mina-core-1.1.7.jar:/apps/dubbo-demo-provider-2.1.5/lib/netty-3.2.5.Final.jar:/apps/dubbo-demo-provider-2.1.5/lib/servlet-api-2.5-20081211.jar:/apps/dubbo-demo-provider-2.1.5/lib/slf4j-api-1.6.2.jar:/apps/dubbo-demo-provider-2.1.5/lib/spring-2.5.6.SEC03.jar:/apps/dubbo-demo-provider-2.1.5/lib/validation-api-1.0.0.GA.jar:/apps/dubbo-demo-provider-2.1.5/lib/zookeeper-3.3.3.jar: com.alibaba.dubbo.container.Main


 java -javaagent:/data/skywalking-agent/skywalking-agent.jar -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xmx1g -Xms1g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -classpath /apps/dubbo-demo-consumer-2.1.5/conf:/apps/dubbo-demo-consumer-2.1.5/lib/cache-api-0.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/commons-codec-1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/commons-logging-1.1.1.jar:/apps/dubbo-demo-consumer-2.1.5/lib/commons-pool-1.5.5.jar:/apps/dubbo-demo-consumer-2.1.5/lib/dubbo-2.1.5.jar:/apps/dubbo-demo-consumer-2.1.5/lib/dubbo-demo-2.1.5.jar:/apps/dubbo-demo-consumer-2.1.5/lib/dubbo-demo-consumer-2.1.5.jar:/apps/dubbo-demo-consumer-2.1.5/lib/fastjson-1.1.8.jar:/apps/dubbo-demo-consumer-2.1.5/lib/gmbal-api-only-3.0.0-b023.jar:/apps/dubbo-demo-consumer-2.1.5/lib/grizzly-core-2.1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/grizzly-framework-2.1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/grizzly-portunif-2.1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/grizzly-rcm-2.1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/hessian-4.0.7.jar:/apps/dubbo-demo-consumer-2.1.5/lib/hibernate-validator-4.2.0.Final.jar:/apps/dubbo-demo-consumer-2.1.5/lib/httpclient-4.1.2.jar:/apps/dubbo-demo-consumer-2.1.5/lib/httpcore-4.1.2.jar:/apps/dubbo-demo-consumer-2.1.5/lib/javassist-3.15.0-GA.jar:/apps/dubbo-demo-consumer-2.1.5/lib/jedis-2.0.0.jar:/apps/dubbo-demo-consumer-2.1.5/lib/jetty-6.1.26.jar:/apps/dubbo-demo-consumer-2.1.5/lib/jetty-util-6.1.26.jar:/apps/dubbo-demo-consumer-2.1.5/lib/jline-0.9.94.jar:/apps/dubbo-demo-consumer-2.1.5/lib/log4j-1.2.16.jar:/apps/dubbo-demo-consumer-2.1.5/lib/management-api-3.0.0-b012.jar:/apps/dubbo-demo-consumer-2.1.5/lib/mina-core-1.1.7.jar:/apps/dubbo-demo-consumer-2.1.5/lib/netty-3.2.5.Final.jar:/apps/dubbo-demo-consumer-2.1.5/lib/servlet-api-2.5-20081211.jar:/apps/dubbo-demo-consumer-2.1.5/lib/slf4j-api-1.6.2.jar:/apps/dubbo-demo-consumer-2.1.5/lib/spring-2.5.6.SEC03.jar:/apps/dubbo-demo-consumer-2.1.5/lib/validation-api-1.0.0.GA.jar:/apps/dubbo-demo-consumer-2.1.5/lib/zookeeper-3.3.3.jar: com.alibaba.dubbo.container.Main

验证

K8S学习笔记0626_第19张图片

 K8S学习笔记0626_第20张图片

 kubernetes环境运行微服务并实现链路追踪

 部署zookeeper

部署produceer和consumer

kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-provider
  name: myserver-provider-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-provider
  template:
    metadata:
      labels:
        app: myserver-provider
    spec:
      containers:
      - name: myserver-provider-container
        #image: harbor.magedu.local/magedu/dubbo-provider:v1 
        image: k8s-harbor.com/public/dubbo-provider-skywalking:v2
        #image: harbor.magedu.net/magedu/dubbo-provider:v1 
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        ports:
        - containerPort: 20880
          protocol: TCP
          name: http
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-consumer
  name: myserver-consumer-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-consumer
  template:
    metadata:
      labels:
        app: myserver-consumer
    spec:
      imagePullSecrets:
      containers:
      - name: myserver-consumer-container
        image: k8s-harbor.com/public/dubbo-consumer-skywalking:20220702v2
        #image: harbor.magedu.local/magedu/dubbo-consumer:v1 
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http

验证

K8S学习笔记0626_第21张图片

K8S学习笔记0626_第22张图片

 skywalking配置告警

[root@lvs-master ~]# vim /apps/apache-skywalking-apm-bin-es7/config/alarm-settings.yml

rules:
  # Rule unique name, must be ended with `_rule`.
  service_resp_time_rule:    唯一规则名称必须rule结尾
    metrics-name: service_resp_time 指标名称
    op: ">="    操作符= < > >= <=
    threshold: 1000    指标阈值ms
    period: 1    采集间隔周期 分钟
    count: 1    匹配次数触发告警
    silence-period: 2    #告警触发后静默时间 分钟
    message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.


dingtalkHooks:
  textTemplate:
    {
      "msgtype": "text",
      "text": {
        "content": "alert skywalking: \n %s."

      }
     }
  webhooks:
    - url: https://oapi.dingtalk.com/robot/send?access_token=39cf91648655a524929181fdabae7007c03a3bd1f1db92d4eaf0c85b973fd26b

K8S学习笔记0626_第23张图片

你可能感兴趣的:(学习)