skywalking agent监控java服务

一、前言

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

skywalking agent监控java服务_第1张图片

 image路径:https://hub.docker.com/r/apache/skywalking-java-agent

 skywalking agent监控java服务_第2张图片

 现在通过容器的方式去调用skywalking agent监控java服务

编辑yaml配置

vi k8s-cs.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: k8s-cs
  name: k8s-cs
  namespace: k8s-cs
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: k8s-cs
  template:
    metadata:
      labels:
        app: k8s-cs
    spec:
      volumes:     #使用临时挂载的方式创建存放skywalking-agent文件的目录
      - name: skywalking-agent
        emptyDir: {}
      initContainers:    #使用初始化容器的方式去启动skywalking-agent容器,在该容器执行完成后,就会启动后面指定的容器
      - name: skywalking-agent-container
        image: 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-cs
        image: harbor.apex.com/jdk/k8s-cs:jenkins-k8s-cs-217-02d8c7a
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8761
        readinessProbe:
          httpGet:
            path: /
            port: 8761
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 2
        livenessProbe:
          tcpSocket:
            port: 8761
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 2
          failureThreshold: 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-agent
          mountPath: /skywalking   #将临时目录挂载到/skywalking目录下,容器没有该目录时会自动创建
      imagePullSecrets:
      - name: harbor-secret
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: k8s-cs
  namespace: k8s-cs
spec:
  selector:
    app: k8s-cs
  type: NodePort
  clusterIP:
  ports:
    - port: 8761
      targetPort: 8761
      nodePort: 30003
      protocol: 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 agent监控java服务_第3张图片

查看skywalking web看是否有监控到该java服务

 skywalking agent监控java服务_第4张图片

skywalking agent监控java服务_第5张图片

在额外的讲解一下,关于skywalking agent服务的问题,我们通过进入 skywalking agent的容器中了解

 可以看到容器中的/skywalking/anget目录下有多个skywalking agent服务的文件,其中skywalking-agent.jar是要在启动java服务时去调用的,但是不能单单只要该jar服务,不然会报错,需要把该目录下的所有文件都拷贝走,在启动该jar服务的时候,会调用到该目录下的其它文件

接下来再看一下java容器的变量

skywalking agent监控java服务_第6张图片

可以看到无论是dockerfile定义的环境变量,还是yaml定义的环境变量,都被应用到了java的容器中 ,再来看一下挂载的临时目录

skywalking agent监控java服务_第7张图片

可以看到也是正常挂载进来了

将java服务和skywalking agent服务分开来部署主要是为了,在有需求要升级skywalking agent的版本时,避免影响java服务的版本,如果两个服务部署到一起,在使用升级版本的skywalking agent服务后又要重新进行镜像的构造 

你可能感兴趣的:(skywalking,skywalking)