全部產品
Search
文件中心

Simple Log Service:接入Kubernetes JVM監控資料

更新時間:Jun 30, 2024

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進行進一步精確限定目標選擇範圍。

JVM監控

準備工作

針對部署於Kubernetes中的Java應用,如果您要通過Logtail自動採集JVM監控資料,需要先完成如下3個操作。

  1. 在環境變數中增加POD_IP聲明。

    配置樣本如下:

                - name: POD_IP
                  valueFrom:
                    fieldRef:
                      fieldPath: status.podIP
  2. 設定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)
  3. 在環境變數中增加ILOGTAIL_JMX_PORT聲明,值為具體暴露的指標連接埠,即com.sun.management.jmxremote.port參數值。

  4. 完成上述配置後,請進入目標Pod,使用jps命令查看具體的JVM啟動參數,如下圖所示。其中,JAVA_TOOL_OPTIONS=""聲明用於避免使用jps程式時附帶環境變數JAVA_TOOL_OPTIONS,產生連接埠衝突。

    image.png

  5. 驗證環境變數:進入目標Pod,使用 env|grep ILOGTAIL_JMX_PORT查看是否配置成功環境變數,且連接埠號碼值與第四步暴露連接埠相同。

操作步驟

  1. 登入Log Service控制台

  2. 日誌應用地區的智能營運頁簽下,單擊全棧可觀測

  3. SLS全棧可觀測頁面,單擊目標執行個體。

  4. 在左側導覽列中,單擊全棧監控

    首次在該執行個體中使用全棧監控時,還需單擊立即開啟

  5. 在左側導覽列中,單擊資料接入,然後在資料接入配置頁面,找到Kubernetes監控地區的Kubernetes JVM監控

    首次建立目標監控項的接入配置時,開啟建立開關,可進入配置頁面。如果您已建立過接入配置,則單擊建立表徵圖,可進入配置頁面。

  6. 建立機器組:

    如已經安裝,請跳過此步驟。

  7. 單擊使用現有機器組

    安裝監控組件後,Log Service自動建立名為k8s-group-${your_k8s_cluster_id}的機器組,您可以直接使用該機器組。

  8. 選中目標機器組(k8s-group-${your_k8s_cluster_id}),將該機器組從源機器組移動到應用機器組,單擊下一步

    重要

    如果機器組心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。

  9. 資料來源設定中,配置如下參數,然後單擊完成

    設定完成後,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和環境變數的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定EnvKeyNGINX_SERVICE_PORT,設定EnvValue^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。

    多個白名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被匹配。

    環境變數黑名單

    環境變數黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定環境變數黑名單,那麼EnvKey必填,EnvValue可選填。

    • 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器的日誌都將被排除。
    • 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才會被排除。

      EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定EnvKeyNGINX_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的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定LabelKeyapp,設定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的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定LabelKeyapp,設定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的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如:配置LabelKeyio.kubernetes.container.name,配置LabelValue^(nginx|cube)$,表示可匹配名為nginx、cube的容器。

    多個白名單之間為或關係,即只要容器Label滿足任一白名單即可被匹配。

    容器Label黑名單

    容器Label黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定容器Label黑名單,那麼LabelKey必填,LabelValue可選填。

    • 如果LabelValue為空白,則容器Label中包含LabelKey的容器都將被排除。
    • 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才會被排除。

      LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如:設定LabelKeyio.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監控資料到服務。

JVM監控

後續步驟

接入Kubernetes JVM監控資料後,全棧可觀測應用會自動產生專屬儀錶盤。您可以通過儀錶盤分析監控資料。更多資訊,請參見查看儀錶盤