2. 环境准备:Kubernetes集群搭建、Kyverno安装、eBPF工具链部署

本章是工程案例的物理基础层。只有在一个功能完整的Kubernetes集群上正确安装Kyverno策略引擎,并部署eBPF工具链(bpftrace与Cilium),后续的配额校准与故障排查才能落地执行。以下按三个独立阶段展开。

2.1 Kubernetes集群搭建

推荐使用kubeadm在3台Ubuntu 22.04 x86_64节点上构建生产级集群。最低规格:2 vCPU / 4 GB RAM / 40 GB SSD。

节点角色 主机名 IP示例 最低配置
Control Plane k8s-master 192.168.1.10 2C / 4G
Worker 1 k8s-node1 192.168.1.11 2C / 4G
Worker 2 k8s-node2 192.168.1.12 2C / 4G
关键初始化步骤(所有节点):
  1. 关闭swap:sudo swapoff -a 并注释 /etc/fstab 中的swap条目。
  2. 加载内核模块:overlay 和 br_netfilter。
  3. 安装containerd 1.7+ 并配置systemd cgroup驱动。
  4. 安装kubelet / kubeadm / kubectl 1.28.x。

在Control Plane上执行 kubeadm init 后,安装Calico或Cilium作为CNI。本案例后续使用Cilium的eBPF数据面,因此建议直接安装Cilium CNI(版本1.15+)。

# 在master节点初始化
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 安装Cilium CLI
curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin

# 部署Cilium(启用eBPF)
cilium install --version 1.15.5 --set bpf.masquerade=true
验证集群就绪: kubectl get nodes -o wide 应显示所有节点为 Ready 状态;cilium status 应报告 DaemonSet Ready。

2.2 Kyverno策略引擎安装

Kyverno作为Kubernetes原生的策略引擎,通过动态准入Webhook拦截资源变更。本案例使用Helm 3安装Kyverno 1.12+。

# 添加Kyverno Helm仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

# 安装Kyverno(包含Webhook与后台服务)
helm install kyverno kyverno/kyverno \
  --namespace kyverno --create-namespace \
  --set admissionController.replicas=2 \
  --set backgroundController.replicas=1 \
  --set cleanupController.replicas=1
组件 Pod名称前缀 职责
Admission Controller kyverno-admission-* 拦截资源创建/更新请求,执行策略校验与突变
Background Controller kyverno-background-* 对已有资源进行周期性审计与报告生成
Cleanup Controller kyverno-cleanup-* 根据TTL策略自动清理过期资源
注意:Kyverno依赖集群内的 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration。安装后请检查 kubectl get validatingwebhookconfigurations 中是否存在 kyverno-resource-validating-webhook。

2.3 eBPF工具链部署

eBPF工具链包含两个层次:bpftrace(动态追踪/诊断)和 Cilium(网络与安全可观测性)。两者协同覆盖从系统调用到容器网络的完整观测面。

2.3.1 bpftrace安装

bpftrace是基于eBPF的高级追踪前端,用于快速编写单行脚本探测内核函数。在每个Worker节点上安装:

# Ubuntu 22.04 安装bpftrace
sudo apt-get update
sudo apt-get install -y bpftrace

# 验证安装
sudo bpftrace --version  # 应输出 v0.18+
常用探测点(配额校准场景):
  • kprobe:account_page_dirtied — 跟踪脏页记账
  • tracepoint:syscalls/sys_enter_mmap — 监控内存映射申请
  • kprobe:__cgroup_bpf_run_filter_sysctl — 检测cgroup sysctl拦截

2.3.2 Cilium eBPF数据面与可观测性

Cilium不仅作为CNI提供网络连通性,其内置的 Hubble 组件通过eBPF采集流数据、DNS解析、TCP状态等。本案例使用Cilium的 Bandwidth Manager 和 Cluster Mesh 特性来校准Pod网络配额。

# 启用Hubble(可观测性层)
cilium hubble enable

# 验证Hubble Relay是否运行
kubectl get pods -n kube-system -l k8s-app=hubble-relay

# 安装hubble CLI(用于命令行抓取流)
curl -L --remote-name-all https://github.com/cilium/hubble/releases/latest/download/hubble-linux-amd64.tar.gz
sudo tar xzvfC hubble-linux-amd64.tar.gz /usr/local/bin
验证eBPF工具链就绪: 在任意Worker节点执行 sudo bpftrace -l 'kprobe:account_*' | head -5 应返回内核符号;执行 hubble status 应显示 Health: OK。
环境准备:三层协同架构 Kubernetes 集群 (kubeadm + containerd) Control Plane: k8s-master (192.168.1.10) Worker Nodes: k8s-node1 / k8s-node2 Kyverno 策略引擎 (Helm部署) Admission Controller | Background Controller | Cleanup Controller ValidatingWebhook / MutatingWebhook / PolicyReport CRD eBPF 工具链 bpftrace (动态追踪) kprobe / tracepoint / uprobe Cilium + Hubble (网络可观测) eBPF数据面 / Bandwidth Manager / Flow 三层之间通过Kubernetes API Server与eBPF内核事件协同工作

2.4 环境验证清单

完成上述安装后,执行以下验证命令确保所有组件正常运行:

验证项 命令 预期结果
集群节点状态 kubectl get nodes 所有节点 Ready
Kyverno Pod状态 kubectl get pods -n kyverno 3个Controller Pod均为 Running
Kyverno Webhook kubectl get validatingwebhookconfigurations 存在 kyverno-resource-validating-webhook
Cilium状态 cilium status DaemonSet Ready / Hubble: OK
bpftrace可用性 sudo bpftrace -e 'BEGIN{printf("hello\\n");exit()}' 输出 hello 并正常退出
故障排查提示: 如果bpftrace报 Kernel BTF not found,请安装 linux-image-$(uname -r)-dbgsym 或启用 CONFIG_DEBUG_INFO_BTF=y 重新编译内核。Cilium若无法启动eBPF,检查 /sys/fs/bpf 是否挂载以及内核版本是否 ≥ 5.10。