3、环境准备:基于Kubernetes集群部署Cilium与Hubble,配置eBPF制品库的存储与拉取策略

本章将完成课程实验环境的搭建,包括在Kubernetes集群上部署Cilium与Hubble,并配置eBPF制品库的存储与拉取策略。这是后续进行流量可视化与观测实践的基础。

3.1 环境概览与组件关系

整个环境由三层组件构成:底层为Kubernetes集群,中间层为Cilium与Hubble,上层为eBPF制品库与观测工具。下图展示了各组件之间的协作关系。

环境组件架构图 环境组件架构图 Kubernetes 集群(节点组) kubelet / kube-proxy / Container Runtime Cilium 数据平面 + Hubble 观测层 Cilium Agent (DaemonSet) Hubble Relay (Deployment) Hubble UI (Deployment) eBPF 制品库 存储:OCI 兼容仓库(Harbor / Docker Registry) 拉取策略:Cilium Agent 启动时自动拉取 eBPF 程序 说明:Cilium Agent 从 eBPF 制品库拉取编译好的 eBPF 程序,Hubble 组件负责采集和展示流量数据。

3.2 部署Cilium与Hubble

推荐使用 Helm 进行部署,便于后续配置管理和升级。以下为部署步骤。

3.2.1 添加Helm仓库并更新

helm repo add cilium https://helm.cilium.io/
helm repo update

3.2.2 创建命名空间并部署Cilium

kubectl create namespace cilium

helm install cilium cilium/cilium \
  --namespace cilium \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true \
  --set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution}" \
  --set bpf.masquerade=true \
  --set kubeProxyReplacement=strict
关键参数说明:
  • hubble.relay.enabled=true:启用 Hubble Relay,聚合所有节点的流量数据。
  • hubble.ui.enabled=true:启用 Hubble UI,提供可视化界面。
  • hubble.metrics.enabled:开启关键指标采集,用于后续观测。
  • bpf.masquerade=true:使用 eBPF 实现 SNAT,提升性能。
  • kubeProxyReplacement=strict:完全替换 kube-proxy,发挥 eBPF 最大能力。

3.2.3 验证部署状态

kubectl -n cilium get pods
kubectl -n cilium get svc

确认所有 Pod 处于 Running 状态,且 Hubble Relay 与 Hubble UI 的 Service 已创建。

3.3 配置eBPF制品库

eBPF制品库用于存储编译好的 eBPF 程序(.o 文件或 OCI 镜像),Cilium Agent 在启动或更新时从制品库拉取。本课程使用 OCI 兼容仓库(如 Harbor 或 Docker Registry)作为制品库。

3.3.1 部署制品仓库(以Harbor为例)

helm repo add harbor https://helm.goharbor.io
helm install harbor harbor/harbor \
  --namespace harbor \
  --set expose.type=clusterIP \
  --set persistence.enabled=false
注意:生产环境建议启用持久化存储并配置 TLS。本实验为简化配置,使用 ClusterIP 并关闭持久化。

3.3.2 创建制品仓库项目

通过 Harbor API 或 UI 创建一个名为 ebpf-artifacts 的项目,用于存放 eBPF 程序镜像。

# 使用 API 创建项目
curl -X POST "http://harbor.harbor.svc.cluster.local/api/v2.0/projects" \
  -H "Content-Type: application/json" \
  -d '{"project_name": "ebpf-artifacts", "public": true}'

3.4 配置Cilium的eBPF制品拉取策略

Cilium 支持通过 cilium-config ConfigMap 配置 eBPF 程序的拉取策略。关键配置项如下表所示。

配置项 默认值 说明
bpf.artifact.repository 空 eBPF 制品仓库地址,例如 harbor.harbor.svc.cluster.local/ebpf-artifacts
bpf.artifact.tag latest 拉取的制品标签,建议使用语义化版本号
bpf.artifact.pullPolicy IfNotPresent 拉取策略:Always / IfNotPresent / Never
bpf.artifact.imagePullSecrets 空 私有仓库的认证 Secret 名称

3.4.1 更新Cilium配置

helm upgrade cilium cilium/cilium \
  --namespace cilium \
  --reuse-values \
  --set bpf.artifact.repository="harbor.harbor.svc.cluster.local/ebpf-artifacts" \
  --set bpf.artifact.tag="v1.0.0" \
  --set bpf.artifact.pullPolicy="IfNotPresent"

3.4.2 验证拉取策略

检查 Cilium Agent Pod 的日志,确认其成功从制品库拉取了 eBPF 程序。

kubectl -n cilium logs -l k8s-app=cilium --tail=50 | grep "artifact"

预期输出类似:

level=info msg="Successfully pulled eBPF artifact" repository=harbor.harbor.svc.cluster.local/ebpf-artifacts tag=v1.0.0

3.5 制品存储与拉取流程

下图展示了 eBPF 制品从编译、存储到被 Cilium Agent 拉取加载的完整流程。

eBPF制品存储与拉取流程图 eBPF 制品存储与拉取流程图 ① 编译 eBPF 程序 clang + llc → .o 文件 ② 打包为 OCI 镜像 docker build + push ③ 推送到制品库 Harbor / Docker Registry ④ Cilium Agent 拉取 启动时 / 配置更新时 ⑤ 加载到内核 bpf() syscall → 内核验证 ⑥ 挂载到钩子点 XDP / TC / cgroup 等 说明:整个流程从编译到加载完全自动化,Cilium Agent 根据配置的拉取策略从制品库获取最新 eBPF 程序。 支持版本回滚:只需更改 tag 并重启 Agent 即可回退到旧版本。

3.6 验证环境就绪

完成上述配置后,执行以下命令验证环境是否就绪。

# 检查Cilium状态
cilium status

# 检查Hubble组件
kubectl -n cilium get pods -l k8s-app=hubble-relay
kubectl -n cilium get pods -l k8s-app=hubble-ui

# 测试Hubble观测能力
hubble observe --from-pod default/test-pod --to-pod default/nginx
预期结果:
  • Cilium 状态显示 OK,所有组件健康。
  • Hubble Relay 和 Hubble UI Pod 处于 Running 状态。
  • hubble observe 命令能正常输出流量记录。

3.7 常见问题与避坑

问题 原因 解决方案
Cilium Agent 启动失败,日志提示“无法拉取制品” 制品仓库地址不可达或认证失败 检查 bpf.artifact.repository 配置,确保网络连通;配置 imagePullSecrets
Hubble UI 无法访问 Service 类型为 ClusterIP,未暴露端口 使用 kubectl port-forward 或修改 Service 为 NodePort
eBPF 程序加载失败 内核版本过低或缺少 eBPF 特性 确认内核版本 ≥ 5.10,并启用 CONFIG_BPF 相关选项
Hubble 观测不到流量 Hubble Relay 未正确连接 Agent 检查 hubble.relay.enabled=true 配置,重启 Relay Pod