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)。

  1. 安装 kubeadm、kubelet、kubectl(版本锁定 1.28.7)
  2. 初始化控制平面
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
  1. 配置 kubectl 上下文
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 加入工作节点(在 worker 节点执行 kubeadm join 命令)
  2. 验证集群状态
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 可观测性组件的位置:

双集群 Cilium ClusterMesh 架构图 双集群 Cilium + ClusterMesh + Hubble 架构 Cluster-A(主集群) Control Plane Worker Node 1 Worker Node 2 Cilium Agent Hubble Relay Hubble UI Cluster-B(灾备集群) Control Plane Worker Node 1 Worker Node 2 Cilium Agent Hubble Relay Hubble UI ClusterMesh Hubble 可观测性层 Hubble 可观测性层 ClusterMesh 通过 etcd 同步服务与端点信息 Hubble 采集 eBPF 事件流,提供实时流量拓扑

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 段。