本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.27:使用 Kubelet API 查詢節點日誌
Kubernetes 1.27 引入了一個名為“節點日誌查詢(Node log query)”的新功能,允許檢視節點上執行的服務的日誌。
它解決了什麼問題?
叢集管理員在除錯節點上執行的故障服務時會遇到問題。他們通常需要透過 SSH 或 RDP 登入到節點,以檢視服務的日誌來除錯問題。“節點日誌查詢”功能透過允許叢集管理員使用 kubectl 檢視日誌,為這種情況提供了幫助。這對於 Windows 節點尤其有用,因為在 Windows 節點上,你可能會遇到節點進入就緒狀態但容器由於 CNI 配置錯誤和其他透過檢視 Pod 狀態不易識別的問題而無法啟動的情況。
它是如何工作的?
Kubelet 已經有一個可透過節點代理端點訪問的 /var/log/ 檢視器。該功能為此端點補充了一個 shim,在 Linux 節點上它會呼叫 journalctl
,在 Windows 節點上則呼叫 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 的郵件列表上與我們聯絡。