您的位置 首页 java

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

前言

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进行了解。

文章来源:智云一二三科技

文章标题:Skywalking Java Agent在Kubernetes项目中的常见挂载及启动模式

文章地址:https://www.zhihuclub.com/186023.shtml

关于作者: 智云科技

热门文章

网站地图