1、概述
一、什么是 SkyWalking ?
分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。java
官网地址:http://skywalking.apache.org/nginx
二、SkyWalking 特性
多种监控手段,语言探针和 Service Mesh
多语言自动探针,Java,.NET Core和Node.JS
轻量高效,不须要大数据
模块化,UI、存储、集群管理多种机制可选
支持告警
优秀的可视化方案
三、总体结构
整个架构,分红上、下、左、右四部分:git
考虑到让描述更简单,咱们舍弃掉 Metric 指标相关,而着重在 Tracing 链路相关功能。github
上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而咱们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing数据,传递给服务器。
下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,而后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query)功能。spring
右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而咱们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队本身的生产docker
左部分 SkyWalking UI :负责提供控台,查看链路等等
简单概况原理为下图:
![上传中...]()apache
2、搭建 skywalking
一、环境准备
Mkubernetes 版本:1.18.5
Nginx Ingress 版本:2.2.8
Helm 版本:3.2.4
持久化存储驱动:NFS
二、使用 chart 部署
本文主要讲述的是如何使用 Helm Charts 将 SkyWalking 部署到 Kubernetes 集群中,相关文档能够参考skywalking-kubernetescentos
目前推荐的四种方式:api
使用 helm 3 提供的 helm serve 启动本地 helm repo
使用本地 chart 文件部署
使用 harbor 提供的 repo 功能
直接从官方 repo 进行部署(暂不知足)
❝
注意:目前 skywalking 的 chart 尚未提交到官方仓库,请先参照前三种方式进行部署bash
❞
2.一、 下载 chart 文件
能够直接使用本地文件部署 skywalking,按照上面的步骤将skywalking chart下载完成以后,直接使用如下命令进行部署:
git clone https://github.com/apache/sky...
cd skywalking-kubernetes/chart
helm repo add elastic https://helm.elastic.co
helm dep up skywalking
export SKYWALKING_RELEASE_NAME=skywalking # 定义本身的名称
export SKYWALKING_RELEASE_NAMESPACE=default # 定义本身的命名空间
2.二、定义已存在es参数文件
修改values-my-es.yaml:
oap:
image:
tag: 8.1.0-es7 # Set the right tag according to the existing Elasticsearch version
storageType: elasticsearch7
ui:
image:
tag: 8.1.0
elasticsearch:
enabled: false
config: # For users of an existing elasticsearch cluster,takes effect when elasticsearch.enabled
is false
host: elasticsearch-client port: http: 9200 user: "elastic" # [optional] password: "admin@123" # [optional]
2.三、helm 安装
helm install "${SKYWALKING_RELEASE_NAME}" skywalking -n "${SKYWALKING_RELEASE_NAMESPACE}" \
-f ./skywalking/values-my-es.yaml
安装完成后,咱们核实下安装状况:
$ kubectl get deployment -n skywalking
NAME READY UP-TO-DATE AVAILABLE AGE
my-skywalking-oap 2/2 2 2 9m
my-skywalking-ui 1/1 1 1 9m
3、使用 Skywalking Agent
Java 中使用 agent ,提供了如下三种方式供你选择
使用官方提供的基础镜像
将 agent 包构建到已经存在的基础镜像中
sidecar 模式挂载 agent(推荐)
一、使用官方提供的基础镜像
查看官方 docker hub 提供的基础镜像,只须要在你构建服务镜像是 From 这个镜像便可,直接集成到 Jenkins 中能够更加方便
二、将 agent 包构建到已经存在的基础镜像中
提供这种方式的缘由是:官方的镜像属于精简镜像,而且是 openjdk ,可能不少命令没有,须要本身二次安装,这里略过。
三、sidecar 模式挂载 agent
因为服务是部署在 Kubernetes 中,使用这种方式来使用 Skywalking Agent ,这种方式的好处在不须要修改原来的基础镜像,也不用从新构建新的服务镜像,而是以sidecar 模式,经过共享 volume 的方式将 agent 所需的相关文件挂载到已经存在的服务镜像中。
3.一、构建 skywalking agent image
本身构建,参考:https://hub.docker.com/r/prop...
经过如下 dockerfile 进行构建:
FROM alpine:3.8
LABEL maintainer="zmailto:uozewei@hotmail.com"
ENV SKYWALKING_VERSION=8.1.0
ADD http://mirrors.tuna.tsinghua....${SKYWALKING_VERSION}/apache-skywalking-apm-${SKYWALKING_VERSION}.tar.gz /
RUN tar -zxvf /apache-skywalking-apm-${SKYWALKING_VERSION}.tar.gz && \
mv apache-skywalking-apm-bin skywalking && \ mv /skywalking/agent/optional-plugins/apm-trace-ignore-plugin* /skywalking/agent/plugins/ && \ echo -e "\n# Ignore Path" >> /skywalking/agent/config/agent.config && \ echo "# see https://github.com/apache/skywalking/blob/v8.1.0/docs/en/setup/service-agent/java-agent/agent-optional-plugins/trace-ignore-plugin.md" >> /skywalking/agent/config/agent.config && \ echo 'trace.ignore_path=${SW_IGNORE_PATH:/health}' >> /skywalking/agent/config/agent.config
docker build -t 172.16.106.237/monitor/skywalking-agent:8.1.0 .
待 docker build 完毕后,push 到仓库便可。
3.二、使用 sidecar 挂载
示例配置文件以下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-skywalking
spec:
replicas: 1
selector:
matchLabels: app: demo-skywalking
strategy:
rollingUpdate: maxSurge: 1 maxUnavailable: 0 type: RollingUpdate
template:
metadata: labels: app: demo-skywalking spec: initContainers: - name: init-skywalking-agent image: 172.16.106.237/monitor/skywalking-agent:8.1.0 command: - 'sh' - '-c' - 'set -ex;mkdir -p /vmskywalking/agent;cp -r /skywalking/agent/* /vmskywalking/agent;' volumeMounts: - mountPath: /vmskywalking/agent name: skywalking-agent containers: - image: nginx:1.7.9 imagePullPolicy: Always name: nginx ports: - containerPort: 80 protocol: TCP volumeMounts: - mountPath: /opt/skywalking/agent name: skywalking-agent volumes: - name: skywalking-agent emptyDir: {}
以上是挂载 sidecar 的 deployment.yaml 文件,以 nginx 做为服务为例,主要是经过共享 volume 的方式挂载 agent,首先 initContainers 经过 skywalking-agent 卷挂载了 sw-agent-sidecar 中的 /vmskywalking/agent,而且将上面构建好的镜像中的 agent 目录 cp 到了 /vmskywalking/agent 目录,完成以后 nginx 启动时也挂载了 skywalking-agent 卷,并将其挂载到了容器的 /opt/skywalking/agent 目录,这样就完成了共享过程。
4、改造 Spring Cloud 应用
一、docker打包并推送到仓库
修改下 dockerfile 配置,集成 skywalking agent:
FROM insideo/centos7-java8-build
VOLUME /tmp
ADD mall-admin.jar app.jar
RUN bash -c 'touch /app.jar'
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
ENTRYPOINT ["java","-Dapp.id=svc-mall-admin","-javaagent:/opt/skywalking/agent/skywalking-agent.jar","-Dskywalking.agent.service_name=svc-mall-admin","-Dskywalking.collector.backend_service=my-skywalking-oap.skywalking.svc.cluster.local:11800","-jar","-Dspring.profiles.active=prod","-Djava.security.egd=file:/dev/./urandom","/app.jar"]
改好了,直接运行 maven package 就能将这个项目打包成镜像。
注意:
❝
k8s 建立 Service 时,它会建立相应的 DNS 条目。此条目的格式为 <service-name>.<namespace-name>.svc.cluster.local,这意味着若是容器只使用<service-name>,它将解析为本地服务到命名空间。若是要跨命名空间访问,则须要使用彻底限定的域名。
❞
二、编写 k8s的yaml版本的部署脚本
这里我以其中某服务举例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: svc-mall-admin
spec:
replicas: 1
selector:
matchLabels: app: svc-mall-admin
strategy:
rollingUpdate: maxSurge: 1 maxUnavailable: 0 type: RollingUpdate
template:
metadata: labels: app: svc-mall-admin spec: initContainers: - name: init-skywalking-agent image: 172.16.106.237/monitor/skywalking-agent:8.1.0 command: - 'sh' - '-c' - 'set -ex;mkdir -p /vmskywalking/agent;cp -r /skywalking/agent/* /vmskywalking/agent;' volumeMounts: - mountPath: /vmskywalking/agent name: skywalking-agent containers: - image: 172.16.106.237/mall_repo/mall-admin:1.0 imagePullPolicy: Always name: mall-admin ports: - containerPort: 8180 protocol: TCP volumeMounts: - mountPath: /opt/skywalking/agent name: skywalking-agent volumes: - name: skywalking-agent emptyDir: {}
apiVersion: v1
kind: Service
metadata:
name: svc-mall-admin
spec:
ports:
- name: http port: 8180 protocol: TCP targetPort: 8180
selector:
app: svc-mall-admin
而后就能够直接运行了,它就能够将的项目所有跑起来了。
5、测试验证
完事,能够去 SkyWalking UI 查看是否链路收集成功。
一、 测试应用 API
首先,请求下 Spring Cloud 应用提供的 API。由于,咱们要追踪下该链路。
二、 查看 SkyWalking UI 界面
在这里插入图片描述
这里,咱们会看到 SkyWalking 中很是重要的三个概念:
服务(Service) :表示对请求提供相同行为的一系列或一组工做负载。在使用 Agent 或 SDK 的时候,你能够定义服务的名字。若是不定义的话,SkyWalking 将会使用你在平台(例如说 Istio)上定义的名字。这里,咱们能够看到 Spring Cloud 应用的服务为 svc-mall-admin,就是咱们在 agent 环境变量 service_name 中所定义的。
服务实例(Service Instance) :上述的一组工做负载中的每个工做负载称为一个实例。就像 Kubernetes 中的 pods 同样, 服务实例未必就是操做系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操做系统上的一个真实进程。这里,咱们能够看到 Spring Cloud 应用的服务为 UUID@hostname,由 Agent 自动生成。
端点(Endpoint) :对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。
这里,咱们能够看到 Spring Cloud 应用的一个端点,为 API 接口 /mall-admin/admin/login。
更多 agent 参数介绍参考:https://github.com/apache/sky...
点击「拓扑图」菜单,进入查看拓扑图的界面:
点击「追踪」菜单,进入查看链路数据的界面:
6、小结本文详细介绍了如何使用 Kubernetes + Spring Cloud 集成 SkyWalking,顺便说下调用链监控在目前的微服务系统里面是必不可少的组件,分布式追踪、服务网格遥测分析、度量聚合和可视化仍是挺好用的,这里咱们选择了 Skywalking,具体缘由和细节的玩法就不在此详述了。