链路监控的软件很多,比如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.gztar zxvf helm-v3.0.0-linux-amd64.tar.gzmv 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 podNAME READY STATUS RESTARTS AGEelasticsearch-master-0 1/1 Running 0 16helasticsearch-master-1 1/1 Running 0 16helasticsearch-master-2 1/1 Running 0 16hnfs-client-provisioner-f85644675-ftq2v 1/1 Running 7 80dskywalking-es-init-7968s 0/1 Completed 0 16hskywalking-es-init-x89pr 0/1 Completed 0 15hskywalking-oap-694fc79d55-2dmgr 1/1 Running 0 16hskywalking-oap-694fc79d55-bl5hk 1/1 Running 4 16hskywalking-ui-6bccffddbd-d2xhs 1/1 Running 0 16h
查看其所有的svc:
# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEelasticsearch-master ClusterIP 10.108.144.131 <none> 9200/TCP,9300/TCP 16helasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP 16hkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 83dskywalking-oap ClusterIP 10.109.142.213 <none> 12800/TCP,11800/TCP 16hskywalking-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.gztar xf apache-skywalking-apm-8.1.0.tar.gz
在项目的Docker镜像中加入agent
PS:如果每个应用都放一次就太麻烦,简单点的就是放到基础镜像中去。
如下:
FROM harbor-test.coolops.com/coolops/jdk:8u144_testRUN mkdir -p /usr/skywalking/agent/ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/
以sidecar的形式给应用添加agent
构建sidecar的Dockerfile
FROM busybox:latestENV LANG=C.UTF-8RUN set -eux && mkdir -p /usr/skywalking/agent/ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/WORKDIR /
然后在使用的时候如下使用:
apiVersion: apps/v1kind: Deploymentmetadata:labels:name: demo-swname: demo-swspec:replicas: 1selector:matchLabels:name: demo-swtemplate:metadata:labels:name: demo-swspec:initContainers:- image: innerpeacez/sw-agent-sidecar:latestname: sw-agent-sidecarimagePullPolicy: IfNotPresentcommand: ['sh']args: ['-c','mkdir -p /skywalking/agent && cp -r /usr/skywalking/agent/* /skywalking/agent']volumeMounts:- mountPath: /skywalking/agentname: sw-agentcontainers:- image: nginx:1.7.9name: nginxvolumeMounts:- mountPath: /usr/skywalking/agentname: sw-agentports:- containerPort: 80volumes:- name: sw-agentemptyDir: {}
上面这个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/v1kind: Deploymentmetadata:labels:app: <APP_NAME>name: <APP_NAME>namespace: <NEMESPACE>spec:minReadySeconds: 60progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: <APP_NAME>strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: <APP_NAME>spec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- preference: {}weight: 100requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: categoryoperator: Invalues:- othercontainers:- args:- -jar /opt/<JAR_NAME>.jar- -javaagent:/usr/skywalking/agent/skywalking-agent.jarcommand:- javaenv:- name: JAVA_HEAP_SIZEvalue: 2g- name: POD_NAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.name- name: SW_AGENT_COLLECTOR_BACKEND_SERVICESvalue: skywalking-oap.default:11800- name: SW_AGENT_NAMEvalue: <APP_NAME>image: <IMAGE>:<IMAGE_TAG>imagePullPolicy: AlwayslivenessProbe:failureThreshold: 3httpGet:path: healthCheckport: tcp-<PORT>scheme: HTTPinitialDelaySeconds: 60periodSeconds: 10successThreshold: 1timeoutSeconds: 1readinessProbe:failureThreshold: 3httpGet:path: healthCheckport: tcp-<PORT>scheme: HTTPinitialDelaySeconds: 55periodSeconds: 10successThreshold: 1timeoutSeconds: 1name: <APP_NAME>ports:- containerPort: <PORT>name: tcp-<PORT>protocol: TCPresources:limits:cpu: '4'memory: 3Girequests:cpu: 500mmemory: 2GiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstimagePullSecrets:- name: image_pullrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}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
