温馨提示×

如何在Linux上配置Kubernetes网络

小樊
45
2025-11-18 19:37:18
栏目: 智能运维

Linux 上配置 Kubernetes 网络的实操指南

一 前置条件与网络模型

  • 前置条件
    • 已用 kubeadm 初始化集群,节点间 IP 互通,并已完成 容器运行时(如 containerd/Docker) 的安装与启动。
    • 已关闭 Swap(执行 swapoff -a 并注释 /etc/fstab 中的 swap 行),否则 kubelet 可能无法正常调度。
    • 已开启内核转发与桥接流量入 iptables 链:
      • 写入:/etc/sysctl.d/k8s.conf
        • net.bridge.bridge-nf-call-ip6tables = 1
        • net.bridge.bridge-nf-call-iptables = 1
        • net.ipv4.ip_forward = 1
      • 生效:sysctl --system
  • 网络模型要点
    • 每个 Pod 拥有独立 IP,Pod 之间、Pod 到 Service 之间在集群内可直接通信。
    • 跨节点通信依赖 CNI 网络插件(如 Flannel、Calico、Cilium)完成 Pod 网段 分配与跨主机转发。

二 使用 kubeadm 初始化并指定 Pod 网段

  • 初始化控制平面(示例将 Pod 网段设为 10.244.0.0/16,与 Flannel 默认一致):
    • 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
  • 加入工作节点(使用 kubeadm init 输出中的 tokenhash):
    • kubeadm join <APISERVER_IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  • 提示
    • 若计划使用 Calico,可在初始化时选择与其默认 192.168.0.0/16 不同的 Pod 网段(如 10.244.0.0/16),并在 Calico 清单中显式设置 CALICO_IPV4POOL_CIDR 与之匹配。

三 部署主流 CNI 网络插件

  • Flannel(轻量、Overlay,适合中小规模或开发测试)
    • 安装:kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
    • 同网段优化:编辑清单将 net-conf.json"Backend":{"Type":"vxlan"} 改为 "host-gw" 可提升性能(要求二层直连)。
  • Calico(三层 BGP、策略丰富,适合中大规模与高安全场景)
    • 安装清单:curl -O https://docs.projectcalico.org/v3.26/manifests/calico.yaml
    • 自定义 Pod 网段:在清单中设置环境变量 CALICO_IPV4POOL_CIDR: "10.244.0.0/16"(与 kubeadm init --pod-network-cidr 保持一致)。
    • 多网卡指定主网卡:设置 IP_AUTODETECTION_METHOD: "interface=eth0"(将 eth0 替换为实际主网卡名)。
  • Cilium(基于 eBPF,高性能与可观测,适合大规模与高性能场景)
    • 要求:内核 ≥ 5.4,建议 Ubuntu 20.04+CentOS Stream 9
    • 安装(Helm):
      • helm repo add cilium https://helm.cilium.io/
      • helm install cilium cilium/cilium --version 1.14.0 --namespace kube-system --set k8sServiceHost=<APISERVER_IP> --set k8sServicePort=6443
      • 如需由 Cilium 替代 kube-proxy,可追加 --set kubeProxyReplacement=true
  • 通用验证
    • 查看插件组件运行状态(如 kubectl get pods -n kube-flannelkubectl get pods -n calico-systemkubectl get pods -n kube-system -l k8s-app=cilium)。
    • 在不同节点分别创建测试 Pod,通过 Pod IP 互相访问验证跨节点连通性。

四 验证与常见问题排查

  • 基础连通性验证
    • 查看节点与系统 Pod:kubectl get nodeskubectl get pods -A
    • 运行测试服务:kubectl run nginx --image=nginx --port=80
    • 获取 Pod IP:kubectl get pod nginx -o jsonpath='{.status.podIP}'
    • 跨节点访问:kubectl run test-pod --image=busybox --rm -it -- wget -qO- http://<NGINX_POD_IP>
  • 常见问题与要点
    • 节点 NotReady:通常未部署 CNI 或 Pod 网段不匹配(如 Flannel 默认 10.244.0.0/16,Calico 默认 192.168.0.0/16),需统一网段并重新部署插件。
    • 清单冲突:确保集群中仅部署 一个 CNI 插件,避免冲突。
    • 防火墙与安全组:生产环境不建议直接关闭防火墙,应放行 CNI/节点通信所需端口(如 BGP 179Calico 5473 等),具体端口以所用插件文档为准。

0