在传统java业务中,接入skywalking只需要加入skywalking的jar包,然后修改java程序的启动参数即可,但是在k8s环境下,为了完成相同的功能,虽然操作不同,但是基本思路也是一样的。

主要有两种方式:

1、直接修改原有镜像,将skywalking的jar包加入到镜像中去。然后修改相应的资源文件的启动参数。

这个方式侵入性较大,不是十分优雅,于是采用第二种方式

2、将skywalking的jar包通过使用init容器的方式,加入到原有的容器中。

将skywalking镜像作为init容器启动,其功能就是将skywalking的jar包通过数据卷的方式传递给主容器(就是原有的业务容器)。

以deployment为例,在原有的yaml的spec.templagte.spec.中添加如下内容

initContainers:
        - args:
            - '-c'
            - cp -R /skywalking/agent /agent/
          command:
            - /bin/sh
          image: 'apache/skywalking-java-agent:8.7.0-alpine'
          imagePullPolicy: IfNotPresent
          name: agent-container
          volumeMounts:
            - mountPath: /agent
              name: skywalking-agent
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

声明initContainers,指定skywalking镜像,并挂载/agent,复制资源到/agent中

针对主容器,进行如下修改

spec:
    containers:
    - env:
        - name: SERVICE_NAME
          value: yyyy
        - name: JAVA_OPTS
          value:
              -Xms2048m -Xmx2048m
              -javaagent:/skywalking/agent/skywalking-agent.jar
        - name: SW_AGENT_NAME
          value: 'xxxx::yyyy'
        - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
          value: skywalking-skywalking-helm-oap.skywalking.svc.cluster.local:11800
     volumeMounts:
         - mountPath: /skywalking
           name: skywalking-agent
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

修改java命令行参数 -javaagent,并指定环境变量SW_AGENT_NAMESW_AGENT_COLLECTOR_BACKEND_SERVICES

卷挂载:将名为skywalking-agent的卷挂载到/skywalking路径,以便Java Agent可以被访问。


PS:

关于init容器

在Kubernetes(k8s)中,Pod的Init容器是一种特殊类型的容器,它们在Pod中的主容器启动之前运行。以下是关于Pod中Init容器的详细解释:

定义

Init容器是一种在Pod中的应用容器启动之前运行的容器。它们用于执行初始化任务,如数据准备、配置检查、网络设置等。这些任务完成后,主容器才会启动。

使用场景

  1. 数据初始化:Init容器可以负责从持久存储加载配置文件、初始化数据库等任务,以确保主容器在启动时能够访问到所需的数据和配置。
  2. 网络设置:Init容器可以用于配置Pod的网络设置,包括等待其他服务就绪、配置网络策略等。这有助于避免主容器因依赖服务未就绪而导致的启动失败。
  3. 等待依赖服务:如果主容器依赖于其他服务(如数据库、消息队列等),Init容器可以阻塞直到这些服务准备就绪,从而确保主容器能够顺利启动。

生命周期

Init容器的生命周期包括以下几个阶段:

  1. Pending:表示Kubernetes正在创建并初始化Init容器。
  2. Running:表示Init容器正在执行初始化任务。
  3. Terminated:一旦任务完成(无论成功还是失败),Init容器将自动终止并进入Terminated状态。如果Init容器失败,Pod将被视为失败,Kubernetes将根据Pod的重启策略来重启Init容器,直到成功为止。