4. 环境准备:部署Kubernetes集群(Kind/Minikube),安装Cilium并启用Hubble
在开始Pod资源消耗画像的采集与优化之前,需要搭建一套完整的实验环境。本章将指导你使用Kind或Minikube快速部署本地Kubernetes集群,安装Cilium作为CNI插件,并启用Hubble可观测性组件。环境准备是后续所有实验的基础,请确保每一步操作正确无误。
4.1 环境概览与组件关系
下图展示了实验环境的整体架构,包括集群部署工具、Kubernetes控制平面与工作节点、Cilium Agent以及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。