当前位置: 代码迷 >> 综合 >> Skywalking Java Agent在Kubernetes项目中的常见挂载及启动模式
  详细解决方案

Skywalking Java Agent在Kubernetes项目中的常见挂载及启动模式

热度:91   发布时间:2024-02-10 18:54:06.0

前言

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_OPTSJAVA_OPTS等。

Kubernets Admission Controller

Kubernetes的准入控制器模式,可通过Label、namespace、env等属性启动自动注入,无需显式配置,易于管理。其启动方式也是
由于内容较多,且配置多样化,详情参考Skywalking Injection进行了解。

  相关解决方案