K8s場景下Logtail組件可觀測方案升級-Logtail事件監控發佈

簡介: SLS針對Logtail本身以及Logtail的管控組件alibaba-log-controller,採用K8s事件的方式,將處理流程中的關鍵事件透出,從而讓用戶能夠更清楚的感知其中發生的異常。

背景

隨着K8s和雲的普及,越來越多的公司將業務系統部署到雲上,並且使用K8s來部署應用。Logtail是SLS提供的日誌採集Agent,能夠非常好的適應K8s下各種場景的日誌採集,支持通過DaemonSet方式和Sidecar方式採集Kubernetes集羣的容器標準輸出或者文件日誌。Logtail作爲一個K8s場景下非常重要一個組件,其自身運行狀態需要有更好的可觀測方案。

K8s中Logtail管控原理

K8s場景下,除了控制檯管控之外,Logtail還提供了環境變量和CRD兩種配置方式,用來配置容器日誌採集。

環境變量方式

環境變量的配置方式,參考文檔

環境變量方式管控原理:

  • Logtail會去掃描所有的容器信息,並獲取容器中的環境變量信息
  • 過濾其中包含aliyun_logs_前綴的字段,然後組合成採集配置信息,Logtail同時會用改環境變量作爲採集配置中容器過濾的條件
  • Logtail端收到採集配置的變化後,會調整本地的採集配置,從而實現整個控制流程的閉環。

CRD方式

CRD方式創建採集配置流程,參考文檔

CRD配置原理如上圖所示:

  • K8S內部會註冊自定義資源(CRD,CustomResourceDefinition)AliyunLogConfig,並部署alibaba-log-controller
  • CR對象創建/變化/刪除之後,alibaba-log-controller會監聽到CR對象的變化,從而對CR對象中指定的logstore、採集配置進行相應的操作
  • Logtail端收到採集配置的變化後,會調整本地的採集配置,從而實現整個控制流程的閉環。

無論是環境變量的配置方式,還是CRD的配置方式,Logtail的狀態都是比較難觀測的。

  • 環境變量配置之後,無論配置的是否正確,都不會影響業務容器的正常運行。但是logtail是否讀到了環境變量裏的配置並且進行了正確的處理,這個用戶只能看到最終的結果。如果配置錯了,用戶也不能拿到及時的反饋,只能看到SLS控制檯上,logstore沒有創建出來或者採集配置沒有創建出來,中間到底哪一個步驟報錯了,用戶也無法感知。
  • 一個CR配置之後,從K8s的角度來看,只能看到CR對象創建成功了。但是CRD對象創建成功之後,alibaba-log-controller內的處理流程,對於用戶來講,就像黑盒一樣。如果出現異常,用戶並不清楚究竟是中間哪一步出了問題。

基於以上的問題,SLS針對Logtail本身以及Logtail的管控組件alibaba-log-controller,採用K8s事件的方式,將處理流程中的關鍵事件透出,從而讓用戶能夠更清楚的感知其中發生的異常。

Logtail事件監控實戰

限制說明

  • alibaba-log-controller版本大於等於0.3.2
  • logtail版本大於等於1.1.2
  • logtail中目前涵蓋的事件
  • 創建project、創建logstore、創建採集配置
  • alibaba-log-controller中涵蓋的事件
  • 創建project、創建logstore、創建採集配置、創建索引、創建ingress日誌中心、checkpoint寫入

開啓Logtail事件監控

未開啓過K8s事件中心

步驟一:創建K8s事件中心

  1. 登錄日誌服務控制檯

  1. 在日誌應用區域的雲產品Lens頁籤中,單擊K8s事件中心。
  2. 在事件中心管理頁面,單擊添加。
  3. 在添加事件中心頁面,配置相關參數。
  • 如果選擇已有Project,則從Project下拉框中選擇已創建的Project,用於管理K8s事件中心相關資源(Logstore、儀表盤等)。
  • 如果選擇從容器服務選擇K8s集羣,則從K8s集羣下拉框中選擇已創建的K8s集羣。通過此方式創建K8s事件中心,日誌服務默認創建一個名爲k8s-log-{cluster-id}的Project,用於管理K8s事件中心相關資源(Logstore、儀表盤等)。

  1. 單擊下一步

步驟二:部署eventer和node-problem-detector

您需要在Kubernetes集羣中配置eventer和node-problem-detector後才能正常使用K8s事件中心。

  • 阿里雲Kubernetes配置方式阿里雲Kubernetes應用市場中的ack-node-problem-detector已集成eventer和node-problem-detector功能,您只需要部署該組件即可,該組件詳細部署請參見事件監控
  1. 登錄容器服務控制檯
  2. 在左側導航欄中,選擇運維管理 > 組件管理,日誌與監控下,單擊ack-node-problem-detector。

  1. 單擊安裝、確認。

  • 自建Kubernetes配置方式
  1. 部署eventer。更多信息,請參見採集Kubernetes事件
  2. 部署node-problem-detector。更多信息,請參見Github

已開啓過K8s事件中心

由於Logtail事件監控依賴了比較新的索引,因此可以在K8s事件中心頁面,點擊版本升級的選項,裏面有一個索引更新的按鈕,點擊之後,即可以開啓新的索引字段。

Logtail事件監控大盤

Logtail事件監控大盤將各個步驟的結果完整展示出來,並且以時間軸的方式,展示各個事件的先後順序,同時支持用Project、Logstore、採集配置名參數進行過濾。

針對異常的事件,Logtail事件監控大盤會把異常事件的詳情展示出來:

詳情字段

含義

time

事件發生的時間

source

事件來源,主要有alibaba-log-controller和logtail

resourceName

主要針對CRD場景下,CRD的名字

configName

採集配置的名字

project

採集配置所屬的project

logstore

採集配置所屬的logstore

reason

事件產生的原因

message

事件的詳細信息

errorCode

異常步驟的錯誤碼

errorMessage

異常步驟的報錯信息

requestId

異常步驟的請求標識

針對採集配置的創建、變更、刪除操作,Logtail事件監控提供了相關的記錄,用於進行操作審計

詳情字段

含義

time

事件發生的時間

source

事件來源,主要有alibaba-log-controller和logtail

action

創建、變更或者刪除

level

normal或者warning

configName

採集配置的名字

project

採集配置所屬的project

logstore

採集配置所屬的logstore

logtailconfig

採集配置詳情

應用案例

場景1: 通過CRD配置,logstore數量超過quota限制

一個CRD配置如下:

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  name: simple-index-crd-example-0909-no-1
spec:
  logstore: logstore-quota-test-0909-no-1
  logtailConfig:
    inputType: plugin
    configName: simple-index-crd-example-0909-no-1
    inputDetail:
      plugin:
        inputs:
          -
            type: service_docker_stdout
            detail:
              Stdout: true
              Stderr: true
              IncludeEnv:
                collect_crd_index_out: true

apply之後發現CRD已經創建成功,但是logstore沒有創建出來。

通過限制Project、Logstore和採集配置名的條件

打開異常事件詳情列表,可以清楚看到創建logstore步驟的異常情況,錯誤碼是ProjectQuotaExceed,報錯詳情是:project k8s-log-c4551a67027d248bfb049765de783e647, shard count quota exceed。由此,可以直接找到SLS值班的同學,提升quota,從而解決這個問題

場景2: 通過CRD配置,關鍵參數填寫錯誤

一個CRD配置如下:

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  name: simple-index-crd-example-0909-mock-4
spec:
  logstore: logstore-quota-test-0909-mock-4
  logtailConfig:
    inputType: pluginss
    configName: simple-index-crd-example-0909-mock-4
    inputDetail:
      plugin:
        inputs:
          -
            type: service_docker_stdout
            detail:
              Stdout: true
              Stderr: true
              IncludeEnv:
                collect_crd_index_out: true

apply之後發現CRD已經創建成功,但是logstore和採集配置也都是沒有創建出來。

通過限制Project、Logstore和採集配置名的條件

打開異常事件詳情列表,可以清楚看到創建採集配置步驟的異常情況,錯誤信息裏提示:invalid input type : pluginss

由此可以知道原來是CRD裏inputType字段的取值有問題,通過採集配置事件詳情列表裏的記錄,也可以清楚看到通過CRD轉換之後的採集配置數據。

場景3: 通過環境變量和CRD方式針對同一個Project/Logstore採集配置進行變更,導致的配置衝突

在多人維護一個K8s集羣的時候,有可能兩個人針對同一份採集配置,通過不同的配置方式進行了修改,這樣的問題排查起來往往很麻煩。

我們模擬這樣一個場景:

  1. 部署一個測試的Pod,環境變量配置如下:

可以看到logstore和採集配置已經創建成功

  1. CRD配置如下:
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  name: taiye-test-0707
spec:
  logstore: taiye-test-0707
  logtailConfig:
    inputType: plugin
    configName: taiye-test-0707
    inputDetail:
      plugin:
        inputs:
          -
            type: service_docker_stdout
            detail:
              Stdout: true
              Stderr: true
              IncludeEnv:
                conflict-test: true

apply之後發現CRD已經創建成功,採集配置也被覆蓋掉了。

通過Logtail事件大盤裏的事件時間軸,我們可以清楚的看到兩次配置變更操作,一次是通過Logtail產生的,一次是通過alibaba-log-controller產生的。

通過事件詳情,我們也可以看到兩次變更的配置參數是不一樣的,有了這樣的監控數據,能夠知道什麼時間的配置變更導致了衝突。

通過命令行查看實時事件

K8s event在K8s中默認只保留一小時,在進行命令行操作的時候,可以通過kubectl命令直接查看實時的事件

kubectl get event -A

這樣可以得到當前集羣中實時的事件列表,如果想查看事件的詳細信息,可以使用如下命令,輸出json格式的事件,裏面包含了詳細的信息

kubectl get events -o json


關於iLogtail

iLogtail作爲阿里雲SLS提供的可觀測數據採集器,可以運行在服務器、容器、K8s、嵌入式等多種環境,支持採集數百種可觀測數據(日誌、監控、Trace、事件等),已經有千萬級的安裝量。目前,iLogtail已正式開源,歡迎使用及參與共建。

GitHub:https://github.com/alibaba/ilogtail

社區版文檔:https://ilogtail.gitbook.io/ilogtail-docs/about/readme

企業版官網:https://help.aliyun.com/document_detail/65018.html

嗶哩嗶哩:阿里雲SLS

知乎:阿里雲日誌服務

 原文鏈接:https://click.aliyun.com/m/1000364088/
 
本文爲阿里雲原創內容,未經允許不得轉載。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章