Elastic可觀測性是通過Kibana可視化能力,將日誌、指標及APM資料結合在一起,實現對容器資料的觀測和分析。當您的應用程式以Pods方式部署在Kubernetes中,可以在Kibana中查看Pods組建記錄檔、主機和網路上的事件指標及APM資料,逐步縮小排查範圍進行故障排查。本文介紹具體的實現方法。
前提條件
- 建立Elasticsearch執行個體,並開啟白名單和自動建立索引功能。本文以6.8版本的執行個體為例,其他版本以實際情況為準。
具體操作,請參見建立Elasticsearch執行個體、配置執行個體公網或私網訪問白名單和配置YML參數。
- 建立ACK叢集,並運行Pod服務。本文的測試情境使用的Kubernetes版本為1.18.8-aliyun.1,ECS規格為2C8G。
具體操作,請參見建立ACK託管叢集。
- 配置kubectl用戶端,可通過kubectl串連Kubernetes叢集。
具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
背景資訊
關於Metricbeat、Filebeat及APM更多的特性說明,請參見Infrastructure monitoring、Log monitoring和Elastic APM。
通過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監控。
- 通過kubectl訪問雲容器,下載Metricbeat設定檔。
curl -L -O https://raw.githubusercontent.com/elastic/beats/6.8/deploy/kubernetes/metricbeat-kubernetes.yaml
- 修改Metricbeat設定檔。重要
官方下載的YML檔案中,DaemonSets和Deployments的資源使用extensions/v1beta1,而v1.18及以上版本的Kubernetes,DaemonSets、Deployments和Replicasets資源的extensions/v1beta1 API將被廢棄,請使用apps/v1。
- 修改kind: Deployment和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"
說明 下載的Metricbeat設定檔中預設未定義Kibana相關變數,可以通過容器env傳入變數資訊。參數 說明 ELASTICSEARCH_HOST Elasticsearch執行個體的私網地址。 ELASTICSEARCH_PORT Elasticsearch執行個體的私網連接埠。 ELASTICSEARCH_USERNAME Elasticsearch的使用者名稱,預設值elastic。 ELASTICSEARCH_PASSWORD elastic使用者的密碼。 KIBANA_HOST Kibana私網地址。 KIBANA_PORT Kibana私網連接埠。 - 增加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
- 修改環境變數,具體內容如下:
- 分別在name: metricbeat-daemonset-config和name: 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
- 修改metricbeat-daemonset-modules配置,定義system模組監控的cpu、load、memory、network等系統指標,以及kubernetes模組可以擷取的監控指標。說明 關於Metricbeat更多的模組配置及指標說明,請參見System module和Kubernetes 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"]
- 修改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
- 配置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 ---
- 修改kind: Deployment和kind: DaemonSet下的配置資訊。
- 部署Metricbeat,並查看資源狀態。
通過kubectl執行以下命令:
kubectl apply -f metricbeat-kubernetes.yaml kubectl get pods -n kube-system
重要 請確保Pods資源均處於Running狀態,否則在Kibana平台有可能會看不到相應資料。 - 在Kibana查看監測資料。
- 登入目標Elasticsearch執行個體的Kibana控制台。具體操作步驟請參見登入Kibana控制台。
- 單擊左側菜單Infrastructure。
- 查看Hosts、Kubernetes Pods對應的Metrics資訊。
- 查看Hosts對應的Metrics資訊:單擊右上方Hosts,在Map View頁簽下,單擊指定Host,選擇View metrics,就可以查看對應的CPU、Load、Memory等指標資料。
- 查看Kubernetes Pods對應的Metrics資訊:單擊右上方Kubernetes,在Map View頁簽下,單擊指定Pod,選擇View metrics,就可以查看對應的CPU、Memory、Network等指標資料。
- 查看Kubernetes叢集資源總覽資料。
單擊左側菜單Dashboard,選擇[Metricbeat Kubernetes] Overview,就可以查看叢集資源總覽資料。
- 登入目標Elasticsearch執行個體的Kibana控制台。
通過Filebeat實現日誌採集
本文樣本中,Filebeat容器使用DaemonSet控制器部署,確保叢集上每一個節點都有一個正在啟動並執行執行個體採集資料,並且設定檔中的資源部署在kube-system命名空間下。您如果需要改變,可以手動更改設定檔。
- 下載Filebeat設定檔。通過kubectl訪問雲容器,下載Filebeat設定檔。
curl -L -O https://raw.githubusercontent.com/elastic/beats/6.8/deploy/kubernetes/filebeat-kubernetes.yaml
- 修改Filebeat設定檔。
- 修改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_HOST Elasticsearch執行個體的私網地址。 ELASTICSEARCH_PORT Elasticsearch執行個體的私網連接埠。 ELASTICSEARCH_USERNAME Elasticsearch的使用者名稱,預設值elastic。 ELASTICSEARCH_PASSWORD elastic使用者的密碼。 KIBANA_HOST Kibana私網地址。 KIBANA_PORT Kibana私網連接埠。 NODE_NAME Kubernetes叢集Host。 - 修改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}"
- 配置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 ---
- 修改kind: DaemonSet下的環境變數。
- 在Kubernetes中部署Filebeat,並查看資源狀態。
通過kubectl執行以下命令:
kubectl apply -f filebeat-kubernetes.yaml kubectl get pods -n kube-system
重要 請確保Pods資源均處於Running狀態,否則在Kibana平台有可能會看不到相應資料。 - 在Kibana查看即時日誌。
- 登入目標Elasticsearch執行個體的Kibana控制台。具體操作步驟請參見登入Kibana控制台。
- 查看Hosts、Kubernetes Pods對應的日誌。
- 查看Hosts對應的日誌資訊:單擊右上方Hosts,在Map View頁簽下,單擊指定Host,選擇View logs,就可以查看Host即時日誌。
- 查看Kubernetes Pods對應的日誌資訊:單擊右上方Kubernetes,在Map View頁簽下,單擊指定Pod,選擇View logs,就可以查看Pod即時日誌。
- 登入目標Elasticsearch執行個體的Kibana控制台。
通過Elastic APM實現應用程式效能監測
Elastic APM是基於Elastic Stack構建的應用程式效能監控系統。它提供即時監視軟體服務和應用程式的功能,採集傳入請求的回應時間和資料庫查詢、快取調用及外部HTTP請求等的詳細效能資訊,協助您更快速的查明並修複效能問題。Elastic APM還可以自動收集未處理的錯誤、異常及調用棧,協助您識別出新錯誤,並關注對應錯誤發生的次數。
關於Elastic APM更多的介紹,請參見Elastic APM Overview。
- 部署APM Server容器。本文樣本使用Kubernetes部署,通過ConfigMap控制器定義apm-server.yml檔案,並初始化Pods啟動,通過service實現服務自動探索和負載平衡。
- 配置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_HOST Elasticsearch執行個體的私網地址。 ELASTICSEARCH_PORT Elasticsearch執行個體的私網連接埠。 ELASTICSEARCH_USERNAME Elasticsearch的使用者名稱,預設值elastic。 ELASTICSEARCH_PASSWORD elastic使用者的密碼。 KIBANA_HOST Kibana私網地址。 KIBANA_PORT Kibana私網連接埠。 NODE_NAME Kubernetes叢集Host。 - 部署APM Server容器,並查看資源狀態。
通過kubectl執行以下命令:
kubectl apply -f apm-server.yml kubectl get pods -n kube-system
重要 請確保Pods資源均處於Running狀態,否則在Kibana平台有可能會看不到相應資料。
- 配置apm-server.yml檔案。
- 配置APM Agents。本文樣本是通過Spring Boot實現一個簡單的Web應用並打包為JAR包,並將JAR包和從Maven Central下載的最新Java Agent上傳到伺服器。詳細資料,請參見Spring Boot和Maven Central。
- 登入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_name APM Service Name,允許以下字元:a-z、A-Z、0-9、-、_及空格。 -Delastic.apm.server_url APM Server URL,http://apmserver:8200是在apm-server.yml檔案中的service定義。 -Delastic.apm.application_packages 應用程式的基礎軟體包。 -jar 指定應用JAR包。 - 通過
docker build
命令和Dockerfile定義的myapply檔案構建鏡像。在當前路徑下,執行以下命令:docker build -t myapply .
- 將構建好的鏡像載入到其他容器節點。
- 配置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為構建好的鏡像檔案。 - 通過kubectl執行以下命令,部署Pods。
kubectl apply -f my-application.yaml
- 待所有Pods資源均處於Running狀態後,使用Curl訪問主機的30000連接埠。執行命令如下:
curl http://10.7.XX.XX:30000
說明 10.7.XX.XX為Kubernetes的節點IP地址。能夠訪問對應主機後,APM Agents部署成功。
- 登入Kubernetes節點,在工作目錄中建立Dockerfile檔案,檔案名稱為myapply。
- 在Kibana控制台查看APM監控資料。
- 登入目標Elasticsearch執行個體的Kibana控制台。具體操作步驟請參見登入Kibana控制台。
- 單擊左側菜單APM。
- 單擊目標應用程式,本文樣本為my-application,可以看到服務的整體效能資料。
- 單擊對應的請求介面,可以看到具體的請求資訊。
- 查看Hosts、Pods相關日誌和指標資料。單擊Actions,選擇Show pod logs、Show pod metrics等,查看對應的日誌和指標資料。
- 登入目標Elasticsearch執行個體的Kibana控制台。
常見問題
- 問題: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。