前言
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.0lipangeng/skywalking-initcontainer:8.0.1lipangeng/skywalking-initcontainer:8.1.0
挂载方式
Local Storage Mount
本地磁盘挂载方式,每个机器上面都存在该路径。
该路径可以为NFS/SMB等网络映射,亦可以使用Ansible/Kubernetes Job/DeamonSet等方式管理。
基本方式为创建hostPath的Volume,并进行挂载。
示例如下:
apiVersion: apps/v1kind: Deploymentmetadata: name: consumer-nfs labels: app: consumer-nfsspec: selector: matchLabels: app: consumer-nfs template: metadata: name: consumer-nfs labels: app: consumer-nfs spec: containers: - name: consumer-nfs image: dhubr.msorg.cn/temp/consumer imagePullPolicy: Always env: - name: SPRING_APPLICATION_NAME value: consumer-nfs - name: JAVA_TOOL_OPTIONS value: -javaagent:/opt/apm/skywalking-agent.jar - name: SW_AGENT_NAME value: consumer-nfs - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES value: apm-aop.paas:11800 - name: SW_LOGGING_DIR value: /tmp volumeMounts: - name: apm mountPath: /opt/apm readOnly: true volumes: - name: apm hostPath: path: /data/nfsdata/apm
Docker Base Image & Docker Build System
此方式基本核心思想为将Java Agent引入镜像中。即在Java的基础镜像或在应用程序的应用镜像中。
使用Docker Build System,将Java Agent加载至应用镜像中。可以使用多阶段构建显著减少体积。
示例如下:
FROM dockerhub.azk8s.cn/library/busyboxMAINTAINER 李盼庚 <lipg@outlook.com> ENV SKYWALKING_VERSION 7.0.0ENV APM_HOME=/opt/apm \ APM_TARGET_HOME=/apm RUN 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:11MAINTAINER 李盼庚 <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: v1kind: PersistentVolumemetadata: name: consumer-pv labels: name: consumer-pv kind: hostspec: hostPath: path: /opt/volumes/consumer capacity: storage: 100Gi volumeMode: Filesystem accessModes: - ReadWriteOnce - ReadWriteMany---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: consumer-pvc labels: name: consumer-pvc kind: hostspec: selector: matchLabels: name: consumer-pv kind: host resources: requests: storage: 100Gi accessModes: - ReadWriteMany---apiVersion: apps/v1kind: Deploymentmetadata: name: consumer-pvc labels: app: consumer-pvcspec: selector: matchLabels: app: consumer-pvc template: metadata: name: consumer-pvc labels: app: consumer-pvc spec: imagePullSecrets: - name: ilemon containers: - name: consumer-pvc image: dhubr.msorg.cn/temp/consumer imagePullPolicy: Always env: - name: SPRING_APPLICATION_NAME value: consumer-pvc - name: JAVA_TOOL_OPTIONS value: -javaagent:/opt/apm/skywalking-agent.jar - name: SW_AGENT_NAME value: consumer-pvc - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES value: apm-aop.paas:11800 - name: SW_LOGGING_DIR value: /tmp volumeMounts: - name: apm mountPath: /opt/apm readOnly: true volumes: - name: apm persistentVolumeClaim: 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/busyboxMAINTAINER 李盼庚 <lipg@outlook.com>ENV SKYWALKING_VERSION 7.0.0ENV 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/v1kind: Deploymentmetadata: name: demospec: selector: matchLabels: name: demo template: metadata: name: demo labels: name: demo spec: initContainers: - name: skywalking-init image: lipangeng/skywalking-initcontainer:7.0.0 imagePullPolicy: Always volumeMounts: - mountPath: /opt/skywalking name: skywalking containers: - name: demo image: tomcat imagePullPolicy: Always resources: limits: memory: 1Gi ports: - containerPort: 8080 name: http protocol: TCP env: - name: TZ value: Asia/Shanghai - name: JAVA_TOOL_OPTIONS value: -javaagent:/opt/skywalking/skywalking-agent.jar - name: SW_AGENT_NAME value: demo - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES value: skywalking-aop.skywalking:11800 volumeMounts: - mountPath: /opt/skywalking name: skywalking volumes: - name: skywalking emptyDir: {}
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进行了解。