k8s部署服务接入skywalking之java agent使用(基于sideCar模式)
sideCar模式实现简单来说就是在同一个pod中,启动两个容器,容器A为正常的服务容器,容器B为辅助容器。同时让两个容器共享存储。辅助容器在启动后将前提条件准备好, 例如把服务容器需要使用到的agent包,提前放到共享目录当中,等到服务容器启动时就能直接使用共享目录中的agent包了以上只是sideCar模式的其中一种用法。
·
k8s部署服务基于sideCar模式
一、背景
- java应用在接入skywalking的时候,需要在启动参数指定 java agent的jar包
-javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent/skywalking-agent.jar
- 目前不打算将agent相关文件制作到java服务镜像里面
- 希望通过
挂载
的方式将agent包提供出来供java服务使用 - 决定采用
基于sideCar
模式部署java服务
原来采用过另外一种方案,是使用daemonset
将agent包挂载
到每个node的主机目录
,然后容器使用主机目录挂载的方式
共享该目录就能使用到agent包。但是由于换了一个新的环境,没有权限操作主机目录,所以此方案作罢.
该方案的实现参考:
https://blog.csdn.net/qq_44209563/article/details/129591624
二、sideCar模式介绍
参考文章:
https://juejin.cn/post/6844903998382669832#heading-3
sideCar模式实现简单来说就是在同一个pod
中,启动两个容器
,容器A为正常的服务容器
,容器B为辅助容器
。同时让两个容器共享存储
。
辅助容器在启动后
将前提条件准备好, 例如把服务容器需要使用到的agent包,提前放到共享目录
当中,等到服务容器
启动时就能直接使用共享目录中的agent包了
以上只是sideCar模式的其中一种用法。
三、部署
3.1 要点
- 在
同一个pod
中启动两个容器 - 容器之间会
共享存储
- 要保证容器启动的
先后顺序
3.2 创建deployment文件
monitor-demo.yaml文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: monitor-demo-test-deployment
namespace: kube-monitor
spec:
replicas: 1
selector:
matchLabels:
app: monitor-demo
template:
metadata:
labels:
app: monitor-demo
api: try
spec:
nodeName: 192.168.116.178
initContainers: #1.表示初始化容器,当作辅助容器使用,在启动时执行命令将agent包复制到共享存储中
- name: agent-c
image: 192.168.116.126:18080/monitor-test/sk-agent:8.14.1
imagePullPolicy: Always
command: [ "/bin/bash", "-c", "--" ]
args: [ "cp -r /data/paasops/sk/agent/* /data/paasops/sk/mount/agent;" ] #2.执行命令
volumeMounts: # 共享存储设置
- name: side-car-share-volume
mountPath: /data/paasops/sk/mount/agent
containers:
- name: monitor-demo # 服务容器
image: 192.168.116.126:18080/monitor-test/monitor-test-demo:20230518154109
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 8080
env:
- name: TZ
value: Asia/Shanghai
volumeMounts: # 共享存储设置
- name: side-car-share-volume
mountPath: /data/paasops/sk/mount/agent
volumes: # 声明共享存储
- name: side-car-share-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: monitor-demo-test-service
namespace: kube-monitor
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30280
selector:
app: monitor-demo
主要关心的内容:
- 声明共享存储
volumes: # 声明共享存储
- name: side-car-share-volume
emptyDir: {}
- 分别在两个容器中使用共享存储
volumeMounts: # 共享存储设置
- name: side-car-share-volume
mountPath: /data/paasops/sk/mount/agent
解释一下以上资源文件的执行情况:
- 执行时会先启动
init容器
agent-c, 该容器会执行cp
命令把agent包移动到共享目录/data/paasops/sk/mount/agent
中(此目录时agent-c的容器目录,映射到共享存储side-car-share-volume
) - int容器执行完毕后退出,然后启动
monitor-demo
容器, 此容器使用到了共享存储side-car-share-volume
,映射的是容器内目录/data/paasops/sk/mount/agent
- 也就相当于
agent-c容器
的/data/paasops/sk/mount/agent目录和monitor-demo容器
的/data/paasops/sk/mount/agent映射成同一个地方
3.3 执行资源文件
执行命令kubectl apply -f monitor-demo.yaml
更多推荐
已为社区贡献11条内容
所有评论(0)