天天看點

Kubernetes 日志查詢分析實踐

作者:抱澤

準備工作

為了完成後續的相關操作,我們需要準備一個 K8s 叢集,操作步驟如下:

  1. 登陸 容器服務控制台
  2. 建立一個标準托管叢集(杭州區域),在向導中勾選上【使用 EIP 暴露 API Server】 和【使用日志服務】。
  3. 叢集建立完畢後,回到叢集清單頁面,點選【更多->通過 CloudShell 管理叢集】。
  4. 在 CloudShell 中輸入

    kubectl get ds -n kube-system

    ,結果中顯示的

    logtail-ds

    即為了實作資料采集所安裝的日志服務元件。
  5. 打開 日志服務控制台 ,可以看到和 K8s 叢集 ID 所對應的 project 也已經建立完畢。

操作截圖如下:

Kubernetes 日志查詢分析實踐

圖:建立托管叢集(步驟 2)

Kubernetes 日志查詢分析實踐

圖:打開 CloudShell(步驟 3)

Kubernetes 日志查詢分析實踐

圖:在 CloudShell 中檢視日志服務元件(步驟 4)

Kubernetes 日志查詢分析實踐

圖:打開日志服務控制台,檢視 project(步驟 5)

1. 資料采集

在 K8s 環境下,容器日志資料從大體上分為兩類:容器标準輸出和容器内文本檔案,前者是容器特有的一種日志存在形式,後者和傳統的文本檔案日志類似,隻是檔案存放在各個容器内部,互相之間隔離。下面我們将介紹如何對這兩種類型的日志進行采集。

1.1. Mock 資料

我們将使用如下兩個 YAML 檔案分别生成标準輸出和容器内檔案兩種形式的 mock 資料。

容器标準輸出

# 建立兩個 pod 來生成 mock 資料
apiVersion: batch/v1
kind: Job
metadata:
  name: nginx-stdout-log-demo-1
  namespace: nginx-stdout
spec:
  template:
    metadata:
      name: nginx-stdout-log-demo-1
    spec:
      containers:
      - name: nginx-stdout-log-demo-1
        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest
        command: ["/bin/mock_log"]
        args: ["--stderr=false", "--stdout=true", "--log-type=nginx", "--total-count=100000000", "--logs-per-sec=5"]
      restartPolicy: Never
---
apiVersion: batch/v1
kind: Job
metadata:
  name: nginx-stdout-log-demo-2
  namespace: nginx-stdout
spec:
  template:
    metadata:
      name: nginx-stdout-log-demo-2
    spec:
      containers:
      - name: nginx-stdout-log-demo-2
        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest
        command: ["/bin/mock_log"]
        args: ["--stderr=false", "--stdout=true", "--log-type=nginx", "--total-count=100000000", "--logs-per-sec=5"]
      restartPolicy: Never           

容器内文本檔案(/var/log/access.log)

apiVersion: batch/v1
kind: Job
metadata:
  name: nginx-file-log-demo
  namespace: nginx-file
spec:
  template:
    metadata:
      name: nginx-file-log-demo
    spec:
      restartPolicy: Never
      containers:
      - name: nginx-file-log-demo
        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest
        command: ["/bin/mock_log"]
        args: ["--log-type=nginx", "--stdout=false", "--stderr=false", "--path=/var/log/access.log", "--total-count=100000000", "--logs-per-sec=5"]           

操作步驟:

  1. 打開 CloudShell,參考準備工作中的步驟 3。
  2. 在叢集中應用上面提及的兩個 YAML( Github )。
  3. 執行 kubectl get pods 檢視負責生成日志的幾個 Pod。
  4. 檢視兩個 Pod 生成日志的情況(根據實際情況替換指令中的 pod 名)
    • 标準輸出:執行

      kubectl logs -n nginx-stdout --tail=10 nginx-stdout-log-demo-1-7kvwx

    • 容器内檔案:執行

      kubectl exec -n nginx-file nginx-file-log-demo-7frsp -- bash -c "tail /var/log/access.log"

$ kubectl create namespace nginx-stdout
$ kubectl create -f https://raw.githubusercontent.com/goclis/kubernetes-mock-log/master/pod_nginx_stdout.yaml
$ kubectl create namespace nginx-file
$ kubectl create -f https://raw.githubusercontent.com/goclis/kubernetes-mock-log/master/pod_nginx_file.yaml           

指令:生成 mock 資料(步驟 2)

$ kubectl get pods -A
NAMESPACE      NAME                                               READY   STATUS    RESTARTS   AGE
nginx-file     nginx-file-log-demo-7frsp                          1/1     Running   0          2m9s
nginx-stdout   nginx-stdout-log-demo-1-7kvwx                      1/1     Running   0          2m12s
nginx-stdout   nginx-stdout-log-demo-2-4x7vw                      1/1     Running   0          2m12s           

指令:檢視日志服務元件(步驟 3)

1.2. 采集标準輸出

  1. ,點選進入叢集 ID 對應的 project。
  2. 建立一個 logstore 用于存儲标準輸出日志,比如 k8s-stdout。
  3. 在 logstore 中新增 Logtail 配置,類型為【Docker 标準輸出】,選擇現有機器組中字首為 k8s-group 的機器組。
  4. 在【資料源設定】頁面,填寫【配置名稱】和【插件配置】。
Kubernetes 日志查詢分析實踐

圖:建立 Logtail 采集配置

Kubernetes 日志查詢分析實踐

圖:選擇 Docker 标準輸出配置

Kubernetes 日志查詢分析實踐

圖:選擇現有機器組

Kubernetes 日志查詢分析實踐

圖:選擇 k8s-group 開頭的機器組

Kubernetes 日志查詢分析實踐

圖:填寫 Docker 标準輸出采集配置内容

以下為兩個可選的采集配置(使用 IncludeLabel 分别采集兩個 namespace 下的資料,

參考

):

配置:采集 namespace nginx-stdout

{
    "inputs": [
        {
            "detail": {
                "IncludeLabel": {
                    "io.kubernetes.pod.namespace": "nginx-stdout"
                },
                "ExcludeLabel": {}
            },
            "type": "service_docker_stdout"
        }
    ]
}           

配置:采集 namespace kube-system

{
    "inputs": [
        {
            "detail": {
                "IncludeLabel": {
                    "io.kubernetes.pod.namespace": "kube-system"
                },
                "ExcludeLabel": {}
            },
            "type": "service_docker_stdout"
        }
    ]
}           

1.3. 采集容器内檔案

  1. 建立一個 logstore 用于存儲容器内檔案日志,比如 nginx-file。
  2. 在 logstore 中新增 Logtail 配置,類型為【Docker 檔案】,選擇現有機器組中字首為 k8s-group 的機器組。
  3. 在【資料源設定】頁面,填寫【配置名稱】和具體的配置資訊(采集檔案的路徑、Label 等),示例為采集

    /var/log/access.log

Kubernetes 日志查詢分析實踐

圖:選擇 Docker 檔案配置

Kubernetes 日志查詢分析實踐

圖:填寫 Docker 檔案采集配置内容

2. 日志查詢

2.1. 設定字段索引 & 開啟日志聚類

為了使用日志服務提供的查詢、日志聚類等功能,首先需要對索引進行配置。操作步驟如下:

  1. ,進入叢集 ID 對應的 project,從左側導航欄的 logstore 中選擇先前建立的 k8s-stdout,展開點選查詢分析進行查詢控制台。
  2. 點選右上角的【查詢分析屬性 -> 設定索引】。
  3. 在彈出視窗中勾選上【日志聚類】,然後點選【自動生成索引】。
  4. 點選【确定】儲存索引。
Kubernetes 日志查詢分析實踐

圖:進入 logstore 查詢分析界面

Kubernetes 日志查詢分析實踐

圖:索引配置入口

Kubernetes 日志查詢分析實踐

圖:開啟日志聚類

Kubernetes 日志查詢分析實踐

圖:自動生成字段索引

2.2. 基本查詢

在配置完索引後,我們可以在查詢輸入框中使用查詢語句可以快速地篩選日志,以下是一些示例:

  • 檢視命名空間 nginx-stdout 下的日志:

    _namespace_:nginx-stdout

  • 檢視其他命名空間下的日志:

    not _namespace_: nginx-stdout

  • 檢視命名空間 kube-system 下指定 pod 的日志:

    _namespace_: kube-system and _pod_name_: xxxxxx

在實際查詢過程中,我們可以通過直接點選查詢結果中的内容來快速填充查詢語句,截圖如下。

Kubernetes 日志查詢分析實踐

圖:點選查詢結果中的内容

Kubernetes 日志查詢分析實踐

圖:查詢語句快速填充

2.3. 日志聚類 & 上下文查詢 & LiveTail

在排查問題時,我們一般會組合使用日志聚類、上下文查詢以及 LiveTail 這三個功能來輔助問題排查。

  1. 首先,利用日志聚類來快速地檢視日志模式,發現其中懷疑的問題日志。
  2. 接着,利用上下文查詢,來跟蹤問題日志前後的日志,輔助我們定位問題。
  3. 最後,在根據問題做出調整後,使用 LiveTail 來檢視最新日志的變化情況,确認是否達到修改預期。

以下假設應用 pod 是 metrics-server,我們可以借助這套方法來對它進行分析:

  1. 查詢輸入框輸入 metrics-server,點選查詢分析,可以看到所有範圍(預設為最近 15 分鐘)的全部日志,一般來說會很多。
  2. 由于日志較多,為了發現日志模式,我們切換到【日志聚類】标簽頁,可以看到這段時間内的日志在模式上分為有限的幾類。我們可以拖動 pattern 進度條選擇粒度,對于特定 pattern,點選【日志數量】來檢視具體日志。
  3. 懸停到日志時間左側的圖示,點選彈出菜單中的【上下文浏覽】,在彈出頁面中同樣可以進行篩選,并點選【更早】、【更新】來檢視指定日志的上文和下文。
  4. 懸停到日志時間左側的圖示,點選彈出菜單中的【LiveTail】。
Kubernetes 日志查詢分析實踐

圖:日志聚類結果

Kubernetes 日志查詢分析實踐

圖:上下文查詢入口

Kubernetes 日志查詢分析實踐

圖:上下文查詢

Kubernetes 日志查詢分析實踐

圖:LiveTail

3. Ingress & Audit 方案

除了 K8s 環境下基本的日志采集、查詢分析功能以外,我們還針對 K8s 環境下的 Ingress、審計(Audit)日志提供了方案。

3.1. Ingress

為了在叢集中部署 Ingress 方案,隻需要在叢集已安裝日志服務元件的基礎上,應用如下的 YAML 檔案即可:

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # your config name, must be unique in you k8s cluster
  name: k8s-nginx-ingress
spec:
  # logstore name to upload log
  logstore: nginx-ingress
  # product code, only for k8s nginx ingress
  productCode: k8s-nginx-ingress
  # logtail config detail
  logtailConfig:
    inputType: plugin
    # logtail config name, should be same with [metadata.name]
    configName: k8s-nginx-ingress
    inputDetail:
      plugin:
        inputs:
        - type: service_docker_stdout
          detail:
            IncludeLabel:
              io.kubernetes.container.name: nginx-ingress-controller
            Stderr: false
            Stdout: true
        processors:
        - type: processor_regex
          detail:
            KeepSource: false
            Keys:
            - client_ip
            - x_forward_for
            - remote_user
            - time
            - method
            - url
            - version
            - status
            - body_bytes_sent
            - http_referer
            - http_user_agent
            - request_length
            - request_time
            - proxy_upstream_name
            - upstream_addr
            - upstream_response_length
            - upstream_response_time
            - upstream_status
            - req_id
            - host
            NoKeyError: true
            NoMatchError: true
            Regex: ^(\S+)\s-\s\[([^]]+)]\s-\s(\S+)\s\[(\S+)\s\S+\s"(\w+)\s(\S+)\s([^"]+)"\s(\d+)\s(\d+)\s"([^"]*)"\s"([^"]*)"\s(\S+)\s(\S+)+\s\[([^]]*)]\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s*(\S*).*
            SourceKey: content           

該 YAML 會在叢集對應的日志服務 project 中建立一個名為 nginx-ingress 的 logstore,存儲相關的日志,并且會對應地建立一系列基于 Ingress 日志所建構的詳細報表,輔助我們分析 Ingress 日志。

Kubernetes 日志查詢分析實踐

圖:Ingress 概覽

更多資訊可以閱讀

《Kubernetes Ingress 日志分析入門》

審計(Audit)

目前,審計方案會在叢集建立時自動應用,相關的日志會存儲在日志服務 project 下以

audit-

為字首的 logstore 中,其中包含針對叢集操作的詳細日志,比如資源(Pod、Deploy)的建立與删除、叢集的擴容記錄等。類似地,審計方案同樣提供了一系列詳細報表。

Kubernetes 日志查詢分析實踐

圖:審計中心概覽

《最全 Kubernetes 審計日志方案》

參考文檔

繼續閱讀