Deprecated: stripos(): Passing null to parameter #1 ($haystack) of type string is deprecated in /opt/bitnami/wordpress/wp-includes/functions.wp-styles.php on line 90
SkyWalking全链路监控 - IT民工进阶记

SkyWalking全链路监控

1、Skywalking介绍

1.1 APM

APM (Application Performance Management )应用性能管理 ,通过各种探针采集并上报数据,收集关键指标,同时搭配数据展示以实现对应用程序性能管理和故障管理的系统化解决方案。

目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking,这里主要介绍 SkyWalking ,它是一款优秀的国产 APM 工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。

Zabbix、Premetheus、open-falcon等监控系统主要关注服务器硬件指标与系统服务运行状态 等,而APM系统则更重视程序内部执行过程指标和服务之间链路调用情况的监控 ,APM更有利于深入代码找到请求响应“慢”的根本问题,与Zabbix/Prometheus之类的监控是互补关系。

APM可以解决什么问题?
对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:

  • 如何串联整个调用链路,快速定位问题?如:应用与三方服务之间的数据流向,应用与应用之间的调用。
  • 如何缕清各个微服务之间的依赖关系?如:应用A会调用应用B,而应用B又会调用应用C。
  • 如何进行各个微服务接口的性能分折?
  • 如何跟踪整个业务流程的调用处理顺序?

使用APM工具,比如Skywalking就可以快速自动将上面几个问题搞清楚。

SkyWalking全链路监控

1.2 Skywalking介绍

Skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。Skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。它是一款优秀的 APM工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。

官网:https://skywalking.apache.org/
Github: https://github.com/apache/skywalking
官方文档:https://skywalking.apache.org/docs/

1)Skywalking监控维度

在许多不同的场景下, SkyWalking 为观察和监控分布式系统提供了解决方案。首先是像传统的方式那样, SkyWalking 为服务提供了自动打点的代理, 如 Java, C# , Node.js , Go , PHP 以及 Nginx LUA(包括 Python 和 C++ 调用的 SDK 捐献)。

对于多数语言,持续部署环境,云原生基础设施正变得更加强大,但也更加复杂。

Skywalking 的服务网格接收器可以让 Skywalking 接收来自服务网格框架(例如 Istio)的遥测数据,以帮助用户理解整个分布式系统。

总之, SkyWalking 为服务(service)、服务实例(service instance)以及 端点(endpoint) 提供了可观测能力。服务(Service)、实例(Instance) 以及 端点(Endpoint) 等概念在如今随处可见, 所以让我们先了解一下他们在 SkyWalking 中都表示什么意思:

  • 服务(Service):表示对请求提供相同行为的一组工作负载,在使用打点代理或 SDK 的时候,你可以定义服务的名字. SkyWalking 还可以使用在 Istio 等平台中定义的名称。
  • 服务实例(Service Instance):上述的一组工作负载中的每一个工作负载称为一个实例,就像 Kubernetes 中的 pods 一样,服务实例未必就是操作系统上的一个进程. 但当你在使用打点代理的时候, 一个服务实例实际就是操作系统上的一个真实进程.
  • 端点(Endpoint):对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。

使用 SkyWalking 时, 用户可以看到服务与端点之间的拓扑结构, 每个服务/服务实例/端点的性能指标, 还可以设置报警规则。

2)Skywalking架构

SkyWalking 逻辑上分为四部分: 探针、平台后端、存储、和用户界面(UI)。

SkyWalking全链路监控
  • 探针:基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式转化为 SkyWalking 适用的格式。
  • 平台后端:支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统 自定义聚合分析。
  • 存储:通过开放的插件化的接口存放 SkyWalking 数据。你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统。
  • UI:一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。

3)探针

探针表示集成到目标系统中的代理或SDK库,它负责收集遥测数据,包括链路追踪和性能指标。根据目标系统的技术栈,探针可能有差异巨大的方式来达到以上功能。但从根本上来说都是一样的,即收集并格式化数据,并发送到后端。

从高层次上来讲,SkyWalking 探针可分为以下三组:

  • 基于语言的原生代理,这种类型的代理运行在目标服务的用户空间中,就像用户代码的一部分一样。如SkyWalking Java 代理,使用 -javaagent 命令行参数在运行期间对代码进行操作。另一种代理是使用目标库提供的钩子函数或拦截机制。这些探针是基于特定的语言和库。
  • 服务网格探针,服务网格探针从服务网格的 Sidecar 和控制面板收集数据。在以前,代理只用作整个集群的入口,但是有了服务网格和 Sidecar 之后,我们可以基于此进行观测了。
  • 第三方打点类库, SkyWalking 也能够接收其他流行的打点库产生的数据格式。SkyWalking 通过分析数据,将数据格式化成自身的链路和度量数据格式。该功能最初只能接收 Zipkin 的 span 数据。

2、Skywalking部署

使用Helm部署Skywalking,存储使用ElasticSearch,而ElasticSearch需要独立安装,也用Helm安装。

  1. 版本信息
    Kubernetes 1.27.2
    Skywalking 9.5.0
    Elasticsearch 8.8.1
  2. 安装ElasticSearch
    1)首先确认是否已经加载bitnami仓库
$ helm repo list |grep bitnami

如果没有,还需额外增加此仓库

$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm repo update

2)下载ElasticSearch的chart包

$ helm pull bitnami/elasticsearch --untar --version 19.10.2

3)安装ElasticSearch
注意:要保证K8S所有节点内存大于4G,否则ElasticSearch跑不动
修改values.yaml
假设你已经配置好NFS

cd  elasticsearch
vi values.yaml
定义  storageClass: "nfs-client"
搜索  memory: 2048Mi  改为  memory: 1024Mi
搜索  heapSize: 1024m 改为  heapSize: 512m
搜索 replicaCount: 2 改为  replicaCount: 1  ##如果是生产环境不要改

安装

$ helm install skywalking-es .

查看pod

$ kubectl get po | grep sky

skywalking-es-elasticsearch-coordinating-0   1/1     Running   0              4m41s
skywalking-es-elasticsearch-coordinating-1   1/1     Running   0              4m41s
skywalking-es-elasticsearch-data-0           1/1     Running   0              4m41s
skywalking-es-elasticsearch-data-1           1/1     Running   0              4m41s
skywalking-es-elasticsearch-ingest-0         1/1     Running   0              4m41s
skywalking-es-elasticsearch-ingest-1         1/1     Running   0              4m41s
skywalking-es-elasticsearch-master-0         1/1     Running   0              4m41s
skywalking-es-elasticsearch-master-1         1/1     Running   0              4m41s

查看svc

$ kubectl get svc | grep sky

skywalking-es-elasticsearch                   ClusterIP      10.100.223.82    <none>        9200/TCP,9300/TCP                                                4m48s
skywalking-es-elasticsearch-coordinating-hl   ClusterIP      None             <none>        9200/TCP,9300/TCP                                                4m48s
skywalking-es-elasticsearch-data-hl           ClusterIP      None             <none>        9200/TCP,9300/TCP                                                4m48s
skywalking-es-elasticsearch-ingest-hl         ClusterIP      None             <none>        9200/TCP,9300/TCP                                                4m48s
skywalking-es-elasticsearch-master-hl         ClusterIP      None             <none>        9200/TCP,9300/TCP                                                4m48s

访问es

$ curl 10.100.223.82:9200
  1. 安装Skywalking
    1)添加repo
$ helm repo add skywalking https://apache.jfrog.io/artifactory/skywalking-helm
$ helm repo update

2)下载chart

$ helm pull skywalking/skywalking --version 4.3.0 --untar

3)修改values.yaml

$ cd skywalking
vi values.yaml  #有几个地方需要改

elasticsearch:
  config:
    host: skywalking-es-elasticsearch.default  ##查看svc可以查到,后面加default,表示default命名空间
    port:
      http: 9200
  enabled: false  ##把true改为false,意思是不自动安装es,因为我们前面已经手动安装过了

oap:
  image:
    tag: 9.5.0
  javaOpts: -Xmx512m -Xms512m  ##内存减少,如果是生产环境,可以适当调大
  replicas: 1  ##把2改为1,降低资源使用,生产环境不要改为1
  storageType: elasticsearch  ##使用es作为存储

ui:
  image:
    tag: 9.5.0

4)安装

$ helm install skywalking .

5)端口映射

$ nohup  kubectl port-forward svc/skywalking-ui --address 10.0.1.201 8080:80 &

说明:这是将ingress的80端口给映射到aminglinux01上的8080端口了

另外将oap 的11800也映射出来,方便外部agent连接

$ nohup  kubectl port-forward svc/skywalking-oap --address 10.0.1.201 11800:11800 &

6)访问ui
http://10.0.1.201:8080/

7)查看es数据

$ curl  10.15.231.214:9200/_cat/indices?v  ##这个ip是es的service cluster_ip

health status index                          uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   sw_continuous_profiling_policy x188uGr3QKG3F70j9roqtg   1   1          0            0       450b           225b
green  open   sw_zipkin_span-20231106        j-0v6soLT0iITGS7mXwtaQ   5   0          0            0        1kb            1kb
green  open   sw_metrics-all-20231106        nEPW_cuvTFaiiSMGJ0WIAA   1   1          0            0       450b           225b
green  open   sw_browser_error_log-20231106  dMFQYSqWQLKesr4dPf9V0Q   5   0          0            0        1kb            1kb
green  open   sw_records-all-20231106        IwC0a_YrROSSh7Rxc5o83Q   1   1          0            0       450b           225b
green  open   sw_log-20231106                8I57kksdTKy2tdVLQVnzdA   5   0          0            0        1kb            1kb
green  open   sw_ui_template                 qmIupdpqSRC7g5shU7xuzA   1   1         83           17    489.4kb        233.9kb
green  open   sw_segment-20231106            Cvv58pG9RIycUNeR_G-xcg   5   0          0            0        1kb            1kb

3、Skywalking配置和使用

  1. 配置一个java应用
    1)再单独拿一台机器或者使用其中一个k8s节点,安装docker
    具体步骤参考前面章节
    2)安装git
$ yum install -y git

3)克隆zrlog源码

$ git clone https://gitee.com/94fzb/zrlog-docker.git

4)编译

cd zrlog-docker
##下载Skywalking的java agent
which wget &> /dev/null || yum install -y wget
wget  https://archive.apache.org/dist/skywalking/java-agent/8.15.0/apache-skywalking-java-agent-8.15.0.tgz
tar zxf apache-skywalking-java-agent-8.15.0.tgz
##将刚刚解压的包,用zip压缩
which zip &>/dev/null || yum install -y zip
zip -r java-agent.zip skywalking-agent

##编辑zrlog包里的启动脚本run.sh,目的是为了增加skywalking的java agent
which unzip &>/dev/null || yum install -y unzip
wget http://dl.zrlog.com/release/zrlog.zip
mkdir zrlog
unzip zrlog.zip -d zrlog/
vi zrlog/bin/run.sh ##内容改为如下
java -javaagent:/opt/tomcat/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=app1 -Dskywalking.collector.backend_service=10.0.1.201:11800 -Xmx128m -Dfile.encoding=UTF-8 -jar zrlog-starter.jar
#说明:
#javaagent:指定skywalking-agent.jar文件路径
#skywalking.agent.service_name: 本应用在skywalking中的名称
#skywalking.collector.backend_service: skywalking 服务端地址,grpc上报地址,默认端口是 11800

##将zrlog重新打包
cd zrlog
zip -r zrlog.zip ./*
cd ..
/bin/mv zrlog/zrlog.zip ./

##修改Dockerfile
vi Dockerfile #改为如下
FROM openjdk:17
MAINTAINER “xiaochun” xchun90@163.com
CMD [“/bin/bash”]
ARG DUMMY
RUN mkdir -p /opt/tomcat
#RUN curl -o /opt/tomcat/ROOT.zip http://dl.zrlog.com/release/zrlog.zip?${DUMMY}
COPY zrlog.zip /opt/tomcat/ROOT.zip
RUN cd  /opt/tomcat && jar -xf ROOT.zip
ADD /java-agent.zip /opt/tomcat/java-agent.zip
RUN cd /opt/tomcat && jar -xf java-agent.zip
ADD /bin/run.sh /run.sh
RUN chmod a+x /run.sh
#RUN rm /opt/tomcat/ROOT.zip

CMD /run.sh
##到此结束

##编译成镜像
sh build.sh

5)安装zrlog应用
先将容器运行起来

$ sh install.sh
或
$ docker run -itd -p 28080:8080 -e DOCKER_MODE='true' zrlog /run.sh

访问
首先查看zrlog对外映射端口

$ docker ps

CONTAINER ID   IMAGE     COMMAND                CREATED          STATUS          PORTS                                         NAMES
17f5c8d68177   zrlog     "/bin/sh -c /run.sh"   38 seconds ago   Up 37 seconds   0.0.0.0:28080->8080/tcp, :::28080->8080/tcp   reverent_northcutt

通过下面地址访问
http://10.0.1.200:28080

此时还需要安装一个mysql,具体步骤略,可以直接使用helm在k8s部署一个即可。

helm search repo mysql
helm pull bitnami/mysql --untar
cd mysql/
vim values.yaml
helm install zrlog-mysql .
kubectl get po

$ kubectl get svc
NAME                                          TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                          AGE
zrlog-mysql                                   ClusterIP      10.97.142.210    <none>        3306/TCP                                                         84s

查看root密码
kubectl get secret --namespace default zrlog-mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d
rz7Yu7Hwaj

创建数据库
$ kubectl run zrlog-mysql-client --rm --tty -i --restart='Never' --image  docker.io/bitnami/mysql:8.0.35-debian-11-r0 --namespace default --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
If you don't see a command prompt, try pressing enter.
I have no name!@zrlog-mysql-client:/$ mysql -uroot -prz7Yu7Hwaj -h10.97.142.210 -e "create database zrlog"
SkyWalking全链路监控
SkyWalking全链路监控
SkyWalking全链路监控
SkyWalking全链路监控
SkyWalking全链路监控
  1. 访问Skywalking ui

http://10.0.1.200:8080

SkyWalking全链路监控
SkyWalking全链路监控
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
Kubernetes云原生

Kubernetes集群维护

2025-4-9 8:39:16

Kubernetes云原生

ConfigMap&Secret场景应用

2025-4-9 8:42:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
Index
本站支持IPv6访问