3. 环境准备:部署Kubernetes集群与Cilium安装

本章是实战课程的基石。在开始调度优化与网络拓扑排查之前,必须搭建一个可观测、可复现的实验环境。我们将采用kubeadm部署生产级集群,同时提供minikube作为轻量级备选方案,并完成Cilium CLI与Helm的安装配置。

3.1 环境概览与组件清单

下表列出了本次实验所需的核心组件及其版本要求(以Ubuntu 22.04 LTS为基础环境):

组件 版本/要求 用途
操作系统 Ubuntu 22.04 LTS / Rocky Linux 9 节点基础环境
容器运行时 containerd 1.7.x 容器生命周期管理
Kubernetes v1.28.x / v1.29.x 集群编排
kubeadm 对应K8s版本 集群初始化工具
Cilium v1.15.x / v1.16.x CNI & 网络可观测
Cilium CLI v0.16.x 命令行诊断工具
Helm v3.14.x Chart包管理
版本选择建议: 推荐使用K8s v1.29 + Cilium v1.16组合,该组合对eBPF新特性(如BIG TCP、带宽管理器)支持最完整,且与后续章节的指标采集场景兼容性最佳。

3.2 部署Kubernetes集群(kubeadm方式)

kubeadm是生产环境最常用的集群部署工具。以下步骤在1个控制平面节点 + 2个工作节点上执行。

3.2.1 前置条件配置

所有节点执行:

# 关闭swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 加载内核模块
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

sudo sysctl --system

3.2.2 安装containerd与kubeadm

# 安装containerd
sudo apt-get update
sudo apt-get install -y containerd

# 配置containerd使用systemd cgroup驱动
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd

# 安装kubeadm、kubelet、kubectl
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

3.2.3 初始化控制平面

在控制平面节点执行:

# 初始化集群(跳过CNI安装,后续由Cilium接管)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --skip-phases=addon/kube-proxy

# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 查看节点状态
kubectl get nodes
关键参数说明: --skip-phases=addon/kube-proxy 是Cilium部署的最佳实践。Cilium内置kube-proxy替代功能(kubeProxyReplacement),跳过传统kube-proxy可减少iptables规则数量,提升网络性能。

3.2.4 工作节点加入

在控制平面节点获取加入令牌,然后在每个工作节点执行:

# 控制平面节点执行
kubeadm  create --print-join-command

# 输出示例:
# kubeadm join 192.168.1.10:6443 -- xxxxx --discovery--ca-cert-hash sha256:xxxxx

# 工作节点执行上述命令
sudo kubeadm join 192.168.1.10:6443 -- xxxxx --discovery--ca-cert-hash sha256:xxxxx

3.3 备选方案:minikube部署

对于资源受限或单机开发场景,minikube是快速搭建测试环境的理想选择:

# 安装minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 启动集群(指定CNI为none,后续安装Cilium)
minikube start --cni=false --kubernetes-version=v1.29.0

# 验证集群
kubectl get nodes
minikube vs kubeadm: minikube适合单节点快速原型验证;kubeadm适合多节点、生产级场景。本课程后续的调度与网络拓扑排查实验,建议使用kubeadm部署的3节点集群以获得完整的网络拓扑视图。

3.4 安装Cilium CLI

Cilium CLI是诊断网络策略、Service映射、eBPF程序状态的核心工具:

# 下载并安装Cilium CLI
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

# 验证安装
cilium version

3.5 Helm部署Cilium

使用Helm Chart部署Cilium,可以灵活配置网络、可观测性与安全策略:

# 添加Cilium Helm仓库
helm repo add cilium https://helm.cilium.io/
helm repo update

# 部署Cilium(启用Hubble与指标采集)
helm install cilium cilium/cilium --version 1.16.0 \
  --namespace kube-system \
  --set kubeProxyReplacement=true \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true \
  --set hubble.metrics.enabled="{dns,drop,tcp,flow,icmp,http}" \
  --set hubble.metrics.destinationLabelMethod="cidr" \
  --set ipam.mode=cluster-pool \
  --set ipam.operator.clusterPoolIPv4PodCIDRList="10.244.0.0/16"

# 等待Cilium就绪
cilium status --wait

# 验证所有Pod运行正常
kubectl -n kube-system get pods -l k8s-app=cilium
关键配置解读:
  • kubeProxyReplacement=true:完全替代kube-proxy,减少网络跳数。
  • hubble.metrics.enabled:开启DNS、丢弃、TCP、流、ICMP、HTTP指标,为后续告警分层提供数据源。
  • ipam.mode=cluster-pool:使用ClusterPool IPAM模式,Pod CIDR自动分配。

3.6 部署架构总览

下图展示了完成环境准备后的整体部署架构:

Cilium环境部署架构总览 控制平面节点 kube-apiserver kube-controller-manager kube-scheduler 工作节点1 Cilium Agent Hubble Relay 应用Pod 工作节点2 Cilium Agent Hubble Relay 应用Pod Hubble UI 网络流量可视化 kube-system命名空间 Prometheus 指标采集 Cilium Metrics端点 告警分层 Grafana Alerting 告警规则 部署关键说明 • kubeProxyReplacement=true:Cilium完全替代kube-proxy • Hubble Metrics:开启dns,drop,tcp,flow,icmp,http指标 • IPAM:ClusterPool模式,Pod CIDR自动分配

3.7 验证部署

部署完成后,执行以下验证命令确保环境正常:

# 1. 检查Cilium Agent状态
kubectl -n kube-system exec -it ds/cilium -- cilium status

# 2. 检查Hubble Relay连接
cilium hubble port-forward &
hubble status

# 3. 测试Pod间网络连通性
kubectl run test-pod --image=busybox -- sleep 3600
kubectl exec -it test-pod -- ping -c 3 10.244.1.2

# 4. 查看Hubble UI
cilium hubble ui

# 5. 验证指标端点
kubectl -n kube-system get svc -l k8s-app=cilium
常见问题排查:
  • 如果Cilium Agent处于CrashLoopBackOff状态,检查cilium status --verbose查看eBPF相关错误。
  • 如果Pod间网络不通,检查CiliumNetworkPolicy是否误拦截,使用hubble observe查看流量丢弃原因。
  • 如果Hubble UI无法访问,确认hubble.relay.enabled=true已正确设置。

3.8 环境清理与重置

如需重置环境重新部署:

# 卸载Cilium
helm uninstall cilium -n kube-system

# 重置kubeadm集群(控制平面节点执行)
sudo kubeadm reset --force
sudo rm -rf /etc/cni/net.d /var/lib/cni /var/lib/kubelet /var/lib/etcd

# 清理iptables规则
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F

# 工作节点只需执行kubeadm reset
sudo kubeadm reset --force