javaagent在K8S中的實(shí)踐

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)雅的打探針?

  1. 打探針圍繞2個(gè)中心進(jìn)行:放置jar包修改啟動(dòng)參數(shù)
  2. 如何優(yōu)化的將這兩步操作在K8S中完成?方式有很多:比如存儲(chǔ) 、 commond 、 掛載啟動(dòng)腳本 、 修改環(huán)境變量(tomcat) 、修改鏡像(迫不得已采用)。
  3. 思路:將javaagent通過(guò)分布式存儲(chǔ)掛載到相應(yīng)的pod,通過(guò)k8s env或者command或者configmap修改啟動(dòng)參數(shù)

4. 具體步驟

a. 掛載agent Jar包和配置文件,將其打入pod

  1. 創(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
  1. 創(chuàng)建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: agent-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: apm-agent
  resources:
    requests:
      storage: 1Gi
  1. 登錄分布式存儲(chǔ)服務(wù)器,下載探針
ssh root@10.1.11.46
cd /nfs/dev-storage/apm-agent
curl ****  ##此步驟模仿下載javaagent
unzip ***
  1. 將對(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

  1. 如果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"]
  1. 如果是tomcat應(yīng)用,則
找到對(duì)應(yīng)的container加入
    env:
        - name: JAVA_OPTS
          value: -javaagent:/opt/apm/apm-all-2.9.2-dev.ja
  1. 如果使用類(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)腳本

  1. 如果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í)即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容