一、前言
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-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 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服务后又要重新进行镜像的构造