3. 环境搭建与部署:使用 Kind 或 K3s 快速搭建 Cilium 实验环境

在开始 Cilium 网络策略与 Serverless 性能调优之前,一个稳定、可复现的实验环境是基础。本章将指导你使用 Kind(Kubernetes in Docker)和 K3s(轻量级 Kubernetes)两种方式快速搭建 Cilium 环境,并验证安装状态。Kind 适合本地开发与 CI/CD 场景,K3s 则更贴近边缘或资源受限环境。

3.1 环境准备与工具链

无论选择哪种方式,都需要提前安装以下核心工具:

工具 版本要求 用途
Docker ≥ 20.10 容器运行时,Kind 依赖 Docker 运行集群节点
kubectl ≥ 1.26 与 Kubernetes API 交互
helm ≥ 3.10 部署 Cilium 及其依赖
cilium-cli ≥ 0.15 安装、管理和诊断 Cilium
版本对齐建议: 本课程所有示例基于 Cilium 1.14+ 和 Kubernetes 1.27+。使用 cilium version 和 kubectl version 确认版本兼容性。

3.2 方式一:使用 Kind 搭建 Cilium 集群

Kind 将 Kubernetes 节点运行在 Docker 容器中,非常适合快速启动和销毁实验环境。以下步骤将创建一个 3 节点集群并部署 Cilium。

3.2.1 创建 Kind 集群配置文件

创建一个 kind-config.yaml,显式禁用默认的 CNI(如 flannel),为 Cilium 预留网络控制权:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker
networking:
  disableDefaultCNI: true
  podSubnet: "10.244.0.0/16"
  serviceSubnet: "10.96.0.0/12"

3.2.2 启动集群并安装 Cilium

# 创建集群
kind create cluster --config kind-config.yaml --name cilium-lab

# 使用 cilium-cli 安装 Cilium
cilium install --version 1.14.5 \
  --set ipam.mode=kubernetes \
  --set kubeProxyReplacement=strict \
  --set routingMode=native \
  --set autoDirectNodeRoutes=true
关键参数说明:
  • kubeProxyReplacement=strict:完全替换 kube-proxy,发挥 eBPF 最大性能。
  • routingMode=native:使用原生路由模式,避免隧道封装开销。
  • autoDirectNodeRoutes=true:自动配置节点间直连路由。

3.3 方式二:使用 K3s 搭建 Cilium 集群

K3s 是 Rancher 出品的轻量级 Kubernetes,默认使用 flannel 和 SQLite。我们需要替换 CNI 为 Cilium。

3.3.1 安装 K3s 并禁用默认 CNI

curl -sfL https://get.k3s.io | \
  INSTALL_K3S_EXEC="--flannel-backend=none --disable-network-policy" \
  sh -s - --write-kubeconfig-mode 644

# 等待 K3s 就绪
kubectl wait --for=condition=Ready node --all --timeout=120s

3.3.2 部署 Cilium 到 K3s

# 使用 helm 安装 Cilium,指定 K3s 的 kubeconfig 路径
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

helm repo add cilium https://helm.cilium.io/
helm repo update

helm install cilium cilium/cilium --version 1.14.5 \
  --namespace kube-system \
  --set ipam.mode=kubernetes \
  --set kubeProxyReplacement=disabled \
  --set routingMode=native \
  --set autoDirectNodeRoutes=true \
  --set bpf.masquerade=true
K3s 注意事项: K3s 默认自带 kube-proxy,因此设置 kubeProxyReplacement=disabled 避免冲突。若需完全替换,需额外配置 K3s 的 --disable-kube-proxy 参数。

3.4 验证 Cilium 安装状态

安装完成后,通过以下命令验证 Cilium 是否正常运行:

3.4.1 检查 Pod 状态

kubectl -n kube-system get pods -l k8s-app=cilium

预期输出显示所有 Cilium agent Pod 处于 Running 状态,且 Ready 列为 1/1。

3.4.2 使用 cilium status 诊断

cilium status --wait

该命令会输出集群健康概览,包括 KVStore、容器运行时、CNI 配置等关键组件状态。

3.4.3 验证 eBPF 与网络连通性

# 运行内置连接测试
cilium connectivity test

# 查看 Cilium 端点列表
kubectl exec -n kube-system ds/cilium -- cilium endpoint list
快速健康检查: 若 cilium status 显示 Health: OK 且 connectivity test 全部通过,则环境搭建成功。

3.5 环境架构总览

下图展示了 Kind 和 K3s 两种方式下 Cilium 的核心组件与数据流关系:

Cilium 实验环境架构图 Cilium 实验环境核心组件与数据流 Kind 集群 (Docker 容器节点) Control Plane kube-apiserver / etcd Worker Node 1 Cilium Agent + eBPF Worker Node 2 Cilium Agent + eBPF K3s 集群 (轻量级) Server Node kube-apiserver / SQLite Agent Node 1 Cilium Agent + eBPF Agent Node 2 Cilium Agent + eBPF 核心数据流 Pod → Cilium Agent (eBPF) → 内核网络栈 → 目标 Pod/Service

3.6 环境对比与选型建议

维度 Kind K3s
启动速度 快(约 2-3 分钟) 极快(约 1 分钟)
资源占用 中等(每个节点一个容器) 低(单二进制文件)
kube-proxy 替换 支持完全替换(strict 模式) 需额外配置或保持 disabled
适用场景 本地开发、CI/CD、多节点测试 边缘计算、资源受限环境、快速原型
持久化存储 容器重启后丢失 支持嵌入式 SQLite 持久化
选型建议: 本课程后续章节的网络策略实验推荐使用 Kind,因其对 kube-proxy 替换的支持更完整,能充分展示 Cilium 的 eBPF 能力。Serverless 性能调优实验则推荐 K3s,更贴近生产环境的资源约束。

3.7 常见问题与排错

  • Cilium Pod 一直处于 Pending 状态:检查节点是否满足 kernel >= 4.19 且启用了 CONFIG_BPF 相关内核选项。使用 cilium sysdump 收集诊断信息。
  • connectivity test 失败:确认 disableDefaultCNI: true 已生效,且没有其他 CNI 冲突。检查 cilium status 中的 K8s datapath 状态。
  • K3s 中 Cilium 无法启动:确保 K3s 的 --flannel-backend=none 参数正确传递,且 /var/lib/rancher/k3s/server/manifests/ 下没有残留的 flannel 配置。
快速重置环境: Kind 使用 kind delete cluster --name cilium-lab;K3s 使用 /usr/local/bin/k3s-uninstall.sh 即可完全清理。