全部產品
Search
文件中心

Simple Log Service:建立並使用K8s事件中心

更新時間:Aug 27, 2024

K8s事件包括叢集的狀態變更,例如建立Pod、運行Pod、刪除Pod、組件異常。K8s事件中心即時收集Kubernetes叢集中的所有事件並提供儲存、查詢、分析、可視化、警示等能力。本文介紹建立及使用K8s事件中心的操作步驟。

背景資訊

Kubernetes的架構設計基於狀態機器,不同的狀態之間進行轉換則會產生相應的事件,正常的狀態之間轉換會產生Normal等級的事件,正常狀態與異常狀態之間的轉換會產生Warning等級的事件。

ACK提供開箱即用的容器情境事件監控方案,通過ACK維護的NPD以及包含在NPD中的kube-eventer提供容器事件監控能力。

  • NPD(node-problem-detector)是Kubernetes節點診斷的工具,可以將節點的異常,例如Docker Engine Hang、Linux Kernel Hang、網路出網異常、檔案描述符異常轉換為Node的事件,結合kube-eventer可以實現節時間點事件警示的閉環。更多資訊,請參見NPD

  • kube-eventer是ACK維護的開源Kubernetes事件離線工具,可以將叢集的事件離線到DingTalk、SLS、EventBridge等系統,並提供不同等級的過濾條件,實現事件的即時採集、定向警示、非同步歸檔。更多資訊,請參見kube-eventer

前提條件

已建立Kubernetes叢集(例如阿里雲ACK叢集、ACK Serverless叢集等)。

計費說明

K8s事件中心具備如下條件時,免費使用。

  • K8s事件中心關聯的Logstore的儲存時間為90天(預設90天)。

  • 每天寫入K8s事件中心的資料量少於256 MB(大約25萬條事件)。

例如:

  • 不調整儲存時間(預設90天),且K8s叢集每天產生1000條事件,則K8s事件中心免費使用。

  • 調整儲存時間為105天,且K8s叢集每天產生1000條事件,則超過90天后,K8s事件中心會產生Logstore儲存費用(計費項目為儲存空間-日誌儲存)。關於儲存空間-日誌儲存計費項目的更多資訊,請參見按使用功能計費模式計費項目

步驟一:部署kube-eventer和node-problem-detector

阿里雲Kubernetes

如果是ACK叢集,則對應阿里雲Kubernetes組件中的ack-node-problem-detector組件已整合eventer和node-problem-detector功能,您只需要部署該組件。更多資訊,請參見事件監控。如果是ACK Serverless叢集,您需要部署kube-eventer組件。

NPD根據配置與第三方外掛程式檢測節點的問題或故障、產生相應的叢集事件。而Kubernetes叢集自身也會因為叢集狀態的切換產生各種事件,例如Pod驅逐、鏡像拉取失敗等異常情況。Log ServiceSLS(Log Service)的Kubernetes事件中心即時匯聚Kubernetes中的所有事件並提供儲存、查詢、分析、可視化、警示等能力。將叢集事件接入Log Service的Kubernetes事件中心操作步驟如下。

  • 如果您在建立叢集時,已選中安裝node-problem-detector並建立事件中心,可直接按照步驟二查看Kubernetes事件中心。關於如何通過建立叢集時安裝NPD組件,請參見建立ACK託管叢集

  • 若建立叢集時未選中安裝node-problem-detector並建立事件中心,則需手動安裝,具體的操作步驟如下。

    1. 登入Container Service管理主控台

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理

    3. 日誌與監控頁簽,尋找並安裝ack-node-problem-detector

其他Kubernetes

  1. 部署eventer。

    1. 安裝kubectl工具。具體操作,請參見通過kubectl串連Kubernetes叢集

    2. 使用以下範例建立名為eventer.yaml的設定檔。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          name: kube-eventer
        name: kube-eventer
        namespace: kube-system
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: kube-eventer
        template:
          metadata:
            labels:
              app: kube-eventer
            annotations:
              scheduler.alpha.kubernetes.io/critical-pod: ''
          spec:
            dnsPolicy: ClusterFirstWithHostNet
            serviceAccount: kube-eventer
            containers:
              - image: registry.cn-hangzhou.aliyuncs.com/acs/kube-eventer:v1.2.5-cc7ec54-aliyun
                name: kube-eventer
                command:
                  - "/kube-eventer"
                  - "--source=kubernetes:https://kubernetes.default"
                  ## .send to sls
                  ## --sink=sls:https://{endpoint}?project={project}&logStore=k8s-event&regionId={region-id}&internal=false&accessKeyId={accessKeyId}&accessKeySecret={accessKeySecret}
                  - --sink=sls:https://cn-beijing.log.aliyuncs.com?project=k8s-xxxx&logStore=k8s-event&regionId=cn-beijing&internal=false&accessKeyId=xxx&accessKeySecret=xxx
                env:
                  # If TZ is assigned, set the TZ value as the time zone
                  - name: TZ
                    value: "Asia/Shanghai"
                volumeMounts:
                  - name: localtime
                    mountPath: /etc/localtime
                    readOnly: true
                  - name: zoneinfo
                    mountPath: /usr/share/zoneinfo
                    readOnly: true
                resources:
                  requests:
                    cpu: 10m
                    memory: 50Mi
                  limits:
                    cpu: 500m
                    memory: 250Mi
            volumes:
              - name: localtime
                hostPath:
                  path: /etc/localtime
              - name: zoneinfo
                hostPath:
                  path: /usr/share/zoneinfo
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: kube-eventer
      rules:
        - apiGroups:
            - ""
          resources:
            - events
          verbs:
            - get
            - list
            - watch
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: kube-eventer
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: kube-eventer
      subjects:
        - kind: ServiceAccount
          name: kube-eventer
          namespace: kube-system
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: kube-eventer
        namespace: kube-system

      配置項

      類型

      是否必選

      說明

      endpoint

      string

      必選

      Log Service的Endpoint。更多資訊,請參見服務入口

      project

      string

      必選

      Log Service的Project。

      logStore

      string

      必選

      Log Service的Logstore。

      internal

      string

      自建Kubernetes:必選。

      自建Kubernetes必須設定為false。

      regionId

      string

      自建Kubernetes:必選。

      Log Service所在地區ID。更多資訊,請參見服務入口

      accessKeyId

      string

      自建Kubernetes:必選。

      AccessKey ID,建議使用RAM使用者的AccessKey資訊。更多資訊,請參見存取金鑰

      accessKeySecret

      string

      自建Kubernetes:必選。

      AccessKey Secret,建議使用RAM使用者的AccessKey資訊。更多資訊,請參見存取金鑰

    3. 執行以下命令,將eventer.yaml中的配置應用到叢集。

      kubectl apply -f eventer.yaml

      預期輸出:

      deployment.apps/kube-eventer created
      clusterrole.rbac.authorization.k8s.io/kube-eventer created
      clusterrolebinding.rbac.authorization.k8s.io/kube-eventer created
      serviceaccount/kube-eventer created
  2. 部署node-problem-detector。

    具體操作,請參見Github

步驟二:建立K8s事件中心執行個體

說明

建立K8s事件中心後,Log Service自動在目標Project中產生一個名為k8s-event的Logstore,並產生相關聯的儀錶盤等。

  1. 登入Log Service控制台

  2. 日誌應用地區的智能營運頁簽中,單擊K8s事件中心

  3. 事件中心管理頁面,單擊頁面右上方的添加

  4. 建立事件中心面板,配置相關參數,然後單擊下一步

    • 如果選擇已有Project,則從Project下拉框中選擇已建立的Project,用於管理K8s事件中心相關資源(Logstore、儀錶盤等)。

    • 如果選擇從Container Service選擇K8s叢集,則從K8s叢集下拉框中選擇已建立的K8s叢集。通過此方式建立K8s事件中心,Log Service預設建立一個名為k8s-log-{cluster-id}的Project,用於管理K8s事件中心相關資源(Logstore、儀錶盤等)。

步驟三:使用K8s事件中心執行個體

建立K8s事件中心並部署eventer和NPD後,即可在K8s事件中心查看事件總覽、查詢事件詳情、查看Pod生命週期、查看節時間點事件、查看核心組件事件、設定警示、自訂查詢和更新版本等。

K8s事件中心頁面,找到目標K8s事件中心執行個體,單擊k8s事件中心-002表徵圖,可進行如下操作。

image

操作

說明

查看事件總覽

事件總覽頁面用於展示核心事件的匯總統計資訊。例如事件總數、今天Error事件數目與昨天的對比、警示項統計、Error事件趨勢、Pod OOM詳細資料等。

說明

目前Pod OOM資訊不能精確到Pod,只能定位到事件發生的節點、進程名、進程號。您可以通過自訂查詢尋找Pod OOM發生時間點附近的Pod重啟事件,以此定位到具體的Pod。

查詢事件詳情

事件詳情查詢頁面用於展示經過各種維度(事件類型、事件目標、Host、Namespace、Name)過濾後的事件詳細資料。

查看Pod生命週期

Pod生命週期頁面以圖形化方式展示Pod整個生命週期中的事件資訊。您還可以通過事件等級篩選重要的Pod事件。

查看節時間點事件

節時間點事件頁面用於展示節時間點事件詳情。例如Node生命週期、事件列表等。

查看核心組件事件

核心組件事件頁面用於展示核心組件事件詳情。例如ECS重啟失敗、URL模式未執行等。

設定警示

警示配置頁面,您可以為K8s事件中心設定警示。具體操作,請參見設定警示

自訂查詢

自訂查詢頁面,您可以自訂查詢和分析語句。

K8s事件中心的所有事件都儲存在Logstore中,您可以使用Logstore中的所有功能,例如自訂查詢、消費事件、建立自訂報表、建立自訂警示等。更多資訊,請參見查詢和分析日誌

如果您要訪問K8s事件中心所在的Project,可通過以下兩種方式擷取Project名稱。

  • 通過自訂查詢頁面的URL定位到Project。URL規則為https://sls.console.aliyun.com/lognext/app/k8s-event/project/k8s-log-xxxx/logsearch/k8s-event,Project欄位的後一個欄位即為Log ServiceProject名稱,例如k8s-log-xxxx。

  • 事件中心管理頁簽的K8s事件中心列表中,查看目標K8s事件中心執行個體對應的Project名稱。

更新版本

版本更新頁面,您可以升級K8s事件中心的版本。

刪除K8s事件中心執行個體

K8s事件中心 > 事件中心管理頁面,單擊執行個體名稱後操作列的k8s事件中心表徵圖。

日誌範例

採集到的日誌範例如下所示。

hostname:  cn-hangzhou.i-***********"
level:  Normal
pod_id:  2a360760-****
pod_name:  logtail-ds-blkkr
event_id:  {  
   "metadata":{  
      "name":"logtail-ds-blkkr.157b7cc90de7e192",
      "namespace":"kube-system",
      "selfLink":"/api/v1/namespaces/kube-system/events/logtail-ds-blkkr.157b7cc90de7e192",
      "uid":"2aaf75ab-****",
      "resourceVersion":"6129169",
      "creationTimestamp":"2019-01-20T07:08:19Z"
   },
   "involvedObject":{  
      "kind":"Pod",
      "namespace":"kube-system",
      "name":"logtail-ds-blkkr",
      "uid":"2a360760-****",
      "apiVersion":"v1",
      "resourceVersion":"6129161",
      "fieldPath":"spec.containers{logtail}"
   },
   "reason":"Started",
   "message":"Started container",
   "source":{  
      "component":"kubelet",
      "host":"cn-hangzhou.i-***********"
   },
   "firstTimestamp":"2019-01-20T07:08:19Z",
   "lastTimestamp":"2019-01-20T07:08:19Z",
   "count":1,
   "type":"Normal",
   "eventTime":null,
   "reportingComponent":"",
   "reportingInstance":""
}

日誌欄位

資料類型

說明

hostname

String

事件發生所在的主機名稱。

level

String

日誌等級,包括Normal、Warning。

pod_id

String

Pod的唯一標識,僅在該事件類型和Pod相關時才具有此欄位。

pod_name

String

Pod名,僅在該事件類型和Pod相關時才具有此欄位。

event_id

JSON

事件的詳細內容。該欄位為JSON類型的字串。

常見問題

K8s事件中心執行個體無資料

部署好K8s事件中心後,新產生的事件會自動採集到K8s事件中心,您可以在自訂查詢頁面進行搜尋(建議將右上方時間範圍調整到1天)。如果無資料,一般有兩個原因:

  • 部署K8s事件中心後,K8s叢集還未產生事件。

    您可以通過kubectl get events --all-namespaces命令檢查叢集內是否有新事件產生。

  • 部署eventer和node-problem-detector時,參數填寫錯誤。

如何查看事件對應容器的日誌?

  • 如果您使用的是阿里雲Kubernetes叢集,請參考如下步驟。

    1. 登入Container Service控制台

    2. 叢集頁面中,單擊目的地組群。

    3. 在左側導覽列中,選擇工作負載 > 容器組

    4. 命名空間選擇為kube-system

    5. 容器組列表中,單擊目標容器組對應的日誌

  • 如果您使用的是自建Kubernetes叢集,請查看namespace為kube-system下檔案名稱首碼為eventer-sls的Pod日誌。