Ubuntu 上搭建 Kubernetes 网络的实操指南
一 基础环境准备
- 关闭 Swap(Kubernetes 不支持):执行 sudo swapoff -a,并在 /etc/fstab 中注释 swap 行以永久生效。
- 加载内核模块:sudo modprobe overlay 与 sudo modprobe br_netfilter。
- 开启桥接与转发:
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF
sudo sysctl --system
- 容器运行时与 cgroup 驱动:安装 Docker 并配置 systemd 驱动(/etc/docker/daemon.json 中添加 “exec-opts”: [“native.cgroupdriver=systemd”],重启 Docker)。
- 安装组件:在所有节点安装 kubelet、kubeadm、kubectl,并 sudo apt-mark hold 锁定版本,避免自动升级引发兼容性问题。
- 节点互通与端口放行:确保 Master/Worker 节点间网络互通,按需放行关键端口(如 6443、10250 等)或使用安全组策略。
二 初始化集群与 kubectl 配置
- 仅在 Master 节点执行初始化,并指定与所选 CNI 插件匹配的 Pod 网段(常见为 10.244.0.0/16 或 192.168.0.0/16):
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
- 配置 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 init 输出中的 kubeadm join 命令在各 Worker 节点执行,完成后等待节点状态变为 Ready。
三 安装网络插件 CNI
- 选择并部署一种 CNI 插件(仅部署一种,避免冲突):
| 插件 |
适用场景 |
安装要点 |
| Calico |
中大规模、需要细粒度策略 |
kubectl apply -f https://docs.projectcalico.org/v3.26/manifests/calico.yaml;若 Pod 网段非默认,修改清单中的 CALICO_IPV4POOL_CIDR;双网卡可设置 IP_AUTODETECTION_METHOD: “interface=eth0” |
| Flannel |
快速搭建、中小规模 |
使用最新稳定清单(如 v0.22.0):curl -O https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml && kubectl apply -f kube-flannel.yml;同二层网段可将 Backend.Type 由 vxlan 改为 host-gw 提升性能 |
| Cilium |
高性能、基于 eBPF、可替代 kube-proxy |
通过 Helm 安装:helm repo add cilium https://helm.cilium.io/ && helm install cilium cilium/cilium --namespace kube-system --set kubeProxyReplacement=true(按需设置 k8sServiceHost/k8sServicePort) |
- 部署完成后确认相关 Pod 均为 Running:kubectl get pods -n kube-system | grep -E ‘calico|flannel|cilium’。
四 验证与连通性测试
- 节点状态:kubectl get nodes(应为 Ready)。
- 插件状态:kubectl get pods -n kube-system(确保 CNI 相关 Pod 正常)。
- Pod 连通性:
- 启动测试应用:kubectl run nginx --image=nginx --port=80
- 获取 Pod IP:POD_IP=$(kubectl get pod nginx -o jsonpath=‘{.status.podIP}’)
- 从其他 Pod 访问:kubectl run test-pod --image=busybox --rm -it – wget -qO- http://$POD_IP
- 外部访问:为 Service 配置 NodePort/LoadBalancer/Ingress 后从集群外部访问验证。
五 常见问题与优化
- Pod 网段一致性:kubeadm init 的 –pod-network-cidr 必须与 CNI 配置一致(如 10.244.0.0/16 或 192.168.0.0/16),否则会导致跨节点不通。
- 双网卡/多网卡:在 Calico 中设置 IP_AUTODETECTION_METHOD 指定主网卡(如 interface=eth0)。
- 性能优化:同二层网络下 Flannel 可将 vxlan 切换为 host-gw;Cilium 启用 eBPF 可提升转发与策略性能。
- 安全策略:按需启用 NetworkPolicy(Calico 或 Cilium 均支持),限制命名空间/Pod 间访问。
- 防火墙策略:测试环境可临时关闭 ufw,生产环境应配置精确放行规则,确保 6443、10250 等端口与节点间通信正常。