SkyWalking部署
一、基础介绍
1.1 概念
SkyWalking是一个国产的开源框架,2015年由吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃。
SkyWalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。
1.2 核心三部分
-
1、Agent(探针): Agent 运行在各个服务实例中,负责采集服务实例的 Trace 、Metrics 等数据,然后通过 gRPC方式上报给SkyWalking后端。
-
2、OAP: SkyWalking 的后端服务,其主要责任有两个。一个是负责接收 Agent 上报上来的 Trace、Metrics 等数据,交给 Analysis Core (涉及SkyWalkingOAP 中的多个模块)进行流式分析,最终将分析得到的结果写入持久化存储中。SkyWalking 可以使用ElasticSearch、H2、MySQL等作为其持久化存储,一般线上使用ElasticSearch 集群作为其后端存储。另一个是负责响应 SkyWalking UI 界面发送来的查询请求,将前面持久化的数据查询出来,组成正确的响应结果返回给 UI界面进行展示。
-
3、UI 界面: SkyWalking 前后端进行分离,该 UI 界面负责将用户的查询操作封装为 GraphQL 请求提交给 OAP后端触发后续的查询操作,待拿到查询结果之后会在前端负责展示。
1.3、系统监控的三个维度
- 1、Metrics 指标性统计
一个服务的正确率、成功率、流量、TPS、响应时间等 - 2、Tracing 分布式追踪
从请求开始到结束,服务节点之间的调用链路 - 3、 Logging 日志记录
程序在执行的过程中间发生了一些日志,会一帧一帧地跳出来给大家去记录这个东西,这是日志记录
1.4、特性
多种监控手段,语言探针和service mesh
多语言探针:Java、.NET Core、PHP、Node.JS、Go
支持多种数据存储方式: ElasticSearch、MySql、TiDB、H2、Sharding Sphere
强大的UI可视化界面
高性能、高可用:agent端探针性能消耗低,服务端支持多种集群部署方式
支持多种指标的监控告警
微核+插件式扩展的高扩展框架
1.5、同类型的开源APM
大众点评的cat、
韩国的pinpoint、
老牌APM zipkin,
以及skywalking
1.6、skywalking优势
国内开源项目,社区成熟,且可与作者直接沟通
支持语言更多:Java、.NET Core、PHP、Node.JS、Golang
支持java自动探针,代码无侵入,只要简单配置,就可以自动实现各种指标、调用链的埋点
众多存储选择:ElasticSearch、MySql、TiDB、H2、Sharding Sphere
扩展性:支持模块、插件的可拔插
支持java语言的几十种插件,例如:Tomcat、RabbitMq、Kafka,且易于二次开发
性能:比其他开源软件性能都强
1.8、官网地址
官网地址: http://skywalking.apache.org/
中文官网: http://skywalking.apache.org/zh/
下载地址: https://skywalking.apache.org/downloads/
github官网:https://github.com/apache/skywalking
二、SkyWalking部署
- 所需前提条件
- java环境
- SkyWalking采集数据所需存储的数据库(本文采用ES)
- 此处是单机部署,如果是集群部署则可以选择nacos或者zookeeper作为注册中心
- 参考:
2.1、下载安装包
- Agents为v8.10.0
wget https://archive.apache.org/dist/skywalking/8.9.1/apache-skywalking-apm-8.9.1.tar.gz
wget https://archive.apache.org/dist/skywalking/java-agent/8.10.0/apache-skywalking-java-agent-8.10.0.tgz
2.2、安装
tar -xf apache-skywalking-apm-8.9.1.tar.gz
cd apache-skywalking-apm-bin/
- 修改配置文件,参数说明
- selector 存储选择器。本文选在ES7
- nameSpace 命名空间。Elasticsearch实例中,所有索引的命名会使用此参数值作为前缀。
- clusterNodes 指定Elasticsearch实例的访问地址。
- user Elasticsearch实例的访问用户名,默认为elastic。
- password 对应用户的密码。elastic用户的密码在创建实例时指定,
vim config/application.yml
# core.restHost 改为自己的ip地址
core:
selector: ${SW_CORE:default}
default:
# Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
# Receiver: Receive agent data, Level 1 aggregate
# Aggregator: Level 2 aggregate
role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
restHost: ${SW_CORE_REST_HOST:192.168.1.160} # 这里
# 数据存储修改为 elasticsearch,配置 elasticsearch的地址,命名空间,和用户名密码(没有则不需填写)
# storage.selector storage.elasticsearch
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
namespace: ${SW_NAMESPACE:""}
# 集群地址,多个地址使用逗号分隔,比如 192.168.1.162:9200,192.168.1.162:9200
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.1.162:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:500}
socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
user: ${SW_ES_USER:"elastic"}
password: ${SW_ES_PASSWORD:"123456"}
# 修改webapp配置文件
# 配置ui服务webapp.yml文件的oap-service,写多个oap服务地址
vim webapp/webapp.yml
server:
port: 18080 # 改个默认端口
spring:
cloud:
gateway:
routes:
- id: oap-route
uri: lb://oap-service
predicates:
- Path=/graphql/**
discovery:
client:
simple:
instances:
oap-service:
- uri: http://192.168.1.160:12800 # 修改本机IP
# - uri: http://<oap-host-1>:<oap-port1>
# - uri: http://<oap-host-2>:<oap-port2>
2.3、启动
- 启动后页面访问UI 【http://192.168.1.160:18080/】
# 单独启动 backend(oapService)
./bin/oapService.sh
# 单独启动 UI(webappService)
./bin/webappService.sh
# 如果想要两个服务同时启动,可以不用上边两个脚本,用下边这个即可:
[root@masternode1 apache-skywalking-apm-bin]# ./bin/startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
# 启动后端(2个实例), 要配置注册中心就启动2个实例(部署去两台机器)
sh bin/oapService.sh
2.4、探针 agent
- 普通启动,在你部署了业务的节点启动
java -javaagent:skywalking-agent.jar \
-Dskywalking.agent.service_name=test \
-Dskywalking.collector.backend_service=127.0.0.1:11800 \
-jar skywalking-agent.jar
微服务
认证中心
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-authcenter
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800
网关
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-gateway
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800
农污
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-nongwu
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800
-javaagent: 指定skywalking中的agent中的skywalking-agent.jar的路径
-Dskywalking.agent.service_name: 指定在skywalking中的服务名称,一般是微服务的spring.application.name
-Dskywalking.collector.backend_service: 指定oap服务绑定的地址,并且oap服务默认的端口是11800
- k8s上搞
FROM centos:7.6.1810
LABEL maintainer [email protected]
ENV LANG "en_US.UTF-8"
ENV JDK_VERSION 1.8.0_191
ENV SW_VERSION 8.4.0
ADD jdk-8u191-linux-x64.tar.gz /usr/local
ADD agent /skywalking/agent
ENV JAVA_HOME /usr/local/jdk1.8.0_191
ENV CLASSPATH $JAVA_HOME/lib;$JAVA_HOME/jre/lib
ENV PATH $PATH:$JAVA_HOME/bin
RUN set -x && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# docker build -t hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
# docker push hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
FROM hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
LABEL maintainer [email protected]
RUN mkdir /app
WORKDIR /app
COPY target/*.jar /app/app.jar
EXPOSE 8080
CMD java -Djava.security.egd=file:/dev/./urandom -javaagent:/skywalking/agent/skywalking-agent.jar -jar ${JAVA_OPTS} /app/app.jar
- 注入环境变量
...
spec:
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: java
image: hub.ssgeek.com/java/xxx:tag
imagePullPolicy: IfNotPresent
env:
- name: JAVA_OPTS
value: 'JVM参数'
- name: SW_AGENT_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: SW_AGENT_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: SW_AGENT_CACHE_CLASS
value: 'true'
- name: SW_MYSQL_TRACE_SQL_PARAMETERS
value: 'true'
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: 'skywalking-oap.monitoring.svc:11800'
ports:
- containerPort: 8080
name: AppName
protocol: TCP
三、容器化部署
docker run --name skywalking-oap-server --restart always -p 11800:11800 -p 12800:12800 -d -e TZ=Asia/Shanghai -e SW_ES_USER= -e SW_ES_PASSWORD= -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=192.168.44.131:9200 -v /etc/localtime:/etc/localtime:ro apache/skywalking-oap-server:8.9.1
docker run -d --name skywalking-ui --restart always -p 8080:8080 --link skywalking-oap-server:skywalking-oap-server -e TZ=Asia/Shanghai -e SW_OAP_ADDRESS=http://skywalking-oap-server:12800 -v /etc/localtime:/etc/localtime:ro apache/skywalking-ui:8.9.1
四、k8s上部署
- 参考:
- 在k8s上部署agent端,有两种方式
- agent打包在基础镜像启动
- agent 通过边车模式启动,每个业务Pod启动一次
- 使用官方提供的基础镜像
skywalking-base
apiVersion: v1
kind: ConfigMap
metadata:
name: skywalking-cm
namespace: skywalking
data:
CLUSTER: 'nacos'
CLUSTER_NACOS_HOST_PORT: 'nacos-headless.default.svc.cluster.local:8848'
CORE_GRPC_PORT: '11800'
CORE_REST_PORT: '12800'
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: oap
namespace: skywalking
spec:
replicas: 1
selector:
matchLabels:
app: oap
release: skywalking
template:
metadata:
labels:
app: oap
release: skywalking
spec:
containers:
- envFrom:
- prefix: SW_
configMapRef:
name: skywalking-cm
name: oap
image: apache/skywalking-oap-server:8.8.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 11800
name: grpc
- containerPort: 12800
name: rest
volumeMounts:
- mountPath: /etc/localtime
name: volume-localtime
volumes:
- hostPath:
path: /etc/localtime
type: ''
name: volume-localtime
---
apiVersion: v1
kind: Service
metadata:
name: oap
namespace: skywalking
labels:
service: oap
spec:
ports:
- port: 12800
name: rest
- port: 11800
name: grpc
type: NodePort
selector:
app: oap
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui-deployment
namespace: skywalking
labels:
app: ui
spec:
replicas: 1
selector:
matchLabels:
app: ui
template:
metadata:
labels:
app: ui
spec:
containers:
- name: ui
image: apache/skywalking-ui:8.8.1
ports:
- containerPort: 8080
name: page
env:
- name: SW_OAP_ADDRESS
value: oap:12800
---
apiVersion: v1
kind: Service
metadata:
name: ui
namespace: skywalking
labels:
service: ui
spec:
ports:
- port: 8080
name: page
type: NodePort
selector:
app: ui
- skywalking agent 部署在k8s
# 下载 skywalking-8.5.0 for es6 版本的发布包,与部署的 skywalking 后端版本一致
wget https://www.apache.org/dyn/closer.cgi/skywalking/8.5.0/apache-skywalking-apm-8.5.0.tar.gz
# 将下载的发布包解压到当前目录
tar -zxvf apache-skywalking-apm-8.5.0.tar.gz
FROM busybox:latest
LABEL maintainer="xiniao"
COPY apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/
docker build -t skywalking-agent-sidecar:8.5.0 .
- sidecar 模式接入 skywalking
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-skywalking-demo
namespace: default
labels:
app: spring-boot-skywalking-demo
spec:
replicas: 1
selector:
matchLabels:
app: spring-boot-skywalking-demo
template:
metadata:
labels:
app: spring-boot-skywalking-demo
spec:
#构建初始化镜像(通过初始化镜像的方式集成SkyWalking Agent)
initContainers:
- image: registry.cn-shenzhen.aliyuncs.com/devan/skywalking-agent-sidecar:8.5.0
name: sw-agent-sidecar
imagePullPolicy: IfNotPresent
command: [ "sh" ]
args:
[
"-c",
"cp -R /usr/skywalking/agent/* /skywalking/agent",
]
volumeMounts:
- mountPath: /skywalking/agent
name: sw-agent
containers:
- name: spring-boot-skywalking-demo
image: ${ORIGIN_REPO}/spring-boot-skywalking-demo:${IMAGE_TAG}
imagePullPolicy: Always
env:
- name: TZ
value: Asia/Shanghai
- name: BUILD_TAG
value: ${BUILD_TAG}
- name: NAMESPACE
value: default
# 这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS, 可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成
- name: JAVA_TOOL_OPTIONS
value: -javaagent:/usr/skywalking/agent/skywalking-agent.jar
- name: SW_AGENT_NAME
value: spring-boot-skywalking-demo
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
# FQDN: servicename.namespacename.svc.cluster.local
value: skywalking-oap.default.svc:11800
ports:
- containerPort: 8080
resources:
requests:
cpu: 200m
memory: 500Mi
volumeMounts:
- mountPath: /usr/skywalking/agent
name: sw-agent
volumes:
- name: sw-agent
emptyDir: { }
---
apiVersion: v1
kind: Service
metadata:
name: spring-boot-skywalking-demo
namespace: default
labels:
app: spring-boot-skywalking-demo
spec:
ports:
- name: port
port: 80
protocol: TCP
targetPort: 8080
selector:
app: spring-boot-skywalking-demo
type: ClusterIP
spec.volumes
指的是 pod 中的卷,spec.containers.volumeMounts
是将指定的卷 mount 到容器指定的位置,相当于 docker 里面的 -v 宿主机目录:容器目录
,我们这里使用的是 emptyDir{}
,这个就相当于一个共享卷,是一个临时的目录,生命周期等同于Pod的生命周期。初始容器执行的命令是 sh -c cp -R /usr/skywalking/agent/* /skywalking/agent
, 意思是将 skywalking agent 复制到共享目录,主容器关联了共享目录,所以主容器就可以访问 skywalking agent。