Kubernetes JVM監控基於靈活的Logtail Kubernetes能力,通過自動探索等手段,為Kubernetes中所有基於JVM啟動並執行服務提供靈活且一站式的JVM指標採集方案。
前提條件
已建立全棧可觀測執行個體。具體操作,請參見建立執行個體。
採集原理
Java Management Extensions(JMX)技術是Java SE平台的標準功能,主要用於監控和管理Java應用的運行狀態、資源資訊、JVM虛擬機器運行情況等資訊。JMX支援通過Remote RMI方式進行暴露,類似於一個Prometheus Exporter。與通過Javaagent整合資料相比,通過RMI介面讀取指標更安全、整合成本更低。
在Kubernetes中,JVM指標採集的部署模型與日誌採集組件部署模型相同,都為Daemonset。依託於日誌採集組件多維度Kubernetes資源選擇能力,採集JVM監控資料時,也支援通過環境變數、Kubernetes Labels、Namespace、Pod名稱、容器名稱過濾資料。但不同的是由於RMI涉及Java進程之間的通訊,Kubernetes資源選擇可能命中大量非相關進程,Logtail增加了一個特殊的環境變數ILOGTAIL_JMX_PORT進行進一步精確限定目標選擇範圍。
準備工作
針對部署於Kubernetes中的Java應用,如果您要通過Logtail自動採集JVM監控資料,需要先完成如下3個操作。
在環境變數中增加POD_IP聲明。
配置樣本如下:
- name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP
設定JVM啟動參數。
設定com.sun.management.jmxremote參數,用於開啟JMX遠端存取。
設定com.sun.management.jmxremote.local.only參數為false。
設定com.sun.management.jmxremote.ssl參數和com.sun.management.jmxremote.authenticate參數為false,否則在接入配置中需設定JMX密碼。
設定com.sun.management.jmxremote.port參數和com.sun.management.jmxremote.rmi.port參數為聲明的RMI訪問連接埠。
設定java.rmi.server.hostname參數為環境變數POD_IP的值。
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Djava.rmi.server.hostname=$(POD_IP)
在環境變數中增加ILOGTAIL_JMX_PORT聲明,值為具體暴露的指標連接埠,即com.sun.management.jmxremote.port參數值。
完成上述配置後,請進入目標Pod,使用jps命令查看具體的JVM啟動參數,如下圖所示。其中,
JAVA_TOOL_OPTIONS=""
聲明用於避免使用jps程式時附帶環境變數JAVA_TOOL_OPTIONS,產生連接埠衝突。驗證環境變數:進入目標Pod,使用
env|grep ILOGTAIL_JMX_PORT
查看是否配置成功環境變數,且連接埠號碼值與第四步暴露連接埠相同。
操作步驟
在日誌應用地區的智能營運頁簽下,單擊全棧可觀測。
在SLS全棧可觀測頁面,單擊目標執行個體。
在左側導覽列中,單擊全棧監控。
首次在該執行個體中使用全棧監控時,還需單擊立即開啟。
在左側導覽列中,單擊資料接入,然後在資料接入配置頁面,找到Kubernetes監控地區的Kubernetes JVM監控。
首次建立目標監控項的接入配置時,開啟建立開關,可進入配置頁面。如果您已建立過接入配置,則單擊表徵圖,可進入配置頁面。
建立機器組:
如已經安裝,請跳過此步驟。
阿里雲ack叢集建立機器組,請參見建立IP地址機器組。
自建K8s叢集建立機器組,請參見建立使用者自訂標識機器組。
單擊使用現有機器組。
安裝監控組件後,Log Service自動建立名為
k8s-group-${your_k8s_cluster_id}
的機器組,您可以直接使用該機器組。選中目標機器組(
k8s-group-${your_k8s_cluster_id}
),將該機器組從源機器組移動到應用機器組,單擊下一步。重要如果機器組心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。
在資料來源設定中,配置如下參數,然後單擊完成。
設定完成後,Log Service將自動產生Metricstore等資產。更多資訊,請參見資產說明。
參數
說明
一般配置
配置名稱
自訂設定Logtail採集配置的名稱。
叢集
自訂設定Kubernetes叢集的名稱。
設定該參數後,Log Service會為通過該Logtail採集配置採集到的Kubernetes JVM監控資料添加
cluster=叢集名稱
的標籤。重要請確保該叢集名稱唯一,否則可能出現資料衝突。
Jmx使用者名稱
JMX訪問使用者名稱。
在Kubernetes情境中,建議不設定。
JMX密碼
JMX訪問密碼。
在Kubernetes情境中,建議不設定。
全域標籤
為採集到的Kubernetes JVM監控資料添加自訂標籤,該標籤為索引值對形式。
設定該參數後,Log Service會為通過該Logtail採集配置採集到的Kubernetes JVM監控資料添加標籤。
K8s選取器配置
Namespace
輸入匹配Namespace名稱的Regex,用於指定待採集的命名空間。
Pod名稱
輸入匹配Pod名稱的Regex,用於指定待採集的Pod。
容器名稱
輸入匹配容器名稱的Regex,用於指定待採集的容器。
環境變數白名單
環境變數白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的JVM監控資料。如果您要設定環境變數白名單,那麼EnvKey必填,EnvValue可選填。
- 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器都匹配。
- 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才匹配。
EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配,例如:設定EnvKey為NGINX_SERVICE_PORT,設定EnvValue為^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。
多個白名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被匹配。
環境變數黑名單
環境變數黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定環境變數黑名單,那麼EnvKey必填,EnvValue可選填。
- 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器的日誌都將被排除。
- 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才會被排除。
EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配,例如:設定EnvKey為NGINX_SERVICE_PORT,設定EnvValue為^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。
多個黑名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被排除。
K8s Label白名單
通過Kubernetes Label白名單指定待採集的容器。如果您要設定Kubernetes Label白名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則Kubernetes Label中包含LabelKey的容器都匹配。
- 如果LabelValue不為空白,則Kubernetes Label中包含LabelKey=LabelValue的容器才匹配。
LabelValue預設為字串匹配,即只有LabelValue和Kubernetes Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如設定LabelKey為app,設定LabelValue為^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。
多個白名單之間為或關係,即只要Kubernetes Label滿足任一白名單即可被匹配。
K8s Label黑名單
通過Kubernetes Label黑名單排除不採集的容器。如果您要設定Kubernetes Label黑名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則Kubernetes Label中包含LabelKey的容器都被排除。
- 如果LabelValue不為空白,則Kubernetes Label中包含LabelKey=LabelValue的容器才會被排除。
LabelValue預設為字串匹配,即只有LabelValue和Kubernetes Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如設定LabelKey為app,設定LabelValue為^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。
多個黑名單之間為或關係,即只要Kubernetes Label滿足任一黑名單對即可被排除。
容器Label白名單
容器Label白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的JVM監控資料。如果您要設定容器Label白名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則容器Label中包含LabelKey的容器都匹配。
- 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才匹配。
LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如:配置LabelKey為io.kubernetes.container.name,配置LabelValue為^(nginx|cube)$,表示可匹配名為nginx、cube的容器。
多個白名單之間為或關係,即只要容器Label滿足任一白名單即可被匹配。
容器Label黑名單
容器Label黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定容器Label黑名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則容器Label中包含LabelKey的容器都將被排除。
- 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才會被排除。
LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如:設定LabelKey為io.kubernetes.container.name,設定LabelValue為^(nginx|cube)$,表示可匹配名為nginx、cube的容器。
多個黑名單之間為或關係,即只要容器Label滿足任一黑名單對即可被排除。
進階配置
K8s Label附帶採集
設定Kubernetes Label標籤後,Log Service將在採集到的JVM監控資料中添加Kubernetes Label相關欄位。
例如設定Label名稱為
app
,Label別名為k8s_label_app
,當Kubernetes中包含名為app
的Label(例如app=serviceA
)時,Log Service將在JVM監控資料添加欄位k8s_label_app: serviceA
。環境變數附帶採集
設定環境變數標籤後,Log Service將在採集到的JVM監控資料中添加環境變數相關欄位。
例如設定環境變數名稱為
VERSION
,環境變數別名為env_version
,當容器中包含名為VERSION
的環境變數(例如VERSION=v1.0.0
)時,Log Service將在JVM監控資料添加欄位env_version: v1.0.0
。新版垃圾收集器JMX模式
開啟開關後,支援相容G1等新版垃圾收集器。
預設JVM指標
開啟開關後,Logtail將採集預定義的核心JVM指標。
JMX採集範圍過濾器
支援通過JMX Bean範圍、JMX Bean正則、JMX Bean類型以及採集JMX屬性範圍進行採集過濾。
接入案例
例如在名為default的命名空間下啟動SpringBoot Demo服務,然後通過環境變數ILOGTAIL_JMX_PORT聲明暴露9999連接埠,在環境變數JAVA_TOOL_OPTIONS中添加針對9999連接埠暴露JMX指標的JVM啟動參數。
使用環境變數JAVA_TOOL_OPTIONS引用環境變數POD_IP時,需要先定義環境變數POD_IP。
apiVersion: apps/v1
kind: Deployment
metadata:
name: jvm-new-1
namespace: default
spec:
...
template:
metadata:
labels:
app: jvm1
spec:
containers:
- image: evanljp/full-stack:jvm-new-0.1
name: jvm
env:
- name: "ILOGTAIL_JMX_PORT"
value: "9999"
- name: "ILOGTAIL_JMX_TAGS"
value: "a=b,c=d"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: JAVA_TOOL_OPTIONS
value: >-
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9999
-Djava.rmi.server.hostname=$(POD_IP)
-Dserver.port=8081
...
基於上述聲明,您只需在接入配置中完成如下配置,即可接入Kubernetes JVM監控資料到服務。
後續步驟
接入Kubernetes JVM監控資料後,全棧可觀測應用會自動產生專屬儀錶盤。您可以通過儀錶盤分析監控資料。更多資訊,請參見查看儀錶盤。