2. 环境准备与基础搭建:Kubernetes集群部署、Cilium与Hubble安装、Helm Chart配置
本章是实战课程的基石。我们将从零搭建一套完整的Kubernetes实验环境,并在此基础上部署Cilium作为CNI插件,同时启用Hubble可观测性组件。所有部署均通过Helm Chart进行标准化管理,为后续的故障注入与自动化回滚演练提供稳定、可复现的基础设施。
2.1 环境概览与版本选型
为保证课程内容的一致性与可复现性,本次实验环境采用以下核心组件版本。建议读者在相同或兼容的版本下进行操作,以避免因版本差异导致的兼容性问题。
| 组件 | 版本 | 说明 |
|---|---|---|
| Kubernetes | v1.28.7 | 使用kubeadm部署,兼容Cilium 1.15+ |
| Cilium | v1.15.5 | 作为CNI与eBPF运行时,启用Hubble |
| Hubble | v1.15.5 | 随Cilium Helm Chart一同安装 |
| Helm | v3.14.0 | 包管理工具,用于部署Cilium |
| 操作系统 | Ubuntu 22.04 LTS | 内核版本 5.15+,支持eBPF |
2.2 Kubernetes集群部署(kubeadm方式)
我们使用kubeadm在3台Ubuntu节点上部署一个高可用的Kubernetes集群。集群包含1个控制平面节点和2个工作节点。
2.2.1 节点初始化与容器运行时安装
在所有节点上执行以下操作:
- 更新系统并安装必要依赖:
apt-get update && apt-get install -y apt-transport-https ca-certificates curl - 安装containerd作为容器运行时。
- 配置内核参数,启用bridge-nf-call-iptables。
- 安装kubeadm、kubelet、kubectl并锁定版本。
# 在所有节点上执行
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
2.2.2 初始化控制平面
在控制平面节点上执行 kubeadm init。注意,由于我们将使用Cilium作为CNI,初始化时需要跳过默认的CNI安装。
# 在控制平面节点执行
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--skip-phases=addon/kube-proxy \
--cri-socket unix:///run/containerd/containerd.sock
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
--skip-phases=addon/kube-proxy 跳过了kube-proxy的安装。这是因为Cilium可以完全替代kube-proxy的功能(通过eBPF实现),从而获得更好的性能和更低的延迟。如果你需要保留kube-proxy,可以省略此参数,但后续Cilium配置中需要调整。
2.2.3 加入工作节点
使用 kubeadm init 输出的 kubeadm join 命令,在两个工作节点上执行,将其加入集群。
# 在工作节点执行(示例命令,实际以控制平面输出为准)
sudo kubeadm join 192.168.1.10:6443 -- <your-> \
--discovery--ca-cert-hash sha256:<your-hash>
2.3 Cilium与Hubble安装(Helm Chart方式)
集群就绪后,我们使用Helm Chart来部署Cilium。这是官方推荐的生产级部署方式,能够灵活配置Hubble、Cluster Mesh、eBPF等高级特性。
2.3.1 添加Helm仓库并更新
helm repo add cilium https://helm.cilium.io/
helm repo update
2.3.2 创建Cilium配置Values文件
我们创建一个名为 cilium-values.yaml 的配置文件,用于定制化部署。以下配置启用了Hubble、eBPF数据平面,并禁用了kube-proxy。
# cilium-values.yaml
# 全局设置
cluster:
name: hubble-lab
id: 1
# 替换kube-proxy
kubeProxyReplacement: true
# eBPF 数据平面
bpf:
masquerade: true
tproxy: true
# Hubble 可观测性
hubble:
enabled: true
relay:
enabled: true
ui:
enabled: true
ingress:
enabled: false # 生产环境建议开启
metrics:
enabled:
- dns
- drop
- tcp
- flow
- port-distribution
- icmp
- http
# IPAM 模式
ipam:
mode: kubernetes
# 路由模式
routingMode: native
# 自动检测设备
autoDirectNodeRoutes: true
2.3.3 执行Helm安装
# 在控制平面节点执行
helm install cilium cilium/cilium \
--namespace kube-system \
--values cilium-values.yaml \
--version 1.15.5
2.3.4 验证安装状态
安装完成后,通过以下命令验证Cilium和Hubble组件是否正常运行。
# 检查Cilium Pod状态
kubectl -n kube-system get pods -l k8s-app=cilium
# 检查Hubble相关Pod
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 status --wait
预期输出应显示所有Cilium Agent处于 Running 状态,且Hubble Relay与UI也已就绪。
cilium connectivity test 可以运行一套完整的端到端连通性测试,包括Pod间通信、DNS解析、服务转发等。这是确认Cilium网络功能正常的最佳实践。
2.4 部署架构与组件关系
下图展示了部署完成后,Kubernetes集群、Cilium Agent、Hubble Relay与UI之间的逻辑关系与数据流。
2.5 Helm Chart配置详解
Helm Chart是管理Cilium部署的核心。理解关键配置项对于后续的故障排查和自动化回滚至关重要。下表列出了我们在 cilium-values.yaml 中使用的主要参数及其作用。
| 配置项 | 值 | 作用与影响 |
|---|---|---|
kubeProxyReplacement |
true | 启用eBPF完全替代kube-proxy,提升服务转发性能,减少CPU开销。 |
bpf.masquerade |
true | 使用eBPF进行SNAT,避免iptables性能瓶颈。 |
hubble.enabled |
true | 启用Hubble可观测性组件,采集网络流数据。 |
hubble.relay.enabled |
true | 部署Hubble Relay,聚合所有节点的流数据,提供统一查询接口。 |
hubble.ui.enabled |
true | 部署Hubble UI,提供图形化界面查看网络流与服务依赖。 |
hubble.metrics.enabled |
[dns, drop, tcp, ...] | 指定Hubble采集的指标类型,用于故障排查和性能分析。 |
routingMode |
native | 使用原生路由模式,要求底层网络支持Pod CIDR路由,性能优于隧道模式。 |
hubble.ui.ingress.enabled=true 并配置Ingress,以便通过浏览器直接访问Hubble UI。在生产环境中,应通过kubectl port-forward或内部DNS访问,避免暴露管理界面。
2.6 验证Hubble数据采集
部署完成后,我们通过Hubble CLI快速验证数据采集是否正常。这为后续的故障注入演练提供了数据基准。
# 安装Hubble CLI(在控制平面节点)
export HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
curl -L --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-amd64.tar.gz
sudo tar xzvf hubble-linux-amd64.tar.gz -C /usr/local/bin/ hubble
# 通过端口转发连接到Hubble Relay
kubectl port-forward -n kube-system svc/hubble-relay 4245:80 &
# 观察实时网络流
hubble observe --from-pod default/test-pod --to-pod default/nginx-pod
如果配置正确,上述命令将输出两个Pod之间的TCP连接流记录,包含源IP、目标IP、端口、协议、Verdict(转发/丢弃)等关键信息。
2.7 环境验证清单
在进入下一章之前,请使用以下清单确认环境已完全就绪。
- Kubernetes集群:
kubectl get nodes显示所有节点为Ready状态。 - Cilium Agent:
kubectl -n kube-system get pods -l k8s-app=cilium所有Pod为Running。 - Hubble Relay:
kubectl -n kube-system get pods -l k8s-app=hubble-relay状态为Running。 - Hubble UI:
kubectl -n kube-system get pods -l k8s-app=hubble-ui状态为Running。 - 连通性测试:
cilium connectivity test全部通过。 - Hubble数据流:
hubble observe能够输出Pod间的网络流记录。
CONFIG_BPF 相关内核选项是否开启。可以使用 cilium sysdump 命令收集诊断信息。
至此,我们的实验环境已全部搭建完成。Kubernetes集群、Cilium CNI、Hubble可观测性栈均已就绪,为后续的eBPF模板制品库构建与自动化回滚演练奠定了坚实的基础。