我們?nèi)绾卫胑BPF程序監(jiān)控Kubernetes,你學會了嗎?
對 Kubernetes 集群進行監(jiān)控對于確保容器化應用程序的健康、性能和可靠性至關重要。Kubernetes 提供了強大的監(jiān)控工具套件和集成,但是當您需要深入內(nèi)核和網(wǎng)絡級別的復雜性時,eBPF(擴展的伯克利包過濾器)就成為了無價的資源。在本文中,我們將探索驚人的 eBPF 功能,以及如何利用它提升 Kubernetes 監(jiān)控策略。
譯自How to Use eBPF Capabilities to Navigate Kubernetes Monitoring。作者 Dev Genius 。
在 Kubernetes 的背景下,eBPF 在諸如容器網(wǎng)絡監(jiān)控(CNI 插件)、通過基于 eBPF 的網(wǎng)絡策略加強安全性以及進行詳細的性能分析等任務中發(fā)揮著關鍵作用。通過深入研究 eBPF 的功能,您可以對 Kubernetes 集群獲得無與倫比的洞察,從而幫助您排查問題、優(yōu)化性能并微調(diào)基礎設施以達到峰值效率。
eBPF是一個強大的技術,它允許在不修改 Linux 內(nèi)核源代碼的情況下,動態(tài)地向 Linux 內(nèi)核中插入自定義代碼。這些代碼可以用于各種目的,包括網(wǎng)絡分析、跟蹤和在eBPF Kubernetes的背景下的可觀察性。
圖片
Kubernetes 利用 eBPF 進行各種任務,例如容器網(wǎng)絡監(jiān)控(CNI 插件)、安全性(例如基于 eBPF 的網(wǎng)絡策略)和性能分析。
設置環(huán)境和使用 eBPF 監(jiān)控 Kubernetes
在我們深入研究基于 eBPF 的 Kubernetes 監(jiān)控之前,讓我們先設置環(huán)境。請確保您具備以下前提條件:
- 一個運行中的 Kubernetes 集群
- 安裝了kubectl命令行工具
- Docker 或其他容器運行時
- 基于 Linux 的系統(tǒng)(用于 eBPF 工具)
安裝必需的工具
要開始,我們需要在您的系統(tǒng)上安裝一些與 eBPF 相關的工具。這些工具將幫助您分析和跟蹤內(nèi)核級事件。
# Install BPF Compiler Collection (BCC)
sudo apt-get install bpfcc-tools
# Install BPFTrace
sudo apt-get install bpfcc-tools觀測 Pod 網(wǎng)絡流量
eBPF 可以對 Pod 之間的網(wǎng)絡流量提供深入的洞察。讓我們創(chuàng)建一個簡單的 eBPF 程序,用于跟蹤兩個特定 Pod 之間的網(wǎng)絡流量。
#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 將其加載到內(nèi)核中。
clang -O2 -target bpf -c packet_count.c -o packet_count.o
bpftool prog load packet_count.o /sys/fs/bpf/packet_count現(xiàn)在,您可以使用容器 ID 將此 eBPF 程序附加到特定 pod 的網(wǎng)絡接口上。
# 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然后您可以監(jiān)控為指定 pod 計數(shù)的數(shù)據(jù)包。
使用 BPFTrace 進行動態(tài)跟蹤
BPFTrace 是一個靈活的動態(tài)跟蹤工具。讓我們創(chuàng)建一個簡單的 BPFTrace 腳本來監(jiān)控特定 pod 所做的系統(tǒng)調(diào)用。
tracepoint:syscalls:sys_enter_* {
if (str(args->comm) == "<pod-name>") {
printf("%s called %s()\n", args->comm, probefunc);
}
}將<pod-name>替換為您要監(jiān)控的 pod 的名稱。將此腳本保存到一個文件中,例如 syscall_trace.bt,并使用 BPFTrace 運行它。
bpftrace syscall_trace.bt該腳本將實時顯示指定 pod 所做的系統(tǒng)調(diào)用。
分析 Kubernetes 資源使用情況
eBPF 也可以幫助您深入了解 Kubernetes pod 和容器的資源使用情況。讓我們創(chuàng)建一個 eBPF 程序來跟蹤特定 pod 的 CPU 和內(nèi)存使用情況。
#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 程序并將其加載到內(nèi)核中。然后,將其附加到特定 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現(xiàn)在,您可以實時監(jiān)控指定 pod 的 CPU 和內(nèi)存使用情況。
結論
在 Kubernetes 監(jiān)控中利用 eBPF 功能可以深入了解內(nèi)核級事件、網(wǎng)絡流量和資源使用情況。通過創(chuàng)建自定義的 eBPF 程序和使用像 BPFTrace 這樣的工具,您可以更好地理解集群的行為,排查問題,優(yōu)化性能并分析資源利用率。
請記住,eBPF 是一個強大但底層的工具,所以要謹慎使用,并且在生產(chǎn)環(huán)境中運行自定義的 eBPF 程序時,始終要考慮安全隱患。進一步探索 eBPF 生態(tài)系統(tǒng),發(fā)現(xiàn)更多提升 Kubernetes 監(jiān)控和可觀測性實踐的方法。






































