ack-onepilot是ARMS针对K8s应用接入场景研发的重要组件,本文旨在介绍ack-onepilot的基本原理,以帮助用户更好地使用ack-onepilot。
基本工作流程
ack-onepilot主要由两部分组成,一部分是ack-onepilot的Webhook服务,另一部分是ack-onepilot的init-container。ack-onepilot的Webhook服务是一个K8s的Mutating Admission Webhook:
ack-onepilot的Webhook服务会在K8s Pod被持久化到etcd之前对Pod进行一些改写操作,整个流程大概如下图所示:
ack-onepilot Webhook对要创建的Pod主要执行了如下操作:
为Pod注入JAVA_TOOL_OPTIONS等关键环境变量。
例如在Java应用启动时,ack-onepilot Webhook会自动将JAVA_TOOL_OPTIONS中的一些JVM系统参数追加到此Java应用中。在ack-onepilot Webhook中,JAVA_TOOL_OPTIONS将为用户注入用户的ARMS Licensekey、应用名、上报Region等信息帮助探针更好地找到数据上报的端点。同时将注入
-javaagent
参数帮助Java应用在启动时自动找到ARMS探针的路径并进行挂载。而对于Go应用,则只需要注入用户的ARMS Licensekey、应用名、上报Region等环境变量。为Pod添加一个init-container,该init-container主要用于在应用启动前做一些准备。
一种最常见的场景:该init-container会准备好ARMS探针文件,并通过Volume的方式挂载到用户的Pod中。此后,应用启动时将通过第一步中的JAVA_TOOL_OPTIONS找到准备好的ARMS探针并挂载到用户的Java进程上,从而对用户业务进程产生的观测数据进行收集。
常见问题
ack-onepilot的版本与ARMS探针的版本是否有关系?
接入的ARMS探针版本与ack-onepilot没有必然关系,不同版本的ack-onepilot将会根据后台或用户自主配置的探针版本获取对应的探针包。