一、前言
skywalking agent可以监控的服务类型有多种,python、go、java、nodejs服务等都可以监控,现在通过java服务来演示skywalking agent的使用,并且是使用容器的方式实现
二、部署skywalking agent监控
需要注意,skywalking agent服务也是需要使用java服务的,所以需要使用跟java服务对应的版本,我这边java服务使用的是jdk11版本,所以skywalking agent也需要用支持java11的版本,在skywalking官网的下载页面中有说到images的下载
官网路径:Downloads | Apache SkyWalking
image路径:https://hub.docker.com/r/apache/skywalking-java-agent
现在通过容器的方式去调用skywalking agent监控java服务
编辑yaml配置
vi k8s-cs.yaml
apiVersion: apps/v1
kind: Deployment
metadata: labels:app: k8s-csname: k8s-csnamespace: k8s-cs
spec:replicas: 5progressDeadlineSeconds: 600minReadySeconds: 10strategy:rollingUpdate:maxSurge: 1maxUnavailable: 0type: RollingUpdateselector:matchLabels:app: k8s-cstemplate:metadata:labels:app: k8s-csspec:volumes: #使用临时挂载的方式创建存放skywalking-agent文件的目录- name: skywalking-agentemptyDir: {}initContainers: #使用初始化容器的方式去启动skywalking-agent容器,在该容器执行完成后,就会启动后面指定的容器- name: skywalking-agent-containerimage: apache/skywalking-java-agent:8.7.0-alpine #使用skywalkinag-agent镜像volumeMounts:- name: skywalking-agent #挂载临时目录mountPath: /agent #将临时目录挂载到agent目录command: ["/bin/sh"] #执行命令args: ["-c","cp -R /skywalking/agent /agent/"] #将容器中/skywalking/agent目录下的所有文件都拷贝到挂载的临时目录中,相当于skywalking-agent服务的所有文件都要拷贝走containers: #配置java服务容器- name: k8s-csimage: harbor.apex.com/jdk/k8s-cs:jenkins-k8s-cs-217-02d8c7aimagePullPolicy: IfNotPresentports:- containerPort: 8761readinessProbe:httpGet:path: /port: 8761scheme: HTTPinitialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 2successThreshold: 1failureThreshold: 2livenessProbe:tcpSocket:port: 8761initialDelaySeconds: 30periodSeconds: 10successThreshold: 1timeoutSeconds: 2failureThreshold: 2 env: #配置环境变量,以下变量在启动java服务的时候都需要使用- name: JAVA_TOOL_OPTIONS #定义使用skywalking-agent服务的变量value: "-javaagent:/skywalking/agent/skywalking-agent.jar"- name: SW_AGENT_NAME #定义skywalking-agent服务的名称value: "-DSW_AGENT_NAME=k8s-cs"- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES #指定skywalking opa服务的地址value: "-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=10.1.60.115:11800"volumeMounts: #挂载临时目录,因为上面使用此临时目录已经拷贝了skywalking-agent服务的文件,所以在java服务的容器中挂载然后使用就可以了- name: skywalking-agentmountPath: /skywalking #将临时目录挂载到/skywalking目录下,容器没有该目录时会自动创建imagePullSecrets:- name: harbor-secretrestartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:name: k8s-csnamespace: k8s-cs
spec:selector:app: k8s-cstype: NodePortclusterIP:ports:- port: 8761targetPort: 8761nodePort: 30003protocol: TCP
以上就是容器化使用skywalking agent的方式,接下来再看一下dockerfile是如何在启动java服务时调用skywalking agent服务的,一般来说使用skywalking agent服务只需要用到上面yaml文件中的三个变量即可,即指定skywalking agent服务的jar包,定义服务的名称,指定skywalking oap服务的地址
cat dockerfile
FROM harbor.apex.com/base_image/jdk11_image:latest
ENV JVM_OPTS="-Xms512m -Xms512m"
ENV HEAP_DUMP_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/java_jar/log"
RUN mkdir -p /opt/java_jar/log
WORKDIR /opt/java_jar/
COPY ./target/*.jar ./
EXPOSE 8761
#在启动java服务时应用为skywalking agent定义的三个变量,另外两个是定义java服务的
ENTRYPOINT java ${JAVA_TOOL_OPTIONS} ${SW_AGENT_NAME} ${SW_AGENT_COLLECTOR_BACKEND_SERVICES} ${JVM_OPTS} ${HEAP_DUMP_OPTS} -jar *.jar
执行该yaml生成容器
查看skywalking web看是否有监控到该java服务
在额外的讲解一下,关于skywalking agent服务的问题,我们通过进入 skywalking agent的容器中了解
可以看到容器中的/skywalking/anget目录下有多个skywalking agent服务的文件,其中skywalking-agent.jar是要在启动java服务时去调用的,但是不能单单只要该jar服务,不然会报错,需要把该目录下的所有文件都拷贝走,在启动该jar服务的时候,会调用到该目录下的其它文件
接下来再看一下java容器的变量
可以看到无论是dockerfile定义的环境变量,还是yaml定义的环境变量,都被应用到了java的容器中 ,再来看一下挂载的临时目录
可以看到也是正常挂载进来了
将java服务和skywalking agent服务分开来部署主要是为了,在有需求要升级skywalking agent的版本时,避免影响java服务的版本,如果两个服务部署到一起,在使用升级版本的skywalking agent服务后又要重新进行镜像的构造