我們如何利用eBPF程序監控Kubernetes,你學會了嗎?
對 Kubernetes 集群進行監控對于確保容器化應用程序的健康、性能和可靠性至關重要。Kubernetes 提供了強大的監控工具套件和集成,但是當您需要深入內核和網絡級別的復雜性時,eBPF(擴展的伯克利包過濾器)就成為了無價的資源。在本文中,我們將探索驚人的 eBPF 功能,以及如何利用它提升 Kubernetes 監控策略。
譯自How to Use eBPF Capabilities to Navigate Kubernetes Monitoring。作者 Dev Genius 。
在 Kubernetes 的背景下,eBPF 在諸如容器網絡監控(CNI 插件)、通過基于 eBPF 的網絡策略加強安全性以及進行詳細的性能分析等任務中發揮著關鍵作用。通過深入研究 eBPF 的功能,您可以對 Kubernetes 集群獲得無與倫比的洞察,從而幫助您排查問題、優化性能并微調基礎設施以達到峰值效率。
eBPF是一個強大的技術,它允許在不修改 Linux 內核源代碼的情況下,動態地向 Linux 內核中插入自定義代碼。這些代碼可以用于各種目的,包括網絡分析、跟蹤和在eBPF Kubernetes的背景下的可觀察性。
圖片
Kubernetes 利用 eBPF 進行各種任務,例如容器網絡監控(CNI 插件)、安全性(例如基于 eBPF 的網絡策略)和性能分析。
設置環境和使用 eBPF 監控 Kubernetes
在我們深入研究基于 eBPF 的 Kubernetes 監控之前,讓我們先設置環境。請確保您具備以下前提條件:
- 一個運行中的 Kubernetes 集群
- 安裝了kubectl命令行工具
- Docker 或其他容器運行時
- 基于 Linux 的系統(用于 eBPF 工具)
安裝必需的工具
要開始,我們需要在您的系統上安裝一些與 eBPF 相關的工具。這些工具將幫助您分析和跟蹤內核級事件。
# Install BPF Compiler Collection (BCC)
sudo apt-get install bpfcc-tools
# Install BPFTrace
sudo apt-get install bpfcc-tools
觀測 Pod 網絡流量
eBPF 可以對 Pod 之間的網絡流量提供深入的洞察。讓我們創建一個簡單的 eBPF 程序,用于跟蹤兩個特定 Pod 之間的網絡流量。
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
BPF_TABLE("hash", u64, u64, packet_count, 256);
int count_packets(struct __sk_buff *skb) {
u64 *value;
u64 key = 0;
struct ethhdr *eth = bpf_hdr_pointer(skb);
struct iphdr *ip = (struct iphdr *)(eth + 1);
if (ip->protocol == IPPROTO_TCP) {
key = ip->saddr;
value = packet_count.lookup_or_init(&key, &key);
(*value)++;
}
return 0;
}
將這段代碼保存到一個文件中,例如 packet_count.c。您可以使用 clang 進行編譯,并使用 bpftool 將其加載到內核中。
clang -O2 -target bpf -c packet_count.c -o packet_count.o
bpftool prog load packet_count.o /sys/fs/bpf/packet_count
現在,您可以使用容器 ID 將此 eBPF 程序附加到特定 pod 的網絡接口上。
# Get the container ID of a pod
kubectl get pods -n <namespace> <pod-name> -o jsnotallow=’{.status.containerID}’
# Attach the eBPF program to the container’s network interface
bpftool net attach container <container-id> /sys/fs/bpf/packet_count
然后您可以監控為指定 pod 計數的數據包。
使用 BPFTrace 進行動態跟蹤
BPFTrace 是一個靈活的動態跟蹤工具。讓我們創建一個簡單的 BPFTrace 腳本來監控特定 pod 所做的系統調用。
tracepoint:syscalls:sys_enter_* {
if (str(args->comm) == "<pod-name>") {
printf("%s called %s()\n", args->comm, probefunc);
}
}
將<pod-name>替換為您要監控的 pod 的名稱。將此腳本保存到一個文件中,例如 syscall_trace.bt,并使用 BPFTrace 運行它。
bpftrace syscall_trace.bt
該腳本將實時顯示指定 pod 所做的系統調用。
分析 Kubernetes 資源使用情況
eBPF 也可以幫助您深入了解 Kubernetes pod 和容器的資源使用情況。讓我們創建一個 eBPF 程序來跟蹤特定 pod 的 CPU 和內存使用情況。
#include <linux/bpf.h>
#include <linux/perf_event.h>
#include <linux/sched.h>
BPF_HASH(pod_cpu, u64, u64);
BPF_HASH(pod_memory, u64, u64);
TRACEPOINT_PROBE(sched, sched_process_exit) {
u64 pid = bpf_get_current_pid_tgid();
u64 cpu_usage = bpf_perf_counter_value(pod_cpu, &pid);
u64 memory_usage = bpf_perf_counter_value(pod_memory, &pid);
printf(“Pod PID %lld — CPU Usage: %lld ns, Memory Usage: %lld bytes\n”, pid, cpu_usage, memory_usage);
}
像之前一樣編譯這個 eBPF 程序并將其加載到內核中。然后,將其附加到特定 pod 的進程上。
# Get the PID of a pod’s main process
kubectl exec -it -n <namespace> <pod-name> — pidof <process-name>
# Attach the eBPF program to the pod’s process
bpftool proc attach -p <pid> /sys/fs/bpf/pod_cpu
bpftool proc attach -p <pid> /sys/fs/bpf/pod_memory
現在,您可以實時監控指定 pod 的 CPU 和內存使用情況。
結論
在 Kubernetes 監控中利用 eBPF 功能可以深入了解內核級事件、網絡流量和資源使用情況。通過創建自定義的 eBPF 程序和使用像 BPFTrace 這樣的工具,您可以更好地理解集群的行為,排查問題,優化性能并分析資源利用率。
請記住,eBPF 是一個強大但底層的工具,所以要謹慎使用,并且在生產環境中運行自定義的 eBPF 程序時,始終要考慮安全隱患。進一步探索 eBPF 生態系統,發現更多提升 Kubernetes 監控和可觀測性實踐的方法。