在传统java业务中,接入skywalking只需要加入skywalking的jar包,然后修改java程序的启动参数即可,但是在k8s环境下,为了完成相同的功能,虽然操作不同,但是基本思路也是一样的。
主要有两种方式:
1、直接修改原有镜像,将skywalking的jar包加入到镜像中去。然后修改相应的资源文件的启动参数。
这个方式侵入性较大,不是十分优雅,于是采用第二种方式
2、将skywalking的jar包通过使用init容器的方式,加入到原有的容器中。
将skywalking镜像作为init容器启动,其功能就是将skywalking的jar包通过数据卷的方式传递给主容器(就是原有的业务容器)。
以deployment为例,在原有的yaml的spec.templagte.spec.中添加如下内容
声明initContainers,指定skywalking镜像,并挂载/agent,复制资源到/agent中
针对主容器,进行如下修改
修改java命令行参数 -javaagent
,并指定环境变量如SW_AGENT_NAME
和SW_AGENT_COLLECTOR_BACKEND_SERVICES
卷挂载:将名为skywalking-agent
的卷挂载到/skywalking
路径,以便Java Agent可以被访问。
PS:
关于init容器
在Kubernetes(k8s)中,Pod的Init容器是一种特殊类型的容器,它们在Pod中的主容器启动之前运行。以下是关于Pod中Init容器的详细解释:
定义
Init容器是一种在Pod中的应用容器启动之前运行的容器。它们用于执行初始化任务,如数据准备、配置检查、网络设置等。这些任务完成后,主容器才会启动。
使用场景
- 数据初始化:Init容器可以负责从持久存储加载配置文件、初始化数据库等任务,以确保主容器在启动时能够访问到所需的数据和配置。
- 网络设置:Init容器可以用于配置Pod的网络设置,包括等待其他服务就绪、配置网络策略等。这有助于避免主容器因依赖服务未就绪而导致的启动失败。
- 等待依赖服务:如果主容器依赖于其他服务(如数据库、消息队列等),Init容器可以阻塞直到这些服务准备就绪,从而确保主容器能够顺利启动。
生命周期
Init容器的生命周期包括以下几个阶段:
- Pending:表示Kubernetes正在创建并初始化Init容器。
- Running:表示Init容器正在执行初始化任务。
- Terminated:一旦任务完成(无论成功还是失败),Init容器将自动终止并进入Terminated状态。如果Init容器失败,Pod将被视为失败,Kubernetes将根据Pod的重启策略来重启Init容器,直到成功为止。