K8s网络通信的几种模式

Kubernetes网络通信深度解析:从入门到生产级调优

Kubernetes的网络就像大型交通枢纽,既要保证内部车辆(Pod)有序通行,又要开放外部高速公路。本文将用真实生产案例拆解6大核心通信模式,附带调优参数和避坑指南。


一、基础通行层:Pod间通信的三种方式

  1. 同一Pod内容器通信(合租公寓模式)
apiVersion: v1
kind: Pod
metadata:
  name: multi-container
spec:
  containers:
  - name: web
    image: nginx
    ports: [{containerPort: 80}]
  - name: sidecar
    image: busybox
    command: ["/bin/sh", "-c", "wget -qO- http://localhost:80"]
  • 共享网络命名空间,相当于同一房间的室友
  • 性能损耗:0%(本地回环通信)
  1. 同节点Pod通信(小区内部路)
# 查看docker网桥路由
ip route show dev docker0
# 典型输出:172.17.0.0/16 proto kernel scope link src 172.17.0.1
  • 数据走Linux网桥,延时<0.1ms
  • 生产隐患:默认docker0网段可能冲突,需定制配置
# 修改kubelet启动参数
--pod-cidr=10.244.0.0/16
  1. 跨节点Pod通信(跨城高速)
    方案对比
    | 隧道类型 | 性能损耗 | 适用场景 |
    |----------|----------|-------------------|
    | VXLAN | 8-12% | 多云/跨网段集群 |
    | IP-in-IP | 5-8% | 同数据中心 |
    | Host-GW | 1-3% | 裸金属服务器 |

Calico Host-GW配置示例

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-host-gw
spec:
  cidr: 10.244.0.0/16
  ipipMode: Never
  natOutgoing: true
  nodeSelector: "!has(edge-node)"

二、服务发现层:四类Service实战

  1. ClusterIP(内部专线)
apiVersion: v1
kind: Service
metadata:
  name: cache-service
spec:
  clusterIP: None # Headless Service
  selector:
    app: redis
  ports:
  - port: 6379
  • 生产技巧:StatefulSet配合Headless Service实现有状态服务发现
  1. NodePort(临时收费站)
apiVersion: v1
kind: Service
metadata:
  name: debug-service
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    nodePort: 30080
  selector:
    app: debug-tool
  • 安全风险:需配合NetworkPolicy限制访问IP
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: nodeport-whitelist
spec:
  podSelector: {matchLabels: {app: debug-tool}}
  ingress:
  - ports: [{port: 8080}]
    from:
    - ipBlock:
        cidr: 10.20.30.0/24 # 只允许运维VPC访问
  1. LoadBalancer(云厂商VIP)
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
    service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth: "100"
spec:
  type: LoadBalancer
  • 成本陷阱:删除Service时需确认是否同步删除LB
  1. Ingress(智能路由网关)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/service-upstream: "true"
spec:
  tls:
  - hosts: [app.example.com]
    secretName: tls-cert
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /v1/api
        pathType: Prefix
        backend:
          service:
            name: api-v1
            port: 80
  • 性能调优:启用nginx-ingress的worker-shutdown-timeout

三、高阶网络方案:生产选型指南

方案对比矩阵

特性 Calico Cilium Flannel
网络策略 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐(L7) ⭐⭐
服务网格集成 ⭐⭐ ⭐⭐⭐⭐⭐(eBPF)
跨集群通信 ⭐⭐⭐ ⭐⭐⭐⭐(Cluster Mesh)
监控能力 ⭐⭐⭐ ⭐⭐⭐⭐⭐
资源消耗

Cilium eBPF实战案例

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: payment-policy
spec:
  endpointSelector:
    matchLabels:
      app: payment
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "443"
        protocol: TCP
      rules:
        http:
        - method: "POST"
          path: "/api/v1/transaction"

四、生产调优参数手册

  1. 内核参数调优
# 调整conntrack表大小
sysctl -w net.netfilter.nf_conntrack_max=1000000
# 增加本地端口范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
  1. Kube-Proxy优化
# IPVS模式配置
mode: "ipvs"
ipvs:
  scheduler: "wlc"
  excludeCIDRs: 
  - "10.96.0.0/16" # 避免kube-dns被IPVS代理
  1. CNI插件性能调优
# Calico配置示例
# /etc/cni/net.d/10-calico.conflist
{
  "name": "k8s-pod-network",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "calico",
      "mtu": 1480,
      "ipam": { "type": "calico-ipam" },
      "policy": { "type": "k8s" }
    },
    {
      "type": "bandwidth",
      "capabilities": { "bandwidth": true }
    }
  ]
}

五、故障排查三板斧

  1. 网络连通性测试
kubectl run netcheck --image=nicolaka/netshoot --rm -it --command -- curl -I http://target-service:8080
  1. DNS问题诊断
kubectl exec -it dns-tester -- nslookup kubernetes.default
  1. 抓包分析
kubectl sniff <pod-name> -n <namespace> -o ./capture.pcap

六、血泪经验总结

  1. CIDR规划三原则
  • Pod网段:/16起步(支持6万+ Pod)
  • Service网段:预留至少1000个IP
  • 物理网络:避免与192.168.0.0/16等常见网段重叠
  1. 云厂商特殊限制
  • 阿里云Terway模式:每个节点最大Pod数=弹性网卡数×单网卡IP数
  • AWS VPC CNI:提前规划足够的ENI和IP
  1. 监控必看指标
# TCP重传率(超过1%告警)
node_netstat_Tcp_RetransSegs / node_netstat_Tcp_OutSegs
# 连接追踪表使用率
nf_conntrack_entries / nf_conntrack_max

某跨境电商平台经过网络优化后,支付接口延迟从350ms降至90ms,网络故障率下降78%。记住:Kubernetes网络不是开箱即用的玩具,而是需要精心调校的精密仪器。每个参数的调整都可能成为系统稳定的关键!

posted on 2025-03-08 13:23  Leo-Yide  阅读(544)  评论(0)    收藏  举报