跨集群调度etcd压测沙盘性能调优与Cilium故障排查 - 第1节

1.1 跨集群调度背景:为什么需要打破单集群边界?

在单 Kubernetes 集群中,所有工作负载共享同一套控制面(etcd、API Server、Scheduler)和同一组节点资源。当业务规模增长或需要满足地理分布、容灾隔离、合规要求时,单集群架构会暴露出以下瓶颈:

维度 单集群瓶颈 跨集群调度的价值
控制面容量 etcd 存储上限约 8GB,超过 5000 节点后性能急剧下降 拆分多个小集群,每个集群控制面独立,避免单点过载
故障域 etcd 脑裂或 API Server 故障导致整个集群不可用 跨集群调度可将工作负载分散到不同故障域,实现单元化容灾
网络延迟 所有 Pod 通信经过同一 CNI 平面,跨 AZ 延迟不可控 按地域就近调度,Pod 与用户或数据源同区域部署
资源碎片 单集群内节点规格混杂,碎片率可达 30% 以上 跨集群聚合异构资源,将批处理任务调度到空闲集群
合规与租户隔离 Namespace 隔离无法满足数据驻留、PCI-DSS 等硬性要求 不同集群承载不同合规等级的工作负载,调度策略按集群绑定
核心结论:跨集群调度不是替代单集群,而是在单集群之上构建一层调度抽象层,将多个集群视为统一的资源池,按策略分发工作负载。

1.2 etcd 在 Kubernetes 中的核心地位

etcd 是 Kubernetes 控制面的“状态数据库”,所有集群对象(Pod、Service、ConfigMap、Secret、Node 信息等)都存储在 etcd 中。其性能直接决定了整个集群的响应速度和稳定性。

1.2.1 etcd 在 K8s 架构中的位置

Kubernetes 控制面组件与 etcd 关系图 etcd 集群 Raft 共识 · 3/5 节点 kube-apiserver 唯一与 etcd 交互的组件 kube-scheduler 读取 Node/Pod 状态 kube-controller-manager 监听并调谐期望状态 kubelet (Node1) 上报 Pod/Node 状态 kube-proxy (Node2) 同步 Service 规则 所有控制面组件均通过 API Server 间接读写 etcd,etcd 是集群状态的唯一权威来源

1.2.2 etcd 性能关键指标

指标 推荐值 超出后的影响
DB 总大小 < 8 GB 超过后 WAL 压缩变慢,读写延迟飙升
每秒写入请求 (QPS) < 10,000 超出后 follower 日志复制落后,触发 leader 切换
请求延迟 (P99) < 10 ms 超过 100ms 时 API Server 清单缓存失效,调度器决策延迟
磁盘 fsync 延迟 < 10 ms SSD 性能不足直接导致 Raft 心跳超时,集群脑裂
压测重点:本课程沙盘将使用 etcd 性能压测工具模拟高 QPS 写入场景,观察 etcd 在极限负载下的行为,并验证调优措施(如调整心跳间隔、快照策略、磁盘 I/O 隔离)的实际效果。

1.3 Cilium 网络组件简介

Cilium 是基于 eBPF 的 CNI 插件,在 Kubernetes 网络模型中承担数据平面和控制平面的双重角色。与传统的 iptables 模式不同,Cilium 将网络策略、负载均衡、可观测性下沉到内核 eBPF 程序中执行。

1.3.1 Cilium 核心组件

Cilium 组件架构与数据流 Cilium Agent (DaemonSet) 每节点运行,管理 eBPF 程序 Cilium Operator (Deployment) 集群级资源协调与 IPAM Cilium CLI / Hubble 可观测性与故障排查 eBPF 程序 (内核态) XDP / TC hook 处理数据包 Cilium CNI 插件 Pod 网络创建与 IP 分配 Cilium Endpoint 管理器 维护 Pod 身份与策略映射 关键设计:Cilium 将网络策略执行点从 iptables 规则链迁移到 eBPF 程序 每个数据包仅需在内核中执行少量 eBPF 指令,无需遍历大量 iptables 规则 这使得 Cilium 在 Pod 密度 100+ / 节点时仍能保持微秒级延迟

1.3.2 Cilium 在跨集群场景中的角色

  • 集群间网络连通:通过 Cluster Mesh 功能,Cilium 可以在多个集群之间建立加密隧道(WireGuard / IPsec),实现 Pod IP 直通。
  • 全局服务发现:结合 ExternalDNS 或 Cilium 的 Service 映射,跨集群服务可以通过统一 DNS 名称访问。
  • 网络策略统一管理:使用 CiliumNetworkPolicy CRD,可以编写跨集群的网络隔离规则,不受集群边界限制。
  • 故障排查利器:Hubble 提供完整的流量日志和 Service Map,帮助定位跨集群通信中的丢包、延迟、策略拒绝等问题。

1.4 沙盘环境快速部署:Kind + Multipass

本课程使用两种沙盘方案,覆盖本地开发与多节点模拟两种场景:

方案 适用场景 节点数 资源要求 部署耗时
Kind (Kubernetes in Docker) 本地快速验证、单机多集群 1 控制面 + 1~3 worker 4 vCPU / 8 GB RAM 3~5 分钟
Multipass (Ubuntu VM) 模拟真实节点、跨主机网络 2~5 个独立 VM 8 vCPU / 16 GB RAM 10~15 分钟

1.4.1 Kind 部署命令(单集群)

# 1. 创建 Kind 配置文件
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker
EOF

# 2. 创建集群
kind create cluster --config kind-config.yaml --name k8s-sandbox

# 3. 验证集群状态
kubectl cluster-info --context kind-k8s-sandbox
kubectl get nodes -o wide

1.4.2 Multipass 部署命令(多节点)

# 1. 创建 3 个 Ubuntu VM
for i in 1 2 3; do
  multipass launch 22.04 --name node$i --cpus 2 --memory 4G --disk 20G
done

# 2. 在 node1 上安装 K8s 控制面
multipass exec node1 -- bash -c "
  curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
"

# 3. 获取加入  并让 node2/node3 加入
=$(multipass exec node1 sudo cat /var/lib/rancher/k3s/server/node-)
SERVER_IP=$(multipass info node1 | grep IPv4 | awk '{print $2}')

for i in 2 3; do
  multipass exec node$i -- bash -c "
    curl -sfL https://get.k3s.io | K3S_URL=https://$SERVER_IP:6443 K3S_=$ sh -
  "
done

# 4. 验证集群
multipass exec node1 -- kubectl get nodes
沙盘选择建议:如果仅用于学习跨集群调度和 etcd 压测,Kind 足够;如果需要模拟 Cilium Cluster Mesh 跨主机网络故障,建议使用 Multipass 创建至少 2 个独立集群。

1.5 本章小结

  • 跨集群调度解决了单集群在容量、故障域、延迟、合规方面的硬性限制。
  • etcd 是 K8s 控制面的性能瓶颈点,压测与调优是 SRE 必备技能。
  • Cilium 通过 eBPF 提供高性能网络,在跨集群场景中承担连通、策略、可观测性三重角色。
  • 沙盘环境已就绪,下一章将进入 etcd 压测工具选型与基准测试。