前言
Skywalking Java Agent: https://github.com/apache/skywalking/blob/master/docs/en/setup/service-agent/java-agent/README.md
Skywalking Java Agent可以通过在项目代码中引入以及使用Java Agent机制挂载。针对于在Kubernetes中挂载Skywalking Java Agent,所采用的方式为使用Java Agent机制,对原系统侵入性较小,挂载方便。
相关镜像:
InitContainer
在Kubernetes中可用的Skywalking的InitContainer,用于启动应用时从外部挂载Skywalking的Agent。 目前仅支持Java Agent,且默认启用了全部的optional-plugins。
容器启动时会将/usr/local/skywalking目录下的Java Agent文件拷贝至/opt/skywalking目录之中。
DockerHub地址:https://hub.docker.com/r/lipangeng/skywalking-initcontainer
目前可用镜像如下,对应相应的Skywalking版本:
- lipangeng/skywalking-initcontainer:7.0.0
- lipangeng/skywalking-initcontainer:8.0.1
- lipangeng/skywalking-initcontainer:8.1.0
挂载方式
Local Storage Mount
本地磁盘挂载方式,每个机器上面都存在该路径。
该路径可以为NFS/SMB等网络映射,亦可以使用Ansible/Kubernetes Job/DeamonSet等方式管理。
基本方式为创建hostPath的Volume,并进行挂载。
示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:name: consumer-nfslabels:app: consumer-nfs
spec:selector:matchLabels:app: consumer-nfstemplate:metadata:name: consumer-nfslabels:app: consumer-nfsspec:containers:- name: consumer-nfsimage: dhubr.msorg.cn/temp/consumerimagePullPolicy: Alwaysenv:- name: SPRING_APPLICATION_NAMEvalue: consumer-nfs- name: JAVA_TOOL_OPTIONSvalue: -javaagent:/opt/apm/skywalking-agent.jar- name: SW_AGENT_NAMEvalue: consumer-nfs- name: SW_AGENT_COLLECTOR_BACKEND_SERVICESvalue: apm-aop.paas:11800- name: SW_LOGGING_DIRvalue: /tmpvolumeMounts:- name: apmmountPath: /opt/apmreadOnly: truevolumes:- name: apmhostPath:path: /data/nfsdata/apm
Docker Base Image & Docker Build System
此方式基本核心思想为将Java Agent引入镜像中。即在Java的基础镜像或在应用程序的应用镜像中。
使用Docker Build System,将Java Agent加载至应用镜像中。可以使用多阶段构建显著减少体积。
示例如下:
FROM dockerhub.azk8s.cn/library/busybox
MAINTAINER 李盼庚 <lipg@outlook.com>ENV SKYWALKING_VERSION 7.0.0
ENV APM_HOME=/opt/apm \APM_TARGET_HOME=/apmRUN set -ex; \\mkdir -pv ${APM_HOME} ;\mkdir -pv /tmp/skywalking ;\\wget -O skywalking.tar.gz http://mirror.bit.edu.cn/apache/skywalking/6.6.0/apache-skywalking-apm-${SKYWALKING_VERSION}.tar.gz; \tar -zxvf skywalking.tar.gz -C /tmp/skywalking --strip-components 1;\rm -rf skywalking.tar.gz ;\\cp -rv /tmp/skywalking/agent/* ${APM_HOME} ;\rm -rf /tmp/skywalking ;\\cp -rv /opt/apm/optional-plugins/* /opt/apm/plugins/# 多阶段构建
FROM dhubr.msorg.cn/library/openjdk:11
MAINTAINER 李盼庚 <lipg@outlook.com># 添加APM文件
COPY --from=0 /opt/apm /opt/apm# 添加执行文件
ADD target/*.jar /app/# 工作目录
WORKDIR /app/# 执行程序
CMD java -jar *.jar
Kubernetes PV/PVC
Kubernetes 的PV/PVC机制可以支持多种网络存储,乃至于之前所提到的本地存储
如:NFS\CEPH\Local等
https://kubernetes.io/zh/docs/concepts/storage/volumes
通过Kubernetes的PV/PVC机制进行挂载,灵活性更高,但配置相对复杂
示例如下:
apiVersion: v1
kind: PersistentVolume
metadata:name: consumer-pvlabels:name: consumer-pvkind: host
spec:hostPath:path: /opt/volumes/consumercapacity:storage: 100GivolumeMode: FilesystemaccessModes:- ReadWriteOnce- ReadWriteMany---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: consumer-pvclabels:name: consumer-pvckind: host
spec:selector:matchLabels:name: consumer-pvkind: hostresources:requests:storage: 100GiaccessModes:- ReadWriteMany---
apiVersion: apps/v1
kind: Deployment
metadata:name: consumer-pvclabels:app: consumer-pvc
spec:selector:matchLabels:app: consumer-pvctemplate:metadata:name: consumer-pvclabels:app: consumer-pvcspec:imagePullSecrets:- name: ilemoncontainers:- name: consumer-pvcimage: dhubr.msorg.cn/temp/consumerimagePullPolicy: Alwaysenv:- name: SPRING_APPLICATION_NAMEvalue: consumer-pvc- name: JAVA_TOOL_OPTIONSvalue: -javaagent:/opt/apm/skywalking-agent.jar- name: SW_AGENT_NAMEvalue: consumer-pvc- name: SW_AGENT_COLLECTOR_BACKEND_SERVICESvalue: apm-aop.paas:11800- name: SW_LOGGING_DIRvalue: /tmpvolumeMounts:- name: apmmountPath: /opt/apmreadOnly: truevolumes:- name: apmpersistentVolumeClaim:claimName: consumer-pvc
Kubernetes InitContainer
使用Kubernetes InitContainer功能,在真正的业务容器启动时加载Skywalking Java Agent。通常使用临时目录共享Skywalking Java Agent给应用运行容器。
InitContainer加载Java Agent时,可以使用多种方式,如:从网络下载、从Docker Image中复制、从Git中获取等手段。
示例:
Agent Image:
FROM dhub.msorg.cn/library/busybox
MAINTAINER 李盼庚 <lipg@outlook.com>ENV SKYWALKING_VERSION 7.0.0
ENV SKYWALKING_HOME=/usr/local/skywalking \AGENT_HOME=/opt/skywalkingRUN set -ex; \\mkdir -pv ${SKYWALKING_HOME} \\; wget -O skywalking.tar.gz http://mirror.bit.edu.cn/apache/skywalking/${SKYWALKING_VERSION}/apache-skywalking-apm-${SKYWALKING_VERSION}.tar.gz \; tar -tf skywalking.tar.gz \; tar -zxvf skywalking.tar.gz --strip-components 2 -C ${SKYWALKING_HOME} apache-skywalking-apm-bin/agent/ \\; cp -av ${SKYWALKING_HOME}/optional-plugins/* ${SKYWALKING_HOME}/plugins/ \\; rm -rf skywalking.tar.gz \\; ls -la ${SKYWALKING_HOME} CMD cp -av ${SKYWALKING_HOME}/* ${AGENT_HOME}/
Agent Mount:
apiVersion: apps/v1
kind: Deployment
metadata:name: demo
spec:selector:matchLabels:name: demotemplate:metadata:name: demolabels:name: demospec:initContainers:- name: skywalking-initimage: lipangeng/skywalking-initcontainer:7.0.0imagePullPolicy: AlwaysvolumeMounts:- mountPath: /opt/skywalkingname: skywalkingcontainers:- name: demoimage: tomcatimagePullPolicy: Alwaysresources:limits:memory: 1Giports:- containerPort: 8080name: httpprotocol: TCPenv:- name: TZvalue: Asia/Shanghai- name: JAVA_TOOL_OPTIONSvalue: -javaagent:/opt/skywalking/skywalking-agent.jar- name: SW_AGENT_NAMEvalue: demo- name: SW_AGENT_COLLECTOR_BACKEND_SERVICESvalue: skywalking-aop.skywalking:11800volumeMounts:- mountPath: /opt/skywalkingname: skywalkingvolumes:- name: skywalkingemptyDir: {}
Kubernets Admission Controller
Kubernetes的准入控制器模式,可通过Label、namespace、env等属性启动自动注入,无需显式配置,易于管理。
由于内容较多,且配置多样化,详情参考Skywalking Injection
进行了解。
加载方式
Command
通过修改启动命令的方式,显式的增加-javaagent:/opt/skywalking/skywalking-agent.jar
参数。
JAVA_TOOL_OPTIONS
JAVA_TOOL_OPTIONS是被被JNI_CreateJavaVM调用的,因此可以通过环境变量注入一些参数,但有些参数是不能被设置的如选择虚拟机运行模式-client或-server
通过增加JAVA_TOOL_OPTIONS环境变量,来启用Skywalking的Java Agent。
例子:JAVA_TOOL_OPTIONS="``-javaagent:/opt/skywalking/skywalking-agent.jar``"
其它环境变量
除了通用的JAVA_TOOL_OPTIONS环境变量之外,不同的启动脚本,不同的容器镜像可能存在不同的配置参数。如:tomcat的镜像还将支持CATALINA_OPTS
、JAVA_OPTS
等。
Kubernets Admission Controller
Kubernetes的准入控制器模式,可通过Label、namespace、env等属性启动自动注入,无需显式配置,易于管理。其启动方式也是
由于内容较多,且配置多样化,详情参考Skywalking Injection
进行了解。