链路监控的软件很多,比如skywalking、pinpoint、zipkin等。其中
- Zipkin:由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。
- Pinpoint:一款对Java编写的大规模分布式系统的APM工具,由韩国人开源的分布式跟踪组件。
- Skywalking:国产的优秀APM组件,是一个对JAVA分布式应用程序集群的业务运行情况进行追踪、告警和分析的系统。
这里主要来介绍Skywalking及其安装。
SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案.支持Java, .Net Core, PHP, NodeJS, Golang, LUA语言探针,支持Envoy + Istio构建的Service Mesh。
安装服务端
安装helm
使用helm3,安装如下:
wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz
tar zxvf helm-v3.0.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
说明:helm3没有tiller这个服务端了,直接用kubeconfig进行验证通信,所以建议部署在master节点
安装skywalking
skywalking的安装比较简单,具体可以参照其官方文档。
这里采用es做后端存储。
(1)、下载项目
git clone https://github.com/apache/skywalking-kubernetes.git
(2)、默认安装使用的是es7做后端存储,安装步骤如下:
$ cd chart
$ helm repo add elastic https://helm.elastic.co
$ helm dep up skywalking
$ helm install <release_name> skywalking -n <namespace>
如果要使用es6做后端存储,则按照下面的步骤:
$ helm dep up skywalking
$ helm install <release_name> skywalking -n <namespace> --values ./skywalking/values-es6.yaml
如果本身有ES,如果是ES7,则用下面的命令安装:
$ cd chart
$ helm repo add elastic https://helm.elastic.co
$ helm dep up skywalking
$ helm install skywalking skywalking -n skywalking \
--set elasticsearch.enabled=false \
--set elasticsearch.config.host=elasticsearch-client.elastic.svc.default.local \
--set elasticsearch.config.port.http=9200 \
--set elasticsearch.config.user=elastic \
--set elasticsearch.config.password=elastic@123456
如果是es6,则用下面的命令:
$ helm dep up skywalking
$ helm install <release_name> skywalking -n <namespace> \
--values ./skywalking/values-es6.yaml \
--set elasticsearch.enabled=false \
--set elasticsearch.config.host=<es_host> \
--set elasticsearch.config.port.http=<es_port> \
--set elasticsearch.config.user=<es_user> \
--set elasticsearch.config.password=<es_password>
然后观察所以pod是否处于running状态:
# kubectl get pod
NAME READY STATUS RESTARTS AGE
elasticsearch-master-0 1/1 Running 0 16h
elasticsearch-master-1 1/1 Running 0 16h
elasticsearch-master-2 1/1 Running 0 16h
nfs-client-provisioner-f85644675-ftq2v 1/1 Running 7 80d
skywalking-es-init-7968s 0/1 Completed 0 16h
skywalking-es-init-x89pr 0/1 Completed 0 15h
skywalking-oap-694fc79d55-2dmgr 1/1 Running 0 16h
skywalking-oap-694fc79d55-bl5hk 1/1 Running 4 16h
skywalking-ui-6bccffddbd-d2xhs 1/1 Running 0 16h
查看其所有的svc:
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elasticsearch-master ClusterIP 10.108.144.131 <none> 9200/TCP,9300/TCP 16h
elasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP 16h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 83d
skywalking-oap ClusterIP 10.109.142.213 <none> 12800/TCP,11800/TCP 16h
skywalking-ui NodePort 10.109.0.122 <none> 80:30969/TCP 16h
将skywalking-ui的svc type改为nodeport,然后通过浏览器访问出现如下界面。
到此服务端安装完成了,注意默认安装es并没有持久化处理,如果es重建会导致数据丢失。
安装客户端
这里以接入java项目为例。
由于我们应用是部署在kubernetes中的,所以有两种方式将agent的加入到我们的应用中:
- 在项目的Docker镜像中加入agent
- 以sidecar的形式给应用添加agent
下载对应版本的软件包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/8.1.0/apache-skywalking-apm-8.1.0.tar.gz
tar xf apache-skywalking-apm-8.1.0.tar.gz
在项目的Docker镜像中加入agent
PS:如果每个应用都放一次就太麻烦,简单点的就是放到基础镜像中去。
如下:
FROM harbor-test.coolops.com/coolops/jdk:8u144_test
RUN mkdir -p /usr/skywalking/agent/
ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/
以sidecar的形式给应用添加agent
构建sidecar的Dockerfile
FROM busybox:latest
ENV LANG=C.UTF-8
RUN set -eux && mkdir -p /usr/skywalking/agent/
ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/
WORKDIR /
然后在使用的时候如下使用:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
name: demo-sw
name: demo-sw
spec:
replicas: 1
selector:
matchLabels:
name: demo-sw
template:
metadata:
labels:
name: demo-sw
spec:
initContainers:
- image: innerpeacez/sw-agent-sidecar:latest
name: sw-agent-sidecar
imagePullPolicy: IfNotPresent
command: ['sh']
args: ['-c','mkdir -p /skywalking/agent && cp -r /usr/skywalking/agent/* /skywalking/agent']
volumeMounts:
- mountPath: /skywalking/agent
name: sw-agent
containers:
- image: nginx:1.7.9
name: nginx
volumeMounts:
- mountPath: /usr/skywalking/agent
name: sw-agent
ports:
- containerPort: 80
volumes:
- name: sw-agent
emptyDir: {}
上面这个YAML文件只是作为参考例子,思路是如此而已。
在真正的java应用中,我们应该如何启用agent呢?
其实很简单。
(1)、如果是部署在tomcat中,修改catalina.sh
即可,如下:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/skywalking-agent/skywalking-agent.jar"; export CATALINA_OPTS
(2)、如果是jar文件启动,则如下:
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=${SW_AGENT_NAME} -jar yourApp.jar
注意这里有两个环境变量:
- SW_AGENT_COLLECTOR_BACKEND_SERVICES:后端服务的地址
- SW_AGENT_NAME:在UI上显示的应用名
所以完整的demo如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: <APP_NAME>
name: <APP_NAME>
namespace: <NEMESPACE>
spec:
minReadySeconds: 60
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: <APP_NAME>
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: <APP_NAME>
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference: {}
weight: 100
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: category
operator: In
values:
- other
containers:
- args:
- -jar /opt/<JAR_NAME>.jar
- -javaagent:/usr/skywalking/agent/skywalking-agent.jar
command:
- java
env:
- name: JAVA_HEAP_SIZE
value: 2g
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: skywalking-oap.default:11800
- name: SW_AGENT_NAME
value: <APP_NAME>
image: <IMAGE>:<IMAGE_TAG>
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
httpGet:
path: healthCheck
port: tcp-<PORT>
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: healthCheck
port: tcp-<PORT>
scheme: HTTP
initialDelaySeconds: 55
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
name: <APP_NAME>
ports:
- containerPort: <PORT>
name: tcp-<PORT>
protocol: TCP
resources:
limits:
cpu: '4'
memory: 3Gi
requests:
cpu: 500m
memory: 2Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: image_pull
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 120
参考文档:
1、https://github.com/apache/skywalking-kubernetes
2、http://skywalking.apache.org/zh/blog/2019-08-30-how-to-use-Skywalking-Agent.html
3、https://github.com/apache/skywalking/blob/5.x/docs/cn/Deploy-skywalking-agent-CN.md