前言
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地址:
目前可用镜像如下,对应相应的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 -nfs
labels:
app: consumer-nfs
spec:
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/busybox
MAINTAINER 李盼庚 <lipg@outlook.com>
ENV SKYWALKING_VERSION 7.0.0
ENV APM_HOME=/opt/apm \
APM_TARGET_HOME=/apm
RUN set -ex; \
\
mkdir -pv ${APM_HOME} ;\
mkdir -pv /tmp/skywalking ;\
\
wget -O skywalking.tar.gz {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等
通过Kubernetes的PV/PVC机制进行挂载,灵活性更高,但配置相对复杂
示例如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: consumer-pv
labels:
name: consumer-pv
kind: host
spec:
hostPath:
path: /opt/volumes/consumer
capacity:
storage: 100Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
- ReadWriteMany
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: consumer-pvc
labels:
name: consumer-pvc
kind: host
spec:
selector:
matchLabels:
name: consumer-pv
kind: host
resources:
requests:
storage: 100Gi
accessModes:
- ReadWriteMany
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: consumer-pvc
labels:
app: consumer-pvc
spec:
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/busybox
MAINTAINER 李盼庚 <lipg@outlook.com>
ENV SKYWALKING_VERSION 7.0.0
ENV SKYWALKING_HOME=/usr/local/skywalking \
AGENT_HOME=/opt/skywalking
RUN set -ex; \
\
mkdir -pv ${SKYWALKING_HOME} \
\
; wget -O skywalking.tar.gz {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: 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进行了解。