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