Skip to content

Kubernetes 网络

最后更新: February 22, 2026

概述

Kubernetes 网络是支持容器化应用程序之间通信的核心基础设施层。本节涵盖从基本 Kubernetes 网络概念到高级 CNI(Container Network Interface)解决方案,以及 AWS EKS 环境中的网络模式等所有内容。

Kubernetes 网络模型

Kubernetes 基于以下网络要求进行设计:

  1. 每个 Pod 都可以无需 NAT 与其他任何 Pod 通信
  2. 每个 Node 都可以无需 NAT 与每个 Pod 通信
  3. Pod 看到的自身 IP 与其他对象看到的该 Pod IP 相同

Pod 网络

Pod 网络是 Kubernetes 网络中最基础的层。每个 Pod 都拥有唯一的 IP 地址,并且可以直接与集群中的所有其他 Pod 通信。

Pod 网络实现方式

方法描述CNI 示例
Overlay Network构建在现有网络之上的虚拟网络Flannel (VXLAN), Calico (IPIP), Weave Net
Underlay Network在物理网络上直接路由AWS VPC CNI, Calico (BGP), Cilium (Native Routing)
Hybrid根据环境选择 overlay/underlayCilium, Calico

Service 网络

Service 为一组 Pod 提供稳定的网络端点。

Service 类型特性

yaml
# ClusterIP Service Example
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
# NodePort Service Example
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30080  # Range: 30000-32767
---
# LoadBalancer Service Example
apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 443
      targetPort: 8443

Ingress 网络

Ingress 定义将 HTTP/HTTPS 流量路由到集群内部 Service 的规则。

yaml
# Ingress Example
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "alb"
    alb.ingress.kubernetes.io/scheme: "internet-facing"
spec:
  rules:
    - host: api.example.com
      http:
        paths:
          - path: /v1
            pathType: Prefix
            backend:
              service:
                name: api-v1
                port:
                  number: 80
          - path: /v2
            pathType: Prefix
            backend:
              service:
                name: api-v2
                port:
                  number: 80
    - host: web.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-frontend
                port:
                  number: 80

CNI(Container Network Interface)

CNI 是用于容器网络连接的标准接口。Kubernetes 通过 CNI 插件实现 Pod 网络。

CNI 的工作原理

CNI 插件组件

CNI 对比矩阵

主要 CNI 解决方案对比

特性CiliumCalicoFlannelAWS VPC CNIWeave Net
核心技术eBPFiptables/eBPFVXLAN/host-gwAWS ENIVXLAN
Network Policy高级(L3-L7)高级(L3-L4)基础(L3-L4)基础
加密WireGuard/IPsecWireGuard/IPsec内置
Service Mesh内置
可观测性Hubble有限
BGP 支持
多集群ClusterMeshFederation
Windows 支持Beta
性能优秀非常好良好优秀良好
复杂度中等偏高中等
社区活跃非常活跃活跃AWS 支持一般

详细功能对比

网络模式

CNIOverlay原生路由BGP直接路由
CiliumVXLAN, Geneve
CalicoVXLAN, IPIP
FlannelVXLANhost-gw
AWS VPC CNIVPC 原生
Weave NetVXLAN

Network Policy 功能

特性CiliumCalicoAWS VPC CNI
Ingress Policy
Egress Policy
L7 Policy (HTTP)
基于 DNS 的 Policy
FQDN Policy
Host Policy
全局 Policy
Policy 层级

性能基准测试(相对比较)

CNI 选型指南

决策流程图

按使用场景推荐 CNI

1. AWS EKS 生产环境

推荐:AWS VPC CNI + Calico(Network Policy)

yaml
# eksctl cluster configuration example
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: production-cluster
  region: ap-northeast-2
vpc:
  cidr: "10.0.0.0/16"
addons:
  - name: vpc-cni
    version: latest
    configurationValues: |
      enableNetworkPolicy: "true"
  - name: coredns
  - name: kube-proxy

2. 高级安全要求

推荐:Cilium

  • 支持 L7 Network Policy
  • 基于 DNS 的 Policy
  • 进程/文件级安全 Policy
  • 加密通信(WireGuard)

3. 本地部署/裸机环境

推荐:Calico(BGP 模式)

  • 与现有网络基础设施集成
  • 与 ToR 交换机进行 BGP 对等连接
  • 高性能(无 overlay)

4. 开发/测试环境

推荐:Flannel

  • 简单的安装和配置
  • 资源使用量低
  • 基础功能足够

5. Service Mesh 集成环境

推荐:Cilium(无 Sidecar Service Mesh)

  • 可替代 Istio/Envoy
  • mTLS、流量管理
  • 开销低

EKS 网络基础

EKS 默认网络架构

VPC CNI 的工作原理

AWS VPC CNI 为每个 Pod 分配实际的 VPC IP 地址。

ENI 和 IP 限制

实例类型最大 ENI 数每个 ENI 的 IPv4 数最大 Pod 数(推荐)
t3.medium3617
t3.large31235
m5.large31029
m5.xlarge41558
m5.2xlarge41558
c5.4xlarge830234

EKS 网络注意事项

IP 地址管理

yaml
# VPC CNI Configuration - IP Prefix Delegation
apiVersion: v1
kind: ConfigMap
metadata:
  name: amazon-vpc-cni
  namespace: kube-system
data:
  enable-prefix-delegation: "true"
  warm-prefix-target: "1"
  minimum-ip-target: "5"
  warm-ip-target: "2"

自定义网络

yaml
# ENIConfig for Custom Subnets
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
  name: us-east-1a
spec:
  securityGroups:
    - sg-0123456789abcdef0
  subnet: subnet-0123456789abcdef0
---
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
  name: us-east-1b
spec:
  securityGroups:
    - sg-0123456789abcdef0
  subnet: subnet-fedcba9876543210f

网络子页面

本节详细介绍以下主题:

VPC CNI

默认 EKS CNI。为每个 Pod 分配 VPC IP,以实现原生 VPC 网络。

Cilium 深入解析

基于 eBPF 的高性能 CNI 解决方案。提供 L7 Network Policy、Service Mesh 和可观测性(Hubble)等高级功能。

Calico 深入解析

最广泛使用的 CNI 之一。具备强大的 Network Policy、BGP 支持和企业级功能。涵盖介绍、架构、网络模式、BGP 深入解析、Network Policy、eBPF、高级主题、EKS 集成和运维指南。

VPC Lattice

AWS 托管的应用程序网络服务。支持跨 VPC、跨账户的服务间通信。

AWS Load Balancer Controller

将 Kubernetes Service 和 Ingress 与 AWS ELB(ALB/NLB)集成。

Gateway API

下一代 Kubernetes ingress API。标准化的资源模型和基于角色的配置。

网络故障排除

常见问题和解决方案

Pod 间通信失败

bash
# 1. Check Pod IPs
kubectl get pods -o wide

# 2. Test network connectivity
kubectl exec -it <pod-name> -- ping <target-pod-ip>

# 3. Test DNS resolution
kubectl exec -it <pod-name> -- nslookup <service-name>

# 4. Check CNI logs
kubectl logs -n kube-system -l k8s-app=aws-node
kubectl logs -n kube-system -l k8s-app=cilium

Service 无法访问

bash
# 1. Check Service status
kubectl get svc <service-name> -o yaml

# 2. Check Endpoints
kubectl get endpoints <service-name>

# 3. Check kube-proxy logs
kubectl logs -n kube-system -l k8s-app=kube-proxy

Network Policy 调试

bash
# For Cilium
kubectl exec -n kube-system -it <cilium-pod> -- cilium policy get
kubectl exec -n kube-system -it <cilium-pod> -- cilium endpoint list

# For Calico
kubectl get networkpolicy -A
kubectl get globalnetworkpolicy
calicoctl get policy -o yaml

网络性能测试

yaml
# Network performance test using iperf3
apiVersion: v1
kind: Pod
metadata:
  name: iperf-server
  labels:
    app: iperf-server
spec:
  containers:
  - name: iperf
    image: networkstatic/iperf3
    command: ["iperf3", "-s"]
    ports:
    - containerPort: 5201
---
apiVersion: v1
kind: Pod
metadata:
  name: iperf-client
spec:
  containers:
  - name: iperf
    image: networkstatic/iperf3
    command: ["sleep", "infinity"]
bash
# Run the test
kubectl exec -it iperf-client -- iperf3 -c <iperf-server-ip> -t 30

最佳实践

1. IP 地址规划

  • 设计足够大的 CIDR 块
  • 将 Pod 网络与 Service 网络分离
  • 设计子网时考虑未来扩展

2. 应用 Network Policy

  • 应用默认拒绝 Policy(Zero Trust)
  • 仅显式允许必需的流量
  • 隔离 namespace
yaml
# Default deny policy example
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress

3. 性能优化

  • 选择合适的 CNI(与工作负载匹配)
  • MTU 优化
  • 内核参数调优

4. 安全加固

  • 加密通信(WireGuard、IPsec)
  • 应用 mTLS
  • 定期进行安全审计

5. 确保可观测性

  • 收集网络指标
  • 启用流日志
  • 实施分布式追踪

后续步骤

  1. VPC CNI - 默认 EKS CNI
  2. Cilium 深入解析 - 基于 eBPF 的网络
  3. Calico 深入解析 - 企业级 CNI
  4. VPC Lattice - AWS 托管网络
  5. AWS Load Balancer Controller - ELB 集成
  6. Gateway API - 下一代 ingress

参考资料