1. 目的
javaagent作為java的字節(jié)碼增強(qiáng)技術(shù),廣泛應(yīng)用于監(jiān)控,熱加載等工程場(chǎng)景。在普通虛機(jī)場(chǎng)景中,javaagent的安裝只需要登錄相應(yīng)的服務(wù)器,修改啟動(dòng)腳本,加入 -javaagent:xxx.jar即可。
如果要在K8S進(jìn)行javaagent的注入,顯而易見(jiàn)需要修改docker image。顯然,在K8S大規(guī)模集群中修改docker image是非常不合理的。本文將通過(guò)K8S的原生資源,盡可能的避免修改docker鏡像,來(lái)完成K8S中探針的注入,同時(shí)適用于大規(guī)模集群。
2.節(jié)點(diǎn)和工具demo準(zhǔn)備
| 資源 | 說(shuō)明 |
|---|---|
| 10.1.11.238(服務(wù)器) | K8S的master節(jié)點(diǎn) |
| 10.1.11.188(服務(wù)器) | nfs存儲(chǔ)節(jié)點(diǎn) |
| apm-all-2.9.2-dev.jar | javaagent |
這里準(zhǔn)備了一套K8S集群,其他salve工作節(jié)點(diǎn)不在這里列出,同時(shí)準(zhǔn)備一套分布式存儲(chǔ)服務(wù)(nfs)。
3. 如何優(yōu)雅的打探針?
- 打探針圍繞2個(gè)中心進(jìn)行:放置jar包和修改啟動(dòng)參數(shù)
- 如何優(yōu)化的將這兩步操作在K8S中完成?方式有很多:比如存儲(chǔ) 、 commond 、 掛載啟動(dòng)腳本 、 修改環(huán)境變量(tomcat) 、修改鏡像(迫不得已采用)。
- 思路:將javaagent通過(guò)分布式存儲(chǔ)掛載到相應(yīng)的pod,通過(guò)k8s env或者command或者configmap修改啟動(dòng)參數(shù)
4. 具體步驟
a. 掛載agent Jar包和配置文件,將其打入pod
- 創(chuàng)建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
- 創(chuàng)建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: agent-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: apm-agent
resources:
requests:
storage: 1Gi
- 登錄分布式存儲(chǔ)服務(wù)器,下載探針
ssh root@10.1.11.46
cd /nfs/dev-storage/apm-agent
curl **** ##此步驟模仿下載javaagent
unzip ***
- 將對(duì)應(yīng)的PVC掛載到deployment(pod)
使用2中創(chuàng)建的pvc并命名(container同級(jí))
volumes:
- name: agents
persistentVolumeClaim:
claimName: agent-pvc1
找到對(duì)應(yīng)的container使用剛才的volumes(image同級(jí))
volumeMounts:
- mountPath: /opt/apm/
name: agents
b. 修改啟動(dòng)參數(shù),加入-javaagent
- 如果dockerfile中直接采用CMD,java -jar啟動(dòng)應(yīng)用,則修改覆蓋Dockerfile中的CMD啟動(dòng)命令
找到對(duì)應(yīng)的container加入commond(image同級(jí))
command: ["java","-javaagent:/opt/apm/apm-all-2.9.2-dev.jar","-jar","app.jar"]
- 如果是tomcat應(yīng)用,則
找到對(duì)應(yīng)的container加入
env:
- name: JAVA_OPTS
value: -javaagent:/opt/apm/apm-all-2.9.2-dev.ja
- 如果使用類(lèi)似sh start.sh 啟動(dòng)應(yīng)用,則
復(fù)制一份啟動(dòng)腳本到虛擬機(jī)(K8S master節(jié)點(diǎn)),同時(shí)修改啟動(dòng)腳本,注入javaagent
創(chuàng)建configmap
kubectl create configmap ${cm名稱(chēng)} --from-file=${配置文件目錄} -n ${namespace}
同時(shí)將改configmap綁定到pod代替原來(lái)的啟動(dòng)腳本
- 如果Dockerfile使用entrypoint而非CMD直接java -jar啟動(dòng)應(yīng)用
重新打鏡像
5. 總結(jié)
通過(guò)pv configmap等方式注入探針適用于大規(guī)模集群,同時(shí)一個(gè)namespace只需要一個(gè)pvc即可。這樣做的好處或者說(shuō)區(qū)別于傳統(tǒng)虛機(jī)部署的優(yōu)勢(shì)點(diǎn):避免了重復(fù)工作,不需要將agent一個(gè)個(gè)復(fù)制到虛機(jī)上,極大增大了探針注入的效率。同時(shí)探針更新也比較方便,更新nfs服務(wù)器的jar包,然后對(duì)涉及到的pod進(jìn)行灰度升級(jí)即可。