事件監控是Kubernetes中的一種監控方式,可以彌補資源監控在即時性、準確性和情境上的不足。可使用NPD(node-problem-detector)結合SLS的Kubernetes事件中心進行監控。配置NPD叢集檢查項和例外狀況事件離線功能,使用DingTalk和EventBridge進行通知和處理。
工作原理
Kubernetes的架構設計基於狀態機器,不同的狀態之間進行轉換會產生相應的事件,正常的狀態之間轉換會產生Normal等級的事件,正常狀態與異常狀態之間的轉換會產生Warning等級的事件。
ACK提供開箱即用的容器情境事件監控方案,通過ACK維護的NPD以及包含在NPD中的kube-eventer提供容器事件監控能力。
NPD(node-problem-detector)是Kubernetes節點診斷的工具,可以將節點的異常(例如Docker Engine Hang、Linux Kernel Hang、網路出網異常、檔案描述符異常等)轉換為節點的事件,結合kube-eventer可以實現節時間點事件警示的閉環。更多資訊,請參見NPD。
kube-eventer是ACK維護的開源Kubernetes事件離線工具,可以將叢集的事件推送至DingTalk、SLS、EventBridge等系統,並提供不同等級的過濾條件,實現事件的即時採集、定向警示、非同步歸檔。更多資訊,請參見kube-eventer。
計費說明
ACK事件監控功能預設上報叢集事件至SLSLog Service,SLSLog Service提供事件數目據的儲存、分析能力,預設90天內的ACK叢集事件數目據免費。詳細資料,請參見建立並使用K8s事件中心。
情境一:使用NPD結合SLS的Kubernetes事件中心監控叢集事件
NPD根據配置與第三方外掛程式檢測節點的問題或故障並產生相應的叢集事件。而Kubernetes叢集自身也會因為叢集狀態的切換產生各種事件,例如Pod驅逐、鏡像拉取失敗等異常情況。Log ServiceSLS(Log Service)的Kubernetes事件中心即時匯聚Kubernetes中的所有事件並提供儲存、查詢、分析、可視化、警示等能力。將叢集事件接入Log Service的Kubernetes事件中心操作步驟如下:
步驟一:安裝ack-node-problem-detector組件
如果在建立叢集時,已選中安裝node-problem-detector並建立事件中心,可直接按照步驟二查看Kubernetes事件中心。關於如何通過建立叢集時安裝NPD組件,請參見建立ACK託管叢集。
若建立叢集時未選中安裝node-problem-detector並建立事件中心,則需手動安裝,具體的操作步驟如下。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在日誌與監控頁簽,尋找並安裝ack-node-problem-detector。
步驟二:查看事件中心
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在事件中心頁面,單擊事件總覽(事件中心)頁簽,查看Kubernetes事件中心相關資訊。
可查看Kubernetes事件的總覽及詳情、Pod生命週期。更多資訊,請參見採集Kubernetes事件。
情境二:配置NPD叢集檢查項以及例外狀況事件離線功能
NPD結合kube-eventer可以實現節時間點事件警示的閉環。具體的操作流程如下:
操作流程
安裝ack-node-problem-detector組件,安裝過程請參見安裝ack-node-problem-detector組件。
說明若之前已安裝過ack-node-problem-detector組件,請刪除重新安裝,具體操作請參見常見問題。
在守護進程集頁面,選擇命名空間為kube-system,查看組件ack-node-problem-detector-daemonset是否運行正常。
當node-problem-detector與kube-eventer都正常運行後,可以通過配置的kube-eventer的離線通道進行資料的離線處理或者警示。
NPD支援的問題檢查外掛程式
外掛程式名 | 功能 | 說明 |
fd_check | 檢查叢集節點系統的已開啟的檔案描述符是否超過最大上限的80%。 | 80%為預設值,可通過參數修改。該檢查項消耗資源較多,不建議開啟。 |
ram_role_check | 檢查叢集節點是否具有RAM Role以及相應的鑒權密鑰。 | 無 |
ntp_check | 檢查叢集節點上的NTP時間同步服務是否正常運行。 | 預設開啟項。 |
nvidia_gpu_check | 檢查叢集節點上的NVIDIA GPU計算卡是否出現XID錯誤。 | 無 |
network_problem_check | 檢查叢集節點上的 | 預設開啟項。 |
inodes_usage_check | 檢查叢集節點系統硬碟的 | 80%為預設值,可通過參數修改。預設開啟項。 |
csi_hang_check | 檢查叢集節點上的CSI儲存外掛程式狀態是否正常。 | 無 |
ps_hang_check | 檢查叢集節點系統中是否有狀態為D(掛起且無法喚醒)的進程。 | 無 |
public_network_check | 檢查叢集節點是否可以訪問公網。 | 無 |
irqbalance_check | 檢查叢集節點系統中的irqbalance服務是否正常。 | 無 |
pid_pressure_check | 檢查叢集節點系統中的進程 | 預設開啟項。 |
docker_offline_check | 檢測叢集節點上的Docker Daemon服務是否正常。 | 預設開啟項。 |
情境三:使用DingTalk機器人實現Kubernetes監控警示
使用DingTalk機器人監控並警示Kubernetes的事件是一個非常典型的ChatOps實現。具體的操作步驟如下。
配置DingTalk機器人
單擊DingTalk群右上方的
表徵圖,進入群設定頁面。單擊機器人,然後單擊添加機器人,選擇需要添加的機器人。此處選擇自訂機器人。

在機器人詳情頁面,單擊添加,進入添加機器人頁面。

根據以下資訊配置群機器人後,閱讀並同意服務及免責條款,然後單擊完成。
參數
說明
編輯頭像
(可選)為群機器人設定頭像。
機器人名字
添加的機器人名稱。
添加到群組
添加機器人的群組。
安全設定
安全設定支援3種方式:自訂關鍵詞、加簽和IP地址(段)。
目前叢集的事件監控僅支援第一種方式,即自訂關鍵詞。
選中自訂關鍵詞,填入
Warning可接收所有監控警示。如果發現機器人訊息發送過於頻繁,可增加關鍵詞進行過濾,最多支援設定10個關鍵詞。ACK發送訊息時也會同步此關鍵詞。單擊複製,複製webhook地址以備後續使用。
說明在群機器人頁面,選擇目標群機器人,單擊右側
表徵圖可以進行以下操作:修改群機器人的頭像及機器人名稱。
開啟或關閉訊息推送。
重設webhook地址。
刪除群機器人。
安裝ack-node-problem-detector組件,安裝過程請參見安裝ack-node-problem-detector組件。
說明若之前已安裝過ack-node-problem-detector組件,請刪除重新安裝,具體操作請參見常見問題。
更新ack-node-problem-detector組件的配置。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Helm頁面,找到ack-node-problem-detector組件,然後在組件對應的操作列單擊更新,修改以下內容,然後單擊確定。
將
npd下方的enabled設定為false。將
eventer.sinks.dingtalk.enabled設定為true。通過上面步驟webhook地址查看Token,填入Token欄位。
預期結果:
部署成功後30秒,kube-eventer生效,當事件等級超過閾值等級時,即可在DingTalk群收到如下警示。
情境四:使用SLS離線Kubernetes事件
阿里雲Log ServiceSLS(Log Service)可以將Kubernetes的事件以更持久的方式進行儲存,從而提供更多的事件歸檔、審計的能力。詳情請參見建立並使用K8s事件中心。
建立Project與Logstore。
在Project列表地區,單擊建立Project,填寫Project的基本資料並單擊建立完成。
本樣本建立一個名為k8s-log4j的Project,與Kubernetes叢集位於同一地區(華東1)。
說明為降低成本並提高效率,通常建議將Log Service與Kubernetes叢集配置在同一地區。這樣可以使日誌資料通過內網進行傳輸,避免因地區不一致產生的外網資料轉送費用,並減少傳輸延遲,實現日誌的即時採集和快速查詢。
建立完成後,k8s-log4j出現在Project列表下,單擊該Project名稱,進入Project詳情頁面。
預設進入日誌庫頁面,在頁面左側,單擊加號+,彈出建立Logstore對話方塊。
填寫日誌庫配置資訊並單擊確定。
本樣本建立名為k8s-logstore的日誌庫。

建立完畢後,頁面會提示使用資料接入嚮導。單擊資料接入嚮導,彈出接入資料對話方塊。
選擇Log4j 1/2,根據頁面引導進行配置。
本樣本使用了預設配置,可根據日誌資料的具體使用情境,進行相應的配置。

在Kubernetes叢集中配置log4j。
安裝ack-node-problem-detector組件,安裝過程請參見安裝ack-node-problem-detector組件。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Helm頁面,找到ack-node-problem-detector組件,然後在組件對應的操作列單擊更新,修改以下內容,然後單擊確定。
將
npd下方的enabled設定為false。將
eventer.sinks.sls.enabled設定為true。
操作叢集(例如,刪除Pod或者建立應用等)產生事件後,登入Log Service控制台查看資料擷取。請參見通過API消費。

設定索引與歸檔。請參見建立索引。
在Log Service控制台Project列表地區,單擊Project名稱。
單擊日誌庫名稱後的
表徵圖,選擇查詢分析。單擊右上方的開啟索引。
在查詢分析對話方塊中配置索引,然後單擊確定。
此時會出現日誌查詢與分析頁面。
說明索引配置在1分鐘之內生效。
開啟或修改索引後,新的索引配置只對新寫入的資料生效。
(可選)在需要設定離線歸檔與計算的情境下,在Logstore上將資料投遞給MaxCompute或者OSS,請參見建立MaxCompute投遞任務(新版)、建立OSS投遞任務(新版)。
情境五:使用EventBridge離線Kubernetes事件
事件匯流排EventBridge是阿里雲提供的一款無伺服器事件匯流排服務,支援阿里雲服務、自訂應用及SaaS應用以標準化、中心化的方式接入,Container Service事件可投遞至EventBridge實現構建松耦合、分布式的事件驅動架構。關於EventBridge的詳情,請參見什麼是事件匯流排EventBridge。
開通事件匯流排EventBridge。具體操作,請參見開通事件匯流排EventBridge並授權。
安裝ack-node-problem-detector組件,安裝過程請參見安裝ack-node-problem-detector組件。
說明若之前已安裝過ack-node-problem-detector組件,請刪除重新安裝,具體操作請參見常見問題。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Helm頁面,定位ack-node-problem-detector組件,然後在組件對應的操作列單擊更新,將
eventer.sinks.eventbridge.enabled修改為true,以配置事件中心並開啟EventBridge事件離線資料鏈路,然後單擊確定。
資料鏈路開啟成功後,在事件匯流排EventBridge控制台查看容器事件。
在左側導覽列,單擊事件匯流排。
在事件匯流排頁面,單擊目標匯流排名稱。
在左側導覽列,單擊事件追蹤。
選擇事件查詢方式,設定查詢條件,單擊查詢。
在事件列表操作列,單擊事件詳情,查看事件詳細內容。
更多資訊,請參見查詢事件。
許可權依賴及風險評估
阿里雲Container Serviceack-node-problem-detector組件以DaemonSet形式部署,會在每個節點上運行Pod。
需要在Pod中使用如下許可權才能正常觀測節點的異常狀態,請在安裝前評估安全風險:
許可權名稱 | 說明 | 必要性原因 |
hostNetworkSet | 容器使用宿主機網路命名空間 | 需檢測節點本網是否正常。 |
hostPIDSet | 容器共用宿主機處理序命名空間 | 需遍曆宿主機所有進程,檢測殭屍進程、資源佔用異常或關鍵系統進程崩潰。 |
notReadOnlyRootFileSystem | 容器根檔案系統非唯讀 | 需寫入臨時日誌、緩衝診斷資料或動態組建組態檔案,以記錄如NVIDIA XID異常的狀態。 |
runAsPrivileged | 以特權模式運行 | 需訪問掛載系統介面。 例如,在需要檢測GPU等裝置的情境下,需要掛載/dev目錄。 |
runAsRootAllowed | 允許以 root 使用者運行 | 需讀取僅 root 可訪問的系統檔案(如 相關日誌)。 |
seccompDisabled | 禁用 Seccomp 安全過濾 | 需執行一些運行時預設syscall白名單外系統調用,以監控節點系統健康狀態。 |
sensitiveHostPathMount | 掛載敏感宿主機路徑 | 需掛載關鍵目錄(如: |
常見問題
如何重新安裝ack-node-problem-detector組件?
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在任務頁面,單擊kube-eventer-init-v1.7-xxxx右側更多,單擊刪除。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Helm頁面,刪除原有的ack-node-problem-detector組件。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在日誌與監控頁簽,尋找並重新安裝ack-node-problem-detector。