本文檔主要介紹如何使用eventer將Kubernetes中的事件采集到日志服務。
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事件離線工具,可以將集群的事件離線到釘釘、SLS、EventBridge等系統,并提供不同等級的過濾條件,實現事件的實時采集、定向告警、異步歸檔。更多信息,請參見kube-eventer。
NPD(node-problem-detector)是Kubernetes節點診斷的工具,可以將節點的異常,例如Docker Engine Hang、Linux Kernel Hang、網絡出網異常、文件描述符異常轉換為Node的事件,結合kube-eventer可以實現節點事件告警的閉環。更多信息,請參見NPD。
kube-eventer是ACK維護的開源Kubernetes事件離線工具,可以將集群的事件離線到釘釘、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存儲費用(計費項為存儲空間-日志存儲),每天費用約0.1元。關于存儲空間-日志存儲計費項的更多信息,請參見按使用功能計費模式計費項。
步驟一:部署kube-eventer和node-problem-detector
阿里云Kubernetes
如果是ACK集群,則對應阿里云Kubernetes組件中的ack-node-problem-detector組件已集成eventer和node-problem-detector功能,您只需要部署該組件。更多信息,請參見事件監控。如果是ACK Serverless集群,您需要部署kube-eventer組件。
NPD根據配置與第三方插件檢測節點的問題或故障、生成相應的集群事件。而Kubernetes集群自身也會因為集群狀態的切換產生各種事件,例如Pod驅逐、鏡像拉取失敗等異常情況。日志服務SLS(Log Service)的Kubernetes事件中心實時匯聚Kubernetes中的所有事件并提供存儲、查詢、分析、可視化、告警等能力。將集群事件接入日志服務的Kubernetes事件中心操作步驟如下。
其他Kubernetes
部署eventer。
安裝kubectl工具。具體操作,請參見通過kubectl連接Kubernetes集群。
使用以下樣例創建名為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®ionId={region-id}&internal=false&accessKeyId={accessKeyId}&accessKeySecret={accessKeySecret} - --sink=sls:https://cn-beijing.log.aliyuncs.com?project=k8s-xxxx&logStore=k8s-event®ionId=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
必選
日志服務的Endpoint。更多信息,請參見服務入口。
project
string
必選
日志服務的Project。
logStore
string
必選
日志服務的Logstore。
internal
string
自建Kubernetes:必選。
自建Kubernetes必須設置為false。
regionId
string
自建Kubernetes:必選。
日志服務所在地域ID。更多信息,請參見服務入口。
accessKeyId
string
自建Kubernetes:必選。
AccessKey ID,建議使用RAM用戶的AccessKey信息。更多信息,請參見訪問密鑰。
accessKeySecret
string
自建Kubernetes:必選。
AccessKey Secret,建議使用RAM用戶的AccessKey信息。更多信息,請參見訪問密鑰。
執行以下命令,將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
部署node-problem-detector。
具體操作,請參見Github。
步驟二:創建K8s事件中心實例
創建K8s事件中心后,日志服務自動在目標Project中生成一個名為k8s-event
的Logstore,并生成相關聯的儀表盤等。
登錄日志服務控制臺。
在日志應用區域的智能運維頁簽中,單擊K8s事件中心。
在事件中心管理頁面,單擊頁面右上角的添加。
在創建事件中心面板,配置相關參數,然后單擊下一步。
如果選擇已有Project,則從Project下拉框中選擇已創建的Project,用于管理K8s事件中心相關資源(Logstore、儀表盤等)。
如果選擇從容器服務選擇K8s集群,則從K8s集群下拉框中選擇已創建的K8s集群。通過此方式創建K8s事件中心,日志服務默認創建一個名為
k8s-log-{cluster-id}
的Project,用于管理K8s事件中心相關資源(Logstore、儀表盤等)。
步驟三:使用K8s事件中心實例
創建K8s事件中心并部署eventer和NPD后,即可在K8s事件中心查看事件總覽、查詢事件詳情、查看Pod生命周期、查看節點事件、查看核心組件事件、設置告警、自定義查詢和更新版本等。
在K8s事件中心頁面,找到目標K8s事件中心實例,單擊圖標,可進行如下操作。
操作 | 說明 |
查看事件總覽 | 事件總覽頁面用于展示核心事件的匯總統計信息。例如事件總數、今天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名稱。
|
更新版本 | 在版本更新頁面,您可以升級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集群,請參考如下步驟。
登錄容器服務控制臺。
在集群頁面中,單擊目標集群。
在左側導航欄中,選擇
。在Helm頁面中,單擊ack-node-problem-detector后的更新。
檢查并修改參數配置。更多信息,請參見步驟一:部署eventer和node-problem-detector。
如果您使用的是自建Kubernetes集群,參數配置請參見采集Kubernetes事件。
如何查看事件對應容器的日志?
如果您使用的是阿里云Kubernetes集群,請參考如下步驟。
登錄容器服務控制臺。
在集群頁面中,單擊目標集群。
在左側導航欄中,選擇
。將命名空間選擇為kube-system。
在容器組列表中,單擊目標容器組對應的日志。
如果您使用的是自建Kubernetes集群,請查看namespace為kube-system下文件名前綴為eventer-sls的Pod日志。