1. 目的
javaagent作为java的字节码增强技术,广泛应用于监控,热加载等工程场景。在普通虚机场景中,javaagent的安装只需要登录相应的服务器,修改启动脚本,加入 -javaagent:xxx.jar即可。
如果要在K8S进行javaagent的注入,显而易见需要修改docker image。显然,在K8S大规模集群中修改docker image是非常不合理的。本文将通过K8S的原生资源,尽可能的避免修改docker镜像,来完成K8S中探针的注入,同时适用于大规模集群。
2.节点和工具demo准备
资源 | 说明 |
---|---|
10.1.11.238(服务器) | K8S的master节点 |
10.1.11.188(服务器) | nfs存储节点 |
apm-all-2.9.2-dev.jar | javaagent |
这里准备了一套K8S集群,其他salve工作节点不在这里列出,同时准备一套分布式存储服务(nfs)。
3. 如何优雅的打探针?
- 打探针围绕2个中心进行:放置jar包和修改启动参数
- 如何优化的将这两步操作在K8S中完成?方式有很多:比如存储 、 commond 、 挂载启动脚本 、 修改环境变量(tomcat) 、修改镜像(迫不得已采用)。
- 思路:将javaagent通过分布式存储挂载到相应的pod,通过k8s env或者command或者configmap修改启动参数
4. 具体步骤
a. 挂载agent Jar包和配置文件,将其打入pod
- 创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: agent-pv
spec:
storageClassName: apm-agent
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
path: /nfs/dev-storage/apm-agent
server: 10.1.11.46
- 创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: agent-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: apm-agent
resources:
requests:
storage: 1Gi
- 登录分布式存储服务器,下载探针
ssh root@10.1.11.46
cd /nfs/dev-storage/apm-agent
curl **** ##此步骤模仿下载javaagent
unzip ***
- 将对应的PVC挂载到deployment(pod)
使用2中创建的pvc并命名(container同级)
volumes:
- name: agents
persistentVolumeClaim:
claimName: agent-pvc1
找到对应的container使用刚才的volumes(image同级)
volumeMounts:
- mountPath: /opt/apm/
name: agents
b. 修改启动参数,加入-javaagent
- 如果dockerfile中直接采用CMD,java -jar启动应用,则修改覆盖Dockerfile中的CMD启动命令
找到对应的container加入commond(image同级)
command: ["java","-javaagent:/opt/apm/apm-all-2.9.2-dev.jar","-jar","app.jar"]
- 如果是tomcat应用,则
找到对应的container加入
env:
- name: JAVA_OPTS
value: -javaagent:/opt/apm/apm-all-2.9.2-dev.ja
- 如果使用类似sh start.sh 启动应用,则
复制一份启动脚本到虚拟机(K8S master节点),同时修改启动脚本,注入javaagent
创建configmap
kubectl create configmap ${cm名称} --from-file=${配置文件目录} -n ${namespace}
同时将改configmap绑定到pod代替原来的启动脚本
- 如果Dockerfile使用entrypoint而非CMD直接java -jar启动应用
重新打镜像
5. 总结
通过pv configmap等方式注入探针适用于大规模集群,同时一个namespace只需要一个pvc即可。这样做的好处或者说区别于传统虚机部署的优势点:避免了重复工作,不需要将agent一个个复制到虚机上,极大增大了探针注入的效率。同时探针更新也比较方便,更新nfs服务器的jar包,然后对涉及到的pod进行灰度升级即可。