全部產品
Search
文件中心

Container Service for Kubernetes:通過CRD採集應用日誌

更新時間:Jun 19, 2024

阿里雲Log ServiceSLS(Log Service)是針對日誌資料的一站式服務,讓您無需開發就能快捷完成日誌資料擷取、消費、投遞以及查詢分析等功能。ACK Serverless叢集提供了Log Service託管功能。本文介紹如何在ACK Serverless叢集中配置CRD並進行應用日誌採集管理。

前提條件

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

  • 已安裝ACK Virtual Node組件,且版本≥2.7.0。關於ACK Virtual Node的更多資訊,請參見ACK Virtual Node

注意事項

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

配置日誌採集

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

  1. 登入Container Service管理主控台

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

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

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

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

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

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

  4. 建立日誌採集配置CRD。

    說明

    建立日誌採集配置CRD後,您可以在Log Service控制台查看產生的日誌庫及logtail配置。如果後續需要更新配置,可以直接編輯CRD,系統將自動同步配置到Log Service。

    1. 參考樣本編寫日誌採集配置CRD的YAML設定檔。

      採集的日誌分為標準輸出(包括錯誤輸出)和檔案日誌兩種。詳細參數說明請參見Logtail配置

      標準輸出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"

      檔案日誌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      #對於分隔字元類型的日誌,logType可以設定為json_log
            logPath: /log/               #記錄檔夾
            filePattern: "*.log"         #檔案名稱, 支援萬用字元,例如log_*.log
            dockerFile: true             #採集容器內的檔案,dockerFile設定為true
            #用作解析時間的key''
            #timeKey: 'time'
            #時間解析方式''
            #timeFormat: '%Y-%m-%dT%H:%M:%S'
            #避免不同採集配置中存在相同採集目錄而導致衝突
            #dockerIncludeEnv:
            #  aliyun_logs_test-file: "/log/*.log"
    2. 執行以下命令建立日誌採集配置CRD。

      kubectl create -f log-stdout.yaml
      kubectl create -f log-file.yaml

測試日誌採集

建立日誌採集配置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. 單擊目標Projcect名稱。

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

      • 標準輸出

        日誌crd0

      • 檔案日誌

        日誌crd1

關閉日誌採集

建立日誌採集配置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