网络原理

Kubernetes 网络是集群内部通信的核心机制,它确保了 Pod、Service、Node 之间能够高效、可靠地通信。K8s 网络模型定义了四个基本要求:

  • 所有 Pod 都可以在不使用 NAT 的情况下直接通信
  • 所有 Node 都可以在不使用 NAT 的情况下与所有 Pod 通信
  • Pod 看到的 IP 地址与其它 Pod 看到的该 Pod 的 IP 地址相同
  • 每个 Pod 的 IP 都是唯一的,不会与其他 Pod 冲突
网络通信模型
graph TB
    subgraph "K8s 集群"
        subgraph "Master"
            APIS[API Server]
        end
        
        subgraph "Node 1"
            P1[Pod 1]
            P2[Pod 2]
            K1[kubelet]
            C1[Container Runtime]
            PRC1[Pod 网络容器]
        end
        
        subgraph "Node 2"
            P3[Pod 3]
            P4[Pod 4]
            K2[kubelet]
            C2[Container Runtime]
            PRC2[Pod 网络容器]
        end
        
        subgraph "网络插件"
            NP[CNI 网络插件]
        end
        
        subgraph "物理网络"
            LB[负载均衡器]
            EXTERNAL[外部网络]
        end
    end
    
    P1 <--> PRC1
    P2 <--> PRC1
    P3 <--> PRC2
    P4 <--> PRC2
    
    PRC1 <--> NP
    PRC2 <--> NP
    
    P1 <--> P3
    P2 <--> P4
    
    APIS <--> P1
    APIS <--> P4
    
    NP <--> LB
    LB <--> EXTERNAL
                                
四种网络通信场景
容器到容器

同一个 Pod 内的容器通过 localhost 通信,共享网络命名空间

Pod 到 Pod

不同 Node 上的 Pod 通过底层网络插件实现通信

Pod 到 Service

通过 kube-proxy 和 iptables/iptables 规则实现负载均衡

外部到 Service

通过 NodePort、LoadBalancer 或 Ingress 暴露服务到外部

CNI (Container Network Interface) 插件
插件特点适用场景
Flannel简单易用,支持 VXLAN、UDP 等多种后端中小型集群,简单网络需求
Calico基于 BGP 的纯三层网络,支持网络策略对安全和性能要求高的场景
Weave自愈能力强,支持网络加密需要网络加密的场景
Cilium基于 eBPF,性能优异,支持 L7 策略对性能和安全要求极高的场景
Service 网络实现原理
graph LR
    subgraph "Client Pod"
        C[客户端请求]
    end
    
    C --> S[Service Virtual IP]
    
    subgraph "kube-proxy (iptables 模式)"
        IP[iptables 规则]
    end
    
    S --> IP
    
    IP --> P1[Pod 1]
    IP --> P2[Pod 2]
    IP --> P3[Pod 3]
    
    subgraph "Endpoints"
        EP[Pod IP 列表]
    end
    
    EP -.-> IP
                                
ClusterIP 服务通信
  • 为 Service 分配集群内部虚拟 IP
  • 通过 kube-proxy 实现负载均衡
  • 仅集群内部可访问
NodePort 服务通信
  • 在每个节点上开放端口
  • 外部通过 NodeIP:NodePort 访问
  • 实际流量仍路由到 ClusterIP
网络策略 (Network Policy)
graph TD
    subgraph "Namespace A"
        PA1[Pod A1]
        PA2[Pod A2]
    end
    
    subgraph "Namespace B"
        PB1[Pod B1]
        PB2[Pod B2]
    end
    
    subgraph "Network Policy"
        NP["策略: A1 可访问 B1"]
    end
    
    PA1 <--> PB1

    PA2 -. "被阻止" .- PB2
    PA1 -. "被阻止" .- PB2
    PA2 -. "被阻止" .- PB1
    
    NP --> PA1
    NP --> PB1
                                
策略类型说明配置示例
入口策略控制哪些流量可以进入 Podspec.ingress
出口策略控制 Pod 可以访问哪些外部资源spec.egress
选择器定义策略适用的 Podspec.podSelector
网络故障排查
# 检查 Pod 网络配置
kubectl exec -it <pod-name> -- ip addr show
# 测试 Pod 间连通性
kubectl exec -it <pod-name> -- ping <target-pod-ip>
# 查看 Service 规则
kubectl get endpoints <service-name>
# 检查 iptables 规则(Node 级别)
sudo iptables -L -t nat | grep KUBE
# 检查网络策略
kubectl get networkpolicy