全部產品
Search
文件中心

Elasticsearch:通過Elastic實現Kubernetes容器全觀測

更新時間:Jun 30, 2024

Elastic可觀測性是通過Kibana可視化能力,將日誌、指標及APM資料結合在一起,實現對容器資料的觀測和分析。當您的應用程式以Pods方式部署在Kubernetes中,可以在Kibana中查看Pods組建記錄檔、主機和網路上的事件指標及APM資料,逐步縮小排查範圍進行故障排查。本文介紹具體的實現方法。

前提條件

背景資訊

本文介紹如何使用Elastic實現對Kubernetes容器的全方位檢測,具體內容如下:

關於Metricbeat、Filebeat及APM更多的特性說明,請參見Infrastructure monitoringLog monitoringElastic APM

通過Metricbeat實現指標採集

在Kubernetes上部署Metricbeat,有以下兩種方式:
  • DaemonSet:保證每個節點運行一個Pod,可以實現對Host指標、System指標、Docker統計資訊以及Kubernetes上啟動並執行所有服務指標的採集。
  • Deployment:部署單個Metricbeat執行個體,該執行個體用於檢索整個叢集的唯一指標,如kubernetes event或者kube-state-metrics。
重要
  • 本文以同時使用DaemonSet和Deployment的部署方式為例介紹如何部署Metricbeat容器,您也可以僅使用DaemonSet方式或Deployment方式進行部署。
  • Metricbeat依賴kube-state-metrics監控,部署前需要確保已完成kube-state-metrics的部署。阿里雲ACK容器預設在arms-prom命名空間下部署了kube-state-metrics監控。
  1. 通過kubectl訪問雲容器,下載Metricbeat設定檔。
    curl -L -O https://raw.githubusercontent.com/elastic/beats/6.8/deploy/kubernetes/metricbeat-kubernetes.yaml
  2. 修改Metricbeat設定檔。
    重要

    官方下載的YML檔案中,DaemonSets和Deployments的資源使用extensions/v1beta1,而v1.18及以上版本的Kubernetes,DaemonSets、Deployments和Replicasets資源的extensions/v1beta1 API將被廢棄,請使用apps/v1。

    1. 修改kind: Deploymentkind: DaemonSet下的配置資訊。
      • 修改環境變數,具體內容如下:
        env:
        - name: ELASTICSEARCH_HOST
          value: es-cn-nif23p3mo0065****.elasticsearch.aliyuncs.com
        - name: ELASTICSEARCH_PORT
          value: "9200"
        - name: ELASTICSEARCH_USERNAME
          value: elastic
        - name: ELASTICSEARCH_PASSWORD
          value: ****
        - name: KIBANA_HOST
          value: es-cn-nif23p3mo0065****-kibana.internal.elasticsearch.aliyuncs.com
        - name: KIBANA_PORT
          value: "5601"
        說明 下載的Metricbeat設定檔中預設未定義Kibana相關變數,可以通過容器env傳入變數資訊。
        參數說明
        ELASTICSEARCH_HOSTElasticsearch執行個體的私網地址。
        ELASTICSEARCH_PORTElasticsearch執行個體的私網連接埠。
        ELASTICSEARCH_USERNAMEElasticsearch的使用者名稱,預設值elastic。
        ELASTICSEARCH_PASSWORDelastic使用者的密碼。
        KIBANA_HOSTKibana私網地址。
        KIBANA_PORTKibana私網連接埠。
      • 增加spec.selector配置資訊,具體內容如下:
        ## kind: DaemonSet
        spec:
          selector:
            matchLabels:
               k8s-app: metricbeat
          template:
            metadata:
              labels:
                k8s-app: metricbeat
        
        ## kind: Deployment
        spec:
          selector:
            matchLabels:
               k8s-app: metricbeat
          template:
            metadata:
              labels:
                k8s-app: metricbeat
    2. 分別在name: metricbeat-daemonset-configname: metricbeat-deployment-config下,配置Kibana Output資訊,調用檔案中配置的環境變數。
      output.elasticsearch:
            hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
            username: ${ELASTICSEARCH_USERNAME}
            password: ${ELASTICSEARCH_PASSWORD}
      setup.kibana:
            host: "https://${KIBANA_HOST}:${KIBANA_PORT}"
      setup.dashboards.enabled: true
    3. 修改metricbeat-daemonset-modules配置,定義system模組監控的cpu、load、memory、network等系統指標,以及kubernetes模組可以擷取的監控指標。
      說明 關於Metricbeat更多的模組配置及指標說明,請參見System moduleKubernetes module
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: metricbeat-daemonset-modules
        namespace: kube-system
        labels:
          k8s-app: metricbeat
      data:
        system.yml: |-
          - module: system
            period: 10s
            metricsets:
              - cpu
              - load
              - memory
              - network
              - process
              - process_summary
              - core
              - diskio
              - socket
            processes: ['.*']
            process.include_top_n:
              by_cpu: 5      # include top 5 processes by CPU
              by_memory: 5   # include top 5 processes by memory
      
          - module: system
            period: 1m
            metricsets:
              - filesystem
              - fsstat
            processors:
            - drop_event.when.regexp:
                system.filesystem.mount_point: '^/(sys|cgroup|proc|dev|etc|host|lib)($|/)'
        kubernetes.yml: |-
          - module: kubernetes
            metricsets:
              - node
              - system
              - pod
              - container
              - volume
            period: 10s
            host: ${NODE_NAME}
            hosts: ["localhost:10255"]
    4. 修改metricbeat-deployment-modules配置,擷取kube-state-metric監控指標和event服務指標。
      重要 Metricbeat服務建立在kube-system的namespace下,kube-state-metrics預設建立在arms-prom的namespace下,由於namespace不同,所以hosts的命名格式為kube-state-metrics.<namespace>:8080。如果Metricbeat服務與kube-state-metrics模組都建立在同一namespace下,則hosts的命名格式為kube-state-metrics:8080。
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: metricbeat-deployment-modules
        namespace: kube-system
        labels:
          k8s-app: metricbeat
      data:
        # This module requires `kube-state-metrics` up and running under `kube-system` namespace
        kubernetes.yml: |-
          - module: kubernetes
            metricsets:
              - state_node
              - state_deployment
              - state_replicaset
              - state_pod
              - state_container
            period: 10s
            host: ${NODE_NAME}
            hosts: ["kube-state-metrics.arms-prom:8080"]
          # Uncomment this to get k8s events:
          - module: kubernetes
            metricsets:
              - event
    5. 配置RBAC許可權聲明,保證Metricbeat可以擷取到Kubernetes叢集資源資訊。
      apiVersion: rbac.authorization.k8s.io/v1beta1
      kind: ClusterRoleBinding
      metadata:
        name: metricbeat
      subjects:
      - kind: ServiceAccount
        name: metricbeat
        namespace: kube-system
      roleRef:
        kind: ClusterRole
        name: metricbeat
        apiGroup: rbac.authorization.k8s.io
      ---
      apiVersion: rbac.authorization.k8s.io/v1beta1
      kind: ClusterRole
      metadata:
        name: metricbeat
        labels:
          k8s-app: metricbeat
      rules:
      - apiGroups: [""]
        resources:
        - nodes
        - namespaces
        - events
        - pods
        verbs: ["get", "list", "watch"]
      - apiGroups: ["extensions"]
        resources:
        - replicasets
        verbs: ["get", "list", "watch"]
      - apiGroups: ["apps"]
        resources:
        - statefulsets
        - deployments
        verbs: ["get", "list", "watch"]
      - apiGroups:
        - ""
        resources:
        - nodes/stats
        verbs:
        - get
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: metricbeat
        namespace: kube-system
        labels:
          k8s-app: metricbeat
      ---
  3. 部署Metricbeat,並查看資源狀態。

    通過kubectl執行以下命令:

    kubectl apply -f metricbeat-kubernetes.yaml
    kubectl get pods -n kube-system
    重要 請確保Pods資源均處於Running狀態,否則在Kibana平台有可能會看不到相應資料。
  4. 在Kibana查看監測資料。
    1. 登入目標Elasticsearch執行個體的Kibana控制台。
      具體操作步驟請參見登入Kibana控制台
    2. 單擊左側菜單Infrastructure
    3. 查看Hosts、Kubernetes Pods對應的Metrics資訊。
      • 查看Hosts對應的Metrics資訊:單擊右上方Hosts,在Map View頁簽下,單擊指定Host,選擇View metrics,就可以查看對應的CPU、Load、Memory等指標資料。
        HostsHost metrics
      • 查看Kubernetes Pods對應的Metrics資訊:單擊右上方Kubernetes,在Map View頁簽下,單擊指定Pod,選擇View metrics,就可以查看對應的CPU、Memory、Network等指標資料。
        Pod metrics
    4. 查看Kubernetes叢集資源總覽資料。

      單擊左側菜單Dashboard,選擇[Metricbeat Kubernetes] Overview,就可以查看叢集資源總覽資料。

      overview

通過Filebeat實現日誌採集

本文樣本中,Filebeat容器使用DaemonSet控制器部署,確保叢集上每一個節點都有一個正在啟動並執行執行個體採集資料,並且設定檔中的資源部署在kube-system命名空間下。您如果需要改變,可以手動更改設定檔。

  1. 下載Filebeat設定檔。
    通過kubectl訪問雲容器,下載Filebeat設定檔。
    curl -L -O https://raw.githubusercontent.com/elastic/beats/6.8/deploy/kubernetes/filebeat-kubernetes.yaml
  2. 修改Filebeat設定檔。
    1. 修改kind: DaemonSet下的環境變數。
      env:
      - name: ELASTICSEARCH_HOST
        value: es-cn-nif23p3mo0065****.elasticsearch.aliyuncs.com
      - name: ELASTICSEARCH_PORT
        value: "9200"
      - name: ELASTICSEARCH_USERNAME
        value: elastic
      - name: ELASTICSEARCH_PASSWORD
        value: ****
      - name: KIBANA_HOST
        value: es-cn-nif23p3mo0065****-kibana.internal.elasticsearch.aliyuncs.com
      - name: KIBANA_PORT
        value: "5601"
      - name: NODE_NAME
        valueFrom:
           fieldRef:
              fieldPath: spec.nodeName
      參數說明
      ELASTICSEARCH_HOSTElasticsearch執行個體的私網地址。
      ELASTICSEARCH_PORTElasticsearch執行個體的私網連接埠。
      ELASTICSEARCH_USERNAMEElasticsearch的使用者名稱,預設值elastic。
      ELASTICSEARCH_PASSWORDelastic使用者的密碼。
      KIBANA_HOSTKibana私網地址。
      KIBANA_PORTKibana私網連接埠。
      NODE_NAMEKubernetes叢集Host。
    2. 修改name: filebeat-config對應的ConfigMap配置資訊,配置Kibana Output資訊,調用檔案中配置的環境變數。
      output.elasticsearch:
            hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
            username: ${ELASTICSEARCH_USERNAME}
            password: ${ELASTICSEARCH_PASSWORD}
      setup.kibana:
            host: "https://${KIBANA_HOST}:${KIBANA_PORT}"
    3. 配置Kubernetes,採集容器日誌。
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: filebeat-inputs
        namespace: kube-system
        labels:
          k8s-app: filebeat
      data:
        kubernetes.yml: |-
          - type: docker
            containers.ids:
            - "*"
            processors:
              - add_kubernetes_metadata:
                  host: ${NODE_NAME}
                  in_cluster: true
      ---
  3. 在Kubernetes中部署Filebeat,並查看資源狀態。

    通過kubectl執行以下命令:

    kubectl apply -f filebeat-kubernetes.yaml
    kubectl get pods -n kube-system
    重要 請確保Pods資源均處於Running狀態,否則在Kibana平台有可能會看不到相應資料。
  4. 在Kibana查看即時日誌。
    1. 登入目標Elasticsearch執行個體的Kibana控制台。
      具體操作步驟請參見登入Kibana控制台
    2. 查看Hosts、Kubernetes Pods對應的日誌。
      • 查看Hosts對應的日誌資訊:單擊右上方Hosts,在Map View頁簽下,單擊指定Host,選擇View logs,就可以查看Host即時日誌。
      • 查看Kubernetes Pods對應的日誌資訊:單擊右上方Kubernetes,在Map View頁簽下,單擊指定Pod,選擇View logs,就可以查看Pod即時日誌。
        view logs

通過Elastic APM實現應用程式效能監測

Elastic APM是基於Elastic Stack構建的應用程式效能監控系統。它提供即時監視軟體服務和應用程式的功能,採集傳入請求的回應時間和資料庫查詢、快取調用及外部HTTP請求等的詳細效能資訊,協助您更快速的查明並修複效能問題。Elastic APM還可以自動收集未處理的錯誤、異常及調用棧,協助您識別出新錯誤,並關注對應錯誤發生的次數。

關於Elastic APM更多的介紹,請參見Elastic APM Overview

  1. 部署APM Server容器。
    本文樣本使用Kubernetes部署,通過ConfigMap控制器定義apm-server.yml檔案,並初始化Pods啟動,通過service實現服務自動探索和負載平衡。
    1. 配置apm-server.yml檔案。

      完整的設定檔內容如下:

      ---
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: apm-deployment-config
        namespace: kube-system
        labels:
          k8s-app: apmserver
      data:
        apm-server.yml: |-
            apm-server.host: "0.0.0.0:8200" 
            output.elasticsearch:
               hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
               username: ${ELASTICSEARCH_USERNAME}
               password: ${ELASTICSEARCH_PASSWORD}
            setup.kibana:
               host: "https://${KIBANA_HOST}:${KIBANA_PORT}"
      
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: apmserver
        namespace: kube-system
        labels:
          k8s-app: apmserver
      spec:
        selector:
          matchLabels:
             k8s-app: apmserver
        template:
          metadata:
            labels:
              k8s-app: apmserver
          spec:
            serviceAccountName: apmserver
            hostNetwork: true
            dnsPolicy: ClusterFirstWithHostNet
            containers:
            - name: apmserver
              image: docker.elastic.co/apm/apm-server:6.8.14
              args: [
                "-c", "/etc/apm-server.yml",
                "-e",
              ]
              env:
              - name: ELASTICSEARCH_HOST
                value: es-cn-oew20i5h90006****.elasticsearch.aliyuncs.com
              - name: ELASTICSEARCH_PORT
                value: "9200"
              - name: ELASTICSEARCH_USERNAME
                value: elastic
              - name: ELASTICSEARCH_PASSWORD
                value: ****
              - name: KIBANA_HOST
                value: es-cn-oew20i5h90006****-kibana.internal.elasticsearch.aliyuncs.com
              - name: KIBANA_PORT
                value: "5601"
              - name: NODE_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: spec.nodeName
              securityContext:
                runAsUser: 0
              resources:
                limits:
                  memory: 50Mi
                requests:
                  cpu: 20m
                  memory: 30Mi
              volumeMounts:
              - name: config
                mountPath: /etc/apm-server.yml
                readOnly: true
                subPath: apm-server.yml
            volumes:
            - name: config
              configMap:
                defaultMode: 0600
                name: apm-deployment-config
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: apmserver
        namespace: kube-system
        labels:
          k8s-app: apmserver
      spec:
        clusterIP: None
        ports:
        - name: http-metrics
          port: 8200
          targetPort: 8200
        selector:
          k8s-app: apmserver
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: apmserver
        namespace: kube-system
        labels:
          k8s-app: apmserver
      ---
      重要
      • Deployment部署資源中,使用docker.elastic.co/apm/apm-server:6.8.14鏡像部署Pods容器,鏡像版本需要和Elasticsearch執行個體版本一致。
      • 通過service對叢集暴露8200服務連接埠,保證APM Agents可與APM Server通訊。
      參數說明
      ELASTICSEARCH_HOSTElasticsearch執行個體的私網地址。
      ELASTICSEARCH_PORTElasticsearch執行個體的私網連接埠。
      ELASTICSEARCH_USERNAMEElasticsearch的使用者名稱,預設值elastic。
      ELASTICSEARCH_PASSWORDelastic使用者的密碼。
      KIBANA_HOSTKibana私網地址。
      KIBANA_PORTKibana私網連接埠。
      NODE_NAMEKubernetes叢集Host。
    2. 部署APM Server容器,並查看資源狀態。

      通過kubectl執行以下命令:

      kubectl apply -f apm-server.yml
      kubectl get pods -n kube-system
      重要 請確保Pods資源均處於Running狀態,否則在Kibana平台有可能會看不到相應資料。
  2. 配置APM Agents。
    本文樣本是通過Spring Boot實現一個簡單的Web應用並打包為JAR包,並將JAR包和從Maven Central下載的最新Java Agent上傳到伺服器。詳細資料,請參見Spring BootMaven Central
    1. 登入Kubernetes節點,在工作目錄中建立Dockerfile檔案,檔案名稱為myapply。
      Dockerfile檔案內容如下:
      FROM frolvlad/alpine-oraclejdk8
      MAINTAINER peterwanghao.com
      VOLUME /tmp
      ADD spring-boot-0.0.1-SNAPSHOT.jar spring-boot-0.0.1-SNAPSHOT.jar
      ADD elastic-apm-agent-1.21.0.jar elastic-apm-agent-1.21.0.jar
      EXPOSE 8080
      ENTRYPOINT ["java","-javaagent:/elastic-apm-agent-1.21.0.jar","-Delastic.apm.service_name=my-application","-Delastic.apm.server_url=http://apmserver:8200","-Delastic.apm.application_packages=com.example","-jar","/spring-boot-0.0.1-SNAPSHOT.jar"]
      ENTRYPOINT定義容器啟動時啟動並執行Java命令及參數如下:
      參數說明
      -javaagent指定APM Agent代理JAR包。
      -Delastic.apm.service_nameAPM Service Name,允許以下字元:a-z、A-Z、0-9、-、_及空格。
      -Delastic.apm.server_urlAPM Server URL,http://apmserver:8200是在apm-server.yml檔案中的service定義。
      -Delastic.apm.application_packages應用程式的基礎軟體包。
      -jar指定應用JAR包。
    2. 通過docker build命令和Dockerfile定義的myapply檔案構建鏡像。
      在當前路徑下,執行以下命令:
      docker build -t myapply .
    3. 將構建好的鏡像載入到其他容器節點。
    4. 配置Pods部署檔案,檔案名稱為my-application.yaml。
      檔案內容如下:
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: my-apply
        namespace: kube-system
        labels:
          app: my-apply
      spec:
        containers:
          - name: my-apply
            image: myapply:latest
            ports:
              - containerPort: 8080
            imagePullPolicy: Never
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: my-apply
        namespace: kube-system
        labels:
          app: my-apply
      spec:
        type: NodePort
        ports:
        - name: http-metrics
          port: 8080
          nodePort: 30000
        selector:
          app: my-apply
      
      ---
      說明 image為構建好的鏡像檔案。
    5. 通過kubectl執行以下命令,部署Pods。
      kubectl apply -f my-application.yaml
    6. 待所有Pods資源均處於Running狀態後,使用Curl訪問主機的30000連接埠。
      執行命令如下:
      curl http://10.7.XX.XX:30000
      說明 10.7.XX.XX為Kubernetes的節點IP地址。

      能夠訪問對應主機後,APM Agents部署成功。

  3. 在Kibana控制台查看APM監控資料。
    1. 登入目標Elasticsearch執行個體的Kibana控制台。
      具體操作步驟請參見登入Kibana控制台
    2. 單擊左側菜單APM
    3. 單擊目標應用程式,本文樣本為my-application,可以看到服務的整體效能資料。
      APM
    4. 單擊對應的請求介面,可以看到具體的請求資訊。
      APM 介面詳情
    5. 查看Hosts、Pods相關日誌和指標資料。
      單擊Actions,選擇Show pod logsShow pod metrics等,查看對應的日誌和指標資料。
      ActionsPod Logs

常見問題

  • 問題:Kubernetes設定檔中resources.requests下資源設定較大,Pods無法啟動成功。

    解決方案:Metricbeat、Filebeat、APM設定檔中都需要設定resources.requests,建議根據Kubernetes叢集規格適當調整設定的值。

  • 問題:在部署Metricbeat、Filebeat、APM容器時,一直報錯。報錯內容類別似:no matches for kind "DaemonSet" in version "extensions/v1beat1"

    解決方案:官方下載的YML檔案中,Daemonsets和Deployments的資源使用extensions/v1beta1,而v1.18及以上版本的Kubernetes,Daemonsets、Deployments和Replicasets資源的extensions/v1beta1 API將被廢棄,請使用apps/v1。