4. 环境准备:部署Kubernetes集群(Kind/Minikube),安装Cilium并启用Hubble

在开始Pod资源消耗画像的采集与优化之前,需要搭建一套完整的实验环境。本章将指导你使用Kind或Minikube快速部署本地Kubernetes集群,安装Cilium作为CNI插件,并启用Hubble可观测性组件。环境准备是后续所有实验的基础,请确保每一步操作正确无误。

4.1 环境概览与组件关系

下图展示了实验环境的整体架构,包括集群部署工具、Kubernetes控制平面与工作节点、Cilium Agent以及Hubble组件的协作关系。

实验环境组件关系图 集群部署工具 Kind / Minikube Kubernetes 集群 控制平面 + 工作节点 Cilium CNI eBPF数据平面 Hubble 可观测性 & 流量画像 kubectl / hubble CLI 交互与数据采集 说明 • Kind 和 Minikube 均可用于本地开发测试,Kind 基于容器节点,Minikube 支持虚拟机/容器双模式。 • Cilium 安装后自动接管集群网络,Hubble 作为独立组件提供流量与策略可视化能力。

4.2 部署工具选型对比

Kind 和 Minikube 是两种最常用的本地 Kubernetes 部署工具,各有适用场景。下表从多个维度进行对比,帮助你根据实验需求做出选择。

对比维度 Kind Minikube
底层实现 容器节点(Docker容器模拟节点) 虚拟机或容器(支持Docker/Podman/VM驱动)
启动速度 快(约30-60秒) 中等(约1-3分钟,取决于驱动)
多节点支持 原生支持,配置简单 支持,但配置相对复杂
eBPF兼容性 需额外配置内核参数,部分环境受限 虚拟机驱动下eBPF兼容性更好
资源占用 较低 中等(虚拟机模式占用更高)
推荐场景 快速验证、CI/CD、轻量测试 需要完整内核特性、eBPF深度实验
选型建议:本课程后续的eBPF资源消耗画像实验需要完整的内核BPF支持,推荐使用Minikube的Docker驱动或Kind并手动开启BPF相关内核参数。如果使用Minikube,建议分配至少2个CPU和4GB内存。

4.3 使用Kind部署集群

Kind(Kubernetes in Docker)通过将Kubernetes组件运行在Docker容器中实现快速集群部署。以下是使用Kind部署集群并安装Cilium的完整步骤。

4.3.1 安装Kind与创建集群

# 安装Kind(Linux/macOS)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

# 创建Kind配置文件(启用必要内核模块)
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraMounts:
  - hostPath: /sys/fs/bpf
    containerPath: /sys/fs/bpf
- role: worker
  extraMounts:
  - hostPath: /sys/fs/bpf
    containerPath: /sys/fs/bpf
kubeadmConfigPatches:
- |
  apiVersion: kubeadm.k8s.io/v1beta3
  kind: ClusterConfiguration
  metadata:
    name: config
  apiServer:
    extraArgs:
      "feature-gates": "BPF=true"
EOF

# 创建集群
kind create cluster --config kind-config.yaml --name cilium-lab

4.3.2 验证集群状态

# 检查节点状态
kubectl get nodes

# 输出示例
# NAME                     STATUS   ROLES           AGE   VERSION
# cilium-lab-control-plane Ready    control-plane   2m    v1.27.3
# cilium-lab-worker        Ready    <none>          1m    v1.27.3

4.4 使用Minikube部署集群

Minikube提供了更接近生产环境的虚拟机隔离,对eBPF的支持更加完善。以下是Minikube的部署步骤。

4.4.1 安装Minikube与启动集群

# 安装Minikube(Linux)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 启动集群(Docker驱动,启用BPF特性)
minikube start \
  --driver=docker \
  --cpus=2 \
  --memory=4096 \
  --kubernetes-version=v1.27.3 \
  --extra-config=kubelet.feature-gates=BPF=true \
  --extra-config=apiserver.feature-gates=BPF=true

# 验证集群
minikube status
kubectl get nodes
注意:如果使用Minikube的Docker驱动,请确保宿主机内核版本不低于5.10,并且已启用BPF相关内核配置(CONFIG_BPF、CONFIG_BPF_SYSCALL等)。可以使用 minikube ssh -- cat /proc/config.gz | gunzip | grep CONFIG_BPF 检查。

4.5 安装Cilium并启用Hubble

Cilium的安装推荐使用官方Helm Chart,可以灵活配置组件和功能。Hubble作为Cilium的可观测性子项目,需要单独启用。

4.5.1 添加Helm仓库与安装Cilium

# 添加Cilium Helm仓库
helm repo add cilium https://helm.cilium.io/
helm repo update

# 安装Cilium(启用Hubble)
helm install cilium cilium/cilium \
  --namespace kube-system \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true \
  --set hubble.metrics.enabled="{dns,drop,tcp,flow,icmp,http}" \
  --set bpf.masquerade=true \
  --set kubeProxyReplacement=strict

# 等待Cilium Pod全部就绪
kubectl -n kube-system wait --for=condition=ready pod -l k8s-app=cilium --timeout=300s

4.5.2 验证Cilium与Hubble状态

# 检查Cilium Agent状态
kubectl -n kube-system get pods -l k8s-app=cilium

# 检查Hubble Relay和UI
kubectl -n kube-system get pods -l k8s-app=hubble-relay
kubectl -n kube-system get pods -l k8s-app=hubble-ui

# 使用Cilium CLI验证集群连通性
cilium connectivity test

4.5.3 Hubble UI访问配置

# 将Hubble UI暴露到本地(NodePort方式)
kubectl -n kube-system patch svc hubble-ui -p '{"spec":{"type":"NodePort"}}'

# 获取访问端口
HUBBLE_UI_PORT=$(kubectl -n kube-system get svc hubble-ui -o jsonpath='{.spec.ports[0].nodePort}')
echo "Hubble UI访问地址: http://localhost:${HUBBLE_UI_PORT}"

# 或者使用端口转发
kubectl -n kube-system port-forward svc/hubble-ui 12000:80 &
echo "Hubble UI访问地址: http://localhost:12000"

4.6 环境验证清单

完成上述部署后,建议按照以下清单逐项验证环境是否就绪,确保后续实验顺利进行。

验证项 验证方法 预期结果
集群节点状态 kubectl get nodes 所有节点状态为 Ready
Cilium Agent运行 kubectl -n kube-system get pods -l k8s-app=cilium 每个节点对应一个Running状态的Pod
Hubble Relay运行 kubectl -n kube-system get pods -l k8s-app=hubble-relay 至少一个Running状态的Pod
Hubble UI可访问 浏览器访问Hubble UI地址 显示Hubble UI仪表盘
集群连通性 cilium connectivity test 所有测试用例通过
eBPF功能可用 kubectl -n kube-system exec ds/cilium -- cilium status | grep BPF 显示BPF相关状态正常

4.7 常见问题与排查

  • 问题:Cilium Pod CrashLoopBackOff
    检查内核版本是否满足要求(≥5.10),确认BPF相关内核模块已加载。使用 cilium status 查看详细错误信息。
  • 问题:Hubble UI无法访问
    确认hubble-relay和hubble-ui Pod均处于Running状态,检查Service类型和端口映射是否正确。
  • 问题:集群节点NotReady
    检查容器运行时(Docker/containerd)状态,确认CNI插件安装成功。查看kubelet日志:kubectl logs -n kube-system <kubelet-pod>。
  • 问题:eBPF程序加载失败
    确认宿主机内核开启了BPF相关配置,检查cgroup v2是否挂载:mount | grep cgroup2。