Inspektor Gadget:云原生時代下的 eBPF 工具鏈框架
一、何為 Inspektor Gadget ?
Inspektor Gadget 是一款功能強大的工具集,用于調試和檢查 Kubernetes 資源和應用程序。同時,它提供了一系列工具和小工具,用于管理 Kubernetes Cluster 中的 eBPF 程序的打包、部署和執行。這些 eBPF 程序包括許多基于 BCC 工具的程序,以及專門為 Inspektor Gadget 開發的一些程序。
Inspektor Gadget 的設計目標是簡化 Kubernetes Cluster 的調試和故障排除過程。通過自動將低級內核原語映射到高級 Kubernetes 資源,提供了更直觀、更快速的方式來查找相關信息。基于此,開發人員和運維人員可以更輕松地監視和分析 Kubernetes Cluster 中的應用程序行為。
使用 Inspektor Gadget,我們可以執行各種任務,例如,跟蹤應用程序的系統調用、監視網絡流量、分析容器之間的通信和資源利用情況等。通過與 eBPF 技術的結合,Inspektor Gadget 提供了更深入的洞察力,從而幫助我們更好地理解和解決 Kubernete s環境中的問題。
二、Inspektor Gadget 運行機制
Inspektor Gadget 通常在 Kubernetes Cluster 中作為 DaemonSet 模式部署到每個節點。利用內核的 eBPF(extended Berkeley Packet Filter)輔助程序來監控與每個 Pod 中的用戶空間程序相關的系統調用事件。通過在每個節點上部署 eBPF程序,Inspektor Gadget 能夠捕獲和收集與應用程序行為密切相關的系統調用日志數據。
具體而言,Inspektor Gadget 的 eBPF 程序在內核中運行,并通過監視系統調用事件來收集相關的日志數據。這些事件可以涉及文件訪問、網絡通信、進程管理等與應用程序行為有關的操作。eBPF 程序將這些日志數據存儲在內核的環形緩沖區中。
Inspektor Gadget 的用戶空間實用程序負責從內核的環形緩沖區中獲取這些日志數據,并將其顯示給用戶。從而使得開發人員和運維人員能夠查看和分析與每個 Pod 中用戶空間程序相關的系統調用的詳細信息,以幫助他們識別潛在的問題、調試應用程序和進行性能優化。
我們來看一下整個拓撲架構設計,具體如下所示:
基于上述拓撲架構,整個處理機制主要涉及如下:
1、Inspektor Gadget 的 eBPF 程序在運行時收集的事件會被寫入一個專門的內核緩沖區。這個緩沖區是為了有效地存儲和管理大量的事件數據。而I nspektor Gadget 的用戶空間組件負責從這個緩沖區中讀取事件,并將其發布到一個稱為 “Stream” 的通道中。
2、Stream 是 Inspektor Gadget 的用戶空間組件使用的一種數據流機制。它允許事件數據以實時或近乎實時的方式進行傳輸和處理。通過將事件發布到 Stream 中,Inspektor Gadget 提供了一種方便的方式來傳遞和處理從 eBPF 程序收集的事件數據。
3、為了展現這些事件數據,Inspektor Gadget 使用了內部的 kubectl exec API 接口。kubectl exec 是 Kubernetes 的一個命令行工具,用于在容器中執行命令。Inspektor Gadget 利用這個 API 接口來與容器中運行的用戶空間組件進行通信,并從 Stream 中獲取事件數據。
4、一旦獲取到事件數據,Inspektor Gadget 的用戶空間組件可以進行各種操作,比如實時顯示事件日志、進行分析或將事件數據發送到其他監控系統。這種集成了 kubectl exec API 接口的方式使得 Inspektor Gadget 的用戶界面更加靈活和可擴展。
針對 Gadget Tracer Manager,作為一個負責管理正在運行的小工具和容器列表的組件,維護了一個記錄當前活動的小工具和容器的清單。每個正在運行的小工具都與一個 eBPF 映射相關聯,該映射中存儲了要跟蹤的容器的掛載命名空間標識符。這些標識符是根據傳遞給小工具的命名空間、標簽、Pod名稱等參數進行填充的。
為了了解當前正在運行的容器,Gadget Tracer Manager 利用 runc-fanotify 技術。監視容器運行時的文件系統活動。通過與 runc-fanotify 集成,Gadget Tracer Manager 能夠獲取有關當前正在運行的容器的信息。
基于上述的這些信息,Gadget Tracer Manager 可以動態地添加或刪除容器到其集合中。這意味著當容器啟動或停止時,Gadget Tracer Manager 能夠相應地更新其管理的容器列表。這種動態管理的能力使得 Gadget Tracer Manager 能夠實時地跟蹤和監控容器的行為。
基于上述的拓撲架構以及鏈路請求,我們可以窺探到,對于 Inspektor Gadget 而言,主要分為四個核心任務,每個任務都由以下包管理:
1、Tracers
基于整個架構角度,Inspektor Gadget 的 Tracers 主要負責從主機收集各種與應用程序行為和系統操作相關的事件的組件,利用 eBPF 技術攔截和記錄進程創建、文件訪問等事件,并將其保存到日志系統中,以供后續分析和檢查。基于對事件的收集和記錄能力為應用程序的調試和優化提供了有價值的數據來源。
2、Container-Collection
Container-Collection 組件通過追蹤主機中容器的創建和刪除操作,利用容器信息來豐富事件的上下文。通過將容器的元數據與事件相關聯,Inspektor Gadget 能夠提供更豐富和準確的事件分析和診斷功能。基于對容器信息的加工、利用從而使得事件數據更具有可操作性和可理解性。
3、Trace-Collection
而對于 Inspektor Gadget 的 Trace-Collection 組件而言,其主要利用 Container-Collection 提供的容器信息,實現了按容器的過濾和篩選功能。從而使得用戶可以根據容器的標識符或其他屬性,對事件進行個性化的分析和監控。基于容器過濾的能力,增強了 Inspektor Gadget 的靈活性和可定制性。
4、 Columns
Columns 組件則主要用于創建跟蹤器生成的事件的列表表示。通過解析和格式化事件記錄,并以清晰的列形式呈現,使用戶能夠方便地瀏覽、分析和比較事件的屬性值。這種列表視圖提供了高效的事件導航和分析功能,提升了事件數據的可讀性和可操作性。
三、Inspektor Gadget 運行要求
內核層面:
Inspektor Gadget 使用 eBPF 來提供其功能,并根據不同的內核版本和內核配置啟用不同的 eBPF 功能。Inspektor Gadget 依賴于一種編譯-導出運行(CO-RE)方法,并需要 BTF(BPF Type Format)信息來實現。BTF 信息可以從多個來源收集,如果一個來源不可用,它會嘗試另一個來源。
以下是關于每個來源的更詳細說明:
1、內核 BTF:內核編譯時如果啟用了CONFIG_DEBUG_INFO_BTF 選項,它會在 /sys/kernel/btf/vmlinux 路徑下公開 BTF 信息。
2、小工具容器鏡像:Inspektor Gadget 使用 BTFGen 生成一些已知內核版本的 BTF 信息,并將其包含在小工具的容器映像中。
3、BTFHub 下載:如果以上兩個來源都不可用,nspektor Gadget 會嘗試從 BTFHub下載 BTF 信息。
如果內核不支持 CO-RE,建議大家使用舊版本的 Inspektor Gadget(例如 v0.21.0-bcc ),該版本提供基于 BCC(BPF Compiler Collection)的工具。
需要注意的是,所有小工具在運行時都需要滿足以下條件才能正常工作:
1、CONFIG_BPF=y:內核配置選項,需要確保 BPF(Berkeley Packet Filter)功能已啟用。BPF 是一種靈活的內核技術,允許在內核中執行特定的程序來過濾和操作數據包、系統調用等。
2、CONFIG_BPF_SYSCALL=y:內核配置選項,需要確保 BPF 系統調用支持已啟用。BPF 系統調用是用戶空間程序與內核BPF程序之間進行交互的接口,允許用戶空間程序加載和執行 BPF 程序。
3、CONFIG_DEBUG_INFO_BTF=y:這是與 BTF(BPF Type Format)相關的內核配置選項。BTF 是一種調試信息格式,用于描述內核中的數據結構和類型。如果主機內核的 BTF 信息不受 BTFHub 支持(即“無法從 BTFHub 下載”),則需要啟用此選項以確保小工具能夠訪問所需的 BTF 信息。
Kubernetes 平臺層面:
Kubernetes 平臺 | 支持 |
Minikube | √ |
AKS、EKS、GKS | √ |
OpenShift | √ |
AWS Fargate、Azure Containers instances、GKE Autopilot.etc | / |
容器運行時層面:
編排類型 | 容器管理 | 容器運行時 | 支持 |
Docker | containerd | runc | √ |
Nerdctl | containerd | runc | √ |
Kubernetes | containerd | runc | √ |
Kubernetes | containerd | wasm | / |
Kubernetes | containerd | katacontainers | / |
Kubernetes | CRI-O | runc / crun | Kubernetes v1.20+ |
Podman(root) | Podman | runc / crun | √ |
Podman(rootless) | Podman | runc / crun | Only with Podman API enabled |
針對 Inspektor Gadget 的安裝配置,相對來說較為簡單,大家若有興趣,可查閱官方相關文檔。