3. 环境准备:基于 Kubernetes 1.28+ 的集群搭建,Helm 安装 Cilium 并配置 Hubble 与 ClusterMesh
本章是整门课程的基石。我们将搭建一套符合生产级要求的双集群环境:Kubernetes 版本锁定在 1.28+,Cilium 通过 Helm 安装并开启 Hubble 可观测性,最后配置 ClusterMesh 实现跨集群互联。所有后续的蓝绿发布与灾备 RPO 验证都将运行在这套环境之上。
3.1 集群规划与版本要求
为模拟真实灾备场景,我们需要两个独立的 Kubernetes 集群:Cluster-A(主集群) 和 Cluster-B(灾备集群)。下表列出关键配置参数:
| 参数项 | Cluster-A(主) | Cluster-B(灾备) |
|---|---|---|
| Kubernetes 版本 | v1.28.7 | v1.28.7 |
| 节点数 | 3 (1 control + 2 worker) | 3 (1 control + 2 worker) |
| 容器运行时 | containerd 1.7.x | containerd 1.7.x |
| Pod CIDR | 10.0.0.0/16 | 10.1.0.0/16 |
| Service CIDR | 172.20.0.0/16 | 172.21.0.0/16 |
| 节点间网络互通 | 直接路由或 VXLAN | 直接路由或 VXLAN |
版本选择说明:Kubernetes 1.28 引入了
ReadWriteOncePod 持久卷访问模式等特性,同时 Cilium 1.15+ 对 1.28 有完整的 eBPF 支持。建议使用 kubeadm 或 kubespray 进行集群初始化,确保内核版本 ≥ 5.10(推荐 6.x)。
3.2 集群初始化与节点配置
以下步骤以 Cluster-A 为例,Cluster-B 重复相同操作(注意修改 Pod/Service CIDR)。
- 安装 kubeadm、kubelet、kubectl(版本锁定 1.28.7)
- 初始化控制平面
sudo kubeadm init \
--kubernetes-version=v1.28.7 \
--pod-network-cidr=10.0.0.0/16 \
--service-cidr=172.20.0.0/16 \
--apiserver-advertise-address=192.168.1.10
- 配置 kubectl 上下文
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 加入工作节点(在 worker 节点执行 kubeadm join 命令)
- 验证集群状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION
cluster-a-master Ready control-plane 5m v1.28.7
cluster-a-node1 Ready <none> 3m v1.28.7
cluster-a-node2 Ready <none> 3m v1.28.7
关键检查点:在安装 Cilium 之前,确保所有节点处于
Ready 状态,且 kubelet 日志无异常。如果使用 containerd,请确认 /etc/containerd/config.toml 中 SystemdCgroup = true。
3.3 Helm 安装 Cilium 并启用 Hubble
Cilium 将作为集群的 CNI 插件,同时提供网络策略、可观测性和跨集群连接能力。我们使用 Helm 3 进行安装,并显式开启 Hubble。
3.3.1 添加 Helm 仓库与配置
helm repo add cilium https://helm.cilium.io/
helm repo update
3.3.2 安装 Cilium(Cluster-A)
helm install cilium cilium/cilium \
--namespace kube-system \
--set cluster.name=cluster-a \
--set cluster.id=1 \
--set ipam.mode=cluster-pool \
--set ipam.operator.clusterPoolIPv4PodCIDRList="10.0.0.0/16" \
--set ipam.operator.clusterPoolIPv4MaskSize=24 \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true \
--set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,http}"
3.3.3 安装 Cilium(Cluster-B)
重复上述命令,仅修改 cluster.name=cluster-b、cluster.id=2 以及 clusterPoolIPv4PodCIDRList="10.1.0.0/16"。
3.3.4 验证 Cilium 与 Hubble 状态
cilium status --namespace kube-system
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Envoy Daemon: OK
\__/¯¯\__/ Hubble Relay: OK
\__/ ClusterMesh: disabled
kubectl -n kube-system get pods -l k8s-app=cilium
NAME READY STATUS RESTARTS AGE
cilium-xxxxx 1/1 Running 0 2m
cilium-yyyyy 1/1 Running 0 2m
cilium-zzzzz 1/1 Running 0 2m
Hubble UI 访问:执行
kubectl port-forward -n kube-system svc/hubble-ui 12000:80,然后在浏览器打开 http://localhost:12000。你将看到实时的服务依赖图和流量流转。
3.4 配置 ClusterMesh 跨集群互联
ClusterMesh 允许 Cilium 管理多个 Kubernetes 集群的网络策略和服务路由,是实现蓝绿发布跨集群流量切换的核心组件。
3.4.1 生成集群证书
在 Cluster-A 的控制节点上执行:
cilium clustermesh enable --context=cluster-a --service-type=NodePort
该命令会生成一个 clustermesh-secrets.yaml 文件,包含用于集群间认证的 TLS 证书。
3.4.2 在 Cluster-B 上安装 ClusterMesh
cilium clustermesh enable --context=cluster-b --service-type=NodePort
3.4.3 建立集群连接
将 Cluster-A 的证书安装到 Cluster-B,反之亦然:
cilium clustermesh connect --context=cluster-b --destination-context=cluster-a
3.4.4 验证 ClusterMesh 状态
cilium clustermesh status --context=cluster-a
ClusterMesh: 2/2 clusters ready, 2 global services
- cluster-b: remote cluster ready, 1 nodes, 2 endpoints
网络要求:ClusterMesh 要求集群间的节点能够通过 NodePort 或 LoadBalancer 互相访问。如果部署在云环境,请确保安全组放行 32379(etcd)、32380(gRPC)端口。本地环境可使用
--service-type=NodePort 并确保节点路由可达。
3.5 环境验证与拓扑总览
下图展示了双集群 + ClusterMesh 的完整架构,以及 Hubble 可观测性组件的位置:
3.6 环境就绪检查清单
在进入下一阶段前,请逐项确认以下条件全部满足:
| 检查项 | 验证命令 | 预期结果 |
|---|---|---|
| Kubernetes 节点状态 | kubectl get nodes |
所有节点 Ready |
| Cilium 运行状态 | cilium status |
Cilium: OK, Hubble Relay: OK |
| Hubble UI 可访问 | kubectl port-forward ... |
浏览器打开 UI 页面 |
| ClusterMesh 状态 | cilium clustermesh status |
2/2 clusters ready |
| 跨集群 Pod 连通性 | 从 Cluster-A Pod ping Cluster-B Pod IP | 成功响应 |
常见问题排查:
- 如果
cilium status显示 Hubble Relay 为disabled,请检查 Helm values 中hubble.relay.enabled=true是否生效。 - ClusterMesh 连接失败时,检查集群间防火墙规则,确保 32379/32380 端口可达。
- Pod CIDR 重叠会导致路由冲突,务必为两个集群分配不同的 Pod CIDR 段。