3、环境准备:基于Kubernetes集群部署Cilium与Hubble,配置eBPF制品库的存储与拉取策略
本章将完成课程实验环境的搭建,包括在Kubernetes集群上部署Cilium与Hubble,并配置eBPF制品库的存储与拉取策略。这是后续进行流量可视化与观测实践的基础。
3.1 环境概览与组件关系
整个环境由三层组件构成:底层为Kubernetes集群,中间层为Cilium与Hubble,上层为eBPF制品库与观测工具。下图展示了各组件之间的协作关系。
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 拉取加载的完整流程。
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 |