本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.27:使用 Kubelet API 查詢節點日誌
Kubernetes 1.27 引入了一個名為節點日誌查詢的新功能,允許檢視節點上執行的服務日誌。
它解決了什麼問題?
叢集管理員在偵錯節點上故障服務時會遇到問題。他們通常必須 SSH 或 RDP 進入節點,以檢視服務的日誌來偵錯問題。節點日誌查詢功能透過允許叢集管理員使用 kubectl 檢視日誌來協助解決此情境。這對於 Windows 節點尤其有用,在 Windows 節點中,您會遇到節點進入就緒狀態,但由於 CNI 錯誤配置和其他問題導致容器未啟動的問題,而這些問題透過查看 Pod 狀態不容易識別。
它是如何運作的?
kubelet 已經有一個 /var/log/ 檢視器,可透過節點代理端點存取。此功能使用一個墊片補充此端點,該墊片在 Linux 節點上 shell 輸出到 journalctl
,在 Windows 節點上 shell 輸出到 Get-WinEvent
cmdlet。然後,它使用命令提供的現有篩選器來允許篩選日誌。kubelet 也使用啟發式方法來檢索日誌。如果使用者不知道給定的系統服務是否記錄到檔案或原生系統記錄器,則啟發式方法首先檢查原生作業系統記錄器,如果不可用,則嘗試從 /var/log/<servicename>
或 /var/log/<servicename>.log
或 /var/log/<servicename>/<servicename>.log
檢索第一個日誌。
在 Linux 上,我們假設服務日誌可透過 journald 取得,並且已安裝 journalctl
。在 Windows 上,我們假設服務日誌可在應用程式日誌提供者中取得。另請注意,僅當您獲得授權時,才能擷取節點日誌(在 RBAC 中,這是對 nodes/proxy
的 get 和 create 存取權)。您擷取節點日誌所需的權限也允許權限提升攻擊,因此請小心管理它們。
我該如何使用它?
若要使用此功能,請確保為該節點啟用 NodeLogQuery
功能閘道,並將 kubelet 組態選項 enableSystemLogHandler
和 enableSystemLogQuery
都設定為 true。然後,您可以從所有節點或僅子集查詢日誌。以下是從節點檢索 kubelet 服務日誌的範例
# Fetch kubelet logs from a node named node-1.example
kubectl get --raw "/api/v1/nodes/node-1.example/proxy/logs/?query=kubelet"
您可以進一步篩選查詢以縮小結果範圍
# Fetch kubelet logs from a node named node-1.example that have the word "error"
kubectl get --raw "/api/v1/nodes/node-1.example/proxy/logs/?query=kubelet&pattern=error"
您也可以從 Linux 節點上的 /var/log/
擷取檔案
kubectl get --raw "/api/v1/nodes/<insert-node-name-here>/proxy/logs/?query=/<insert-log-file-name-here>"
您可以閱讀文件以了解所有可用的選項。
我該如何提供協助?
請使用此功能並提供意見反應,方法是開啟 GitHub issue 或透過 Kubernetes Slack 上的 #sig-windows 頻道或 SIG Windows 郵件列表 與我們聯繫。