全部產品
Search
文件中心

Elastic Container Instance:通過SLS CRD採集日誌

更新時間:Jul 06, 2024

本文介紹在ACK Serverless叢集中,如何通過SLS CRD來配置日誌採集,實現通過阿里雲Log ServiceSLS自動採集容器日誌。

背景資訊

阿里雲Log ServiceSLS(Log Service)是針對日誌資料的一站式服務,您無需開發就能快捷完成日誌資料擷取、消費、投遞以及查詢分析等功能。更多資訊,請參見Log Service簡介

前提條件

  • 已建立ACK Serverless叢集。具體操作,請參見建立叢集

  • 已開通Log Service。

    登入Log Service控制台時,如果沒有開通Log Service,將收到相關提示,您可以根據頁面提示開通。

注意事項

通過SLS CRD開啟日誌採集僅對後續建立的ECI Pod生效。如果想要採集存量Pod的日誌,需要對存量Pod進行一次滾動發布。

配置日誌採集

在叢集內部署alibaba-log-controller組件後,您可以通過日誌採集配置CRD(AliyunLogConfig CRD)來配置日誌採集。

部署alibaba-log-controller組件

  1. 登入Container Service管理主控台

  2. 叢集頁面,單擊目的地組群名稱,進入叢集管理頁面。

  3. 在叢集中部署alibaba-log-controller組件。

    1. 在叢集管理頁左側導覽列,選擇營運管理>組件管理

    2. 單擊日誌與監控頁簽,找到alibaba-log-controller卡片,然後單擊安裝

    3. 在彈出的對話方塊中,單擊確定

      安裝完成後,alibaba-log-controller卡片右上方會顯示已安裝。

建立Logtail採集配置

  1. 串連ACK Serverless叢集。

  2. 編寫日誌採集配置CRD的YAML設定檔。

    重要

    建立日誌採集配置CRD後,您可以在Log Service控制台查看產生的日誌庫及logtail配置。通過CRD方式建立的配置,在控制台上對其修改不會同步到CRD中。如果後續需要更新配置,請直接修改CRD資源,不要在控制台操作,避免導致配置不一致。

    AliyunLogConfig CRD YAML模板

    apiVersion: log.alibabacloud.com/v1alpha1      # 使用預設值,無需修改。
    kind: AliyunLogConfig                          # 使用預設值,無需修改。
    metadata:
      name: simple-stdout-example                  # 設定資源名,在當前Kubernetes叢集內唯一。
    spec:
      project: k8s-my-project                      # [可選]設定Project名稱。預設為安裝Logtail組件時設定的Project。
      logstore: k8s-stdout                         # 設定Logstore名稱。如果您所指定的Logstore不存在,Log Service會自動建立。
      logstoreMode: standard                       # [可選]設定Logstore類型,該參數值僅在建立Logstore時生效。
      shardCount: 2                                # [可選]設定Shard數量。預設值為2,取值範圍1~10。
      lifeCycle: 90                                # [可選]設定Logstore中資料的儲存時間,該參數值僅在建立Logstore時生效。預設值為90,取值範圍為1~3650。其中,3650天為永久儲存。
      logtailConfig:                               # 設定Logtail配置。
        inputType: plugin                          # 設定採集的資料來源類型。file表示採集文本日誌或plugin表示採集標準輸出。
        configName: simple-stdout-example          # 設定Logtail配置的名稱,必須與資源名(metadata.name)相同。
        inputDetail:                               # 設定Logtail配置的詳細資料,具體配置請參見本文下方的樣本。
          ...

    參數說明

    • 基本參數

      參數

      類型

      是否必填

      說明

      project

      string

      Project名稱。預設為安裝Logtail組件時設定的Project。

      logstore

      string

      Logstore名稱。如果您所指定的Logstore不存在,Log Service會自動建立。

      logstoreMode

      string

      Logstore類型。該參數值僅在建立Logstore時生效。取值範圍:

      • query:查詢型Logstore。

      • standard:標準型Logstore。

      更多資訊,請參見管理Logstore

      shardCount

      int

      Shard數量。預設值為2,取值範圍為1~10。

      lifeCycle

      int

      Logstore中資料的儲存時間。預設值為90,取值範圍為1~3650。其中,3650天為永久儲存。該參數值僅在建立Logstore時生效。

      machineGroups

      array

      機器組。安裝Logtail組件時,Log Service會自動建立名為k8s-group-${your_k8s_cluster_id}的機器組。

      logtailConfig

      object

      Logtail配置。包含以下參數:

      • configName:Logtail配置的名稱。

      • inputType:日誌輸入的方式。可選值如下:

        • plugin:通過Logtail外掛程式採集MySQL Binlog等日誌。

        • file:通過固定模式(正則模式、分隔字元模式等)採集文字檔中的日誌。

      • inputDetail:日誌輸入的相關配置。

      • outputType:日誌輸出的方式,只支援LogService,即只支援將資料上傳到Log Service。

      • outputDetail:日誌輸出的相關配置。

      • logSample:日誌範例。

      詳細的參數說明請參見Logtail配置

    • 容器過濾

      • Logtail 1.0.34以下版本,只支援通過環境變數、容器Label進行容器過濾。

        Kubernetes中的命名空間名和容器名會映射到容器Label中,分別為io.kubernetes.pod.namespaceio.kubernetes.container.name。推薦使用這兩個容器Label進行容器過濾。如果這兩個容器Label未滿足需求,請使用環境變數的黑白名單進行容器過濾。

      • Logtail 1.0.34及以上版本,可以使用Kubernetes層級的資訊(Pod名稱、Namespace、容器名稱、容器Label等)進行容器過濾。

        容器過濾參數請配置在logtailConfig>inputDetail>advanced>k8s欄位下。支援的參數如下:

        • IncludeK8sLabel:Kubernetes Label白名單,用於指定待採集的容器。

        • ExcludeK8sLabel:Kubernetes Label黑名單,用於排除不採集的容器。

        • K8sNamespaceRegex:指定Namespace。

        • K8sPodRegex:指定Pod名稱。

        • K8sContainerRegex:指定容器名稱。

    更多資訊,請參見通過DaemonSet方式採集Kubernetes容器文本日誌通過DaemonSet-控制台方式採集Kubernetes容器標準輸出

    AliyunLogConfig CRD YAML樣本

    文本日誌CRD YAML樣本

    將以下內容儲存為log-file.yaml

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      name: test-file                  # 資源名,在當前Kubernetes叢集內唯一。
    spec:
      project: k8s-log-c326bc86****    # 可選配置,Project名稱,可自訂,推薦使用[k8s-log-叢集ID]命名
      logstore: test-file              # 必選配置,Logstore名稱,如果不存在,Log Service會自動建立   
      logtailConfig:                   # Logtail配置
        inputType: file                # 採集的資料來源類型,file表示文本日誌,plugin表示標準輸出
        configName: test-file          # Logtail配置的名稱,必須與資源名(metadata.name)相同 
        inputDetail:                   # Logtail配置的詳細資料
          logType: common_reg_log      # 通過極簡模式採集文本日誌
          logPath: /log/               # 記錄檔所在路徑
          filePattern: "*.log"         # 記錄檔的名稱,支援萬用字元星號(*)和半形問號(?),例如log_*.log。
          dockerFile: true             # 採集容器內的檔案,dockerFile設定為true
          advanced:                    # 設定容器過濾條件
            k8s:
              K8sNamespaceRegex: ^(default)$
              K8sPodRegex: '^(nginx-log-demo.*)$'
              K8sContainerRegex: ^(nginx-log-demo-0)$
              IncludeK8sLabel:
                job-name: "^(nginx-log-demo.*)$"

    標準輸出CRD YAML樣本

    將以下內容儲存為log-stdout.yaml。

    apiVersion: log.alibabacloud.com/v1alpha1      
    kind: AliyunLogConfig                         
    metadata:
      name: test-stdout               # 資源名,在當前Kubernetes叢集內唯一。
    spec:
      project: k8s-log-c326bc86****   # 可選配置,Project名稱,可自訂,推薦使用[k8s-log-叢集ID]命名
      logstore: test-stdout           # 必選配置,Logstore名稱,如果不存在,Log Service會自動建立                  
      shardCount: 2                   # 可選配置,Shard數量,預設為2,取值範圍為1~10                         
      lifeCycle: 90                   # 可選配置,Logstore中日誌保留時間,單位為天,該參數值僅在建立Logstore時生效。預設為90,取值範圍為1~3650。3650表示持續保留
      logtailConfig:                  # Logtail配置
        inputType: plugin             # 採集的資料來源類型,file表示文本日誌,plugin表示標準輸出                                
        configName: test-stdout       # Logtail配置的名稱,必須與資源名(metadata.name)相同 
        inputDetail:                  # Logtail配置的詳細資料
          plugin:
            inputs:
              - type: service_docker_stdout
                detail:
                  Stdout: true
                  Stderr: true
    #              IncludeEnv:
    #                aliyun_logs_test-stdout: "stdout"
  3. 建立日誌採集配置CRD。

    命令樣本如下。Logtail配置生效後,Logtail開始採集各個容器上的標準輸出或文本日誌,並發送到Log Service中。

    kubectl apply -f log-file.yaml
    kubectl apply -f log-stdout.yaml
    重要

    採集到日誌後,您需要先建立索引,才能在Logstore中查詢和分析日誌。具體操作,請參見建立索引

測試日誌採集

建立日誌採集配置CRD後,Log Service會自動採集後續建立的Pod的日誌。您可以建立以下應用來測試日誌採集效果。

  1. 建立應用。

    以Deployment為例,YAML內容樣本如下,樣本中容器啟動後會執行相關命令,不斷列印標準輸出和記錄檔。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: eci-sls-demo
      labels:
        app: sls
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sls
      template:
        metadata:
          name: sls-test
          labels:
            app: sls
            alibabacloud.com/eci: "true" 
        spec:
          containers:
          - args:
            - -c
            - mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/busy.log; sleep 1;done
            command:
            - /bin/sh
            image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/busybox:1.30
            imagePullPolicy: Always
            name: busybox

    將以上YAML儲存為test-sls-crd.yaml,執行以下命令建立應用。

    kubectl create -f test-sls-crd.yaml
  2. 確認應用狀態。

    kubetcl get pod

    預期返回:

    NAME                            READY   STATUS    RESTARTS   AGE
    eci-sls-demo-7bf8849b9f-cgpbn   1/1     Running   0          2m14s
  3. 查看日誌。

    1. 登入Log Service控制台

    2. 單擊目標Project名稱。

    3. 找到目標日誌庫,單擊日誌庫名稱查看日誌。

      文本日誌

      日誌crd1

      標準輸出

      日誌crd0

關閉日誌採集

建立日誌採集配置CRD後,系統會自動採集所有合格Pod的日誌。對於一些不想要採集日誌的Pod,您可以配置Annotation(k8s.aliyun.com/eci-sls-enable: "false")來關閉日誌採集,避免系統自動建立Logtail而造成資源浪費。

重要
  • Annotation請添加在Pod的metadata下,例如:建立Deployment時,Annotation需添加在spec>template>metadata下。

  • 僅支援在建立ECI Pod時添加ECI相關Annotation來生效ECI功能,更新ECI Pod時添加或者修改ECI相關Annotation均不會生效。

配置樣本如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: eci-sls-demo2
  labels:
    app: sls
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sls
  template:
    metadata:
      name: sls-test
      labels:
        app: sls
        alibabacloud.com/eci: "true"
      annotations:
        k8s.aliyun.com/eci-sls-enable: "false"    #關閉日誌採集
    spec:
      containers:
      - args:
        - -c
        - mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/busy.log; sleep 1;
          done
        command:
        - /bin/sh
        image: registry.cn-shanghai.aliyuncs.com/eci_open/busybox:1.30
        imagePullPolicy: Always
        name: busybox