Kubernetes网络深度解析:从Pod通信到服务治理

一、Kubernetes网络模型设计哲学

Kubernetes网络模型遵循三个基本原则:

  1. IP-per-Pod原则:每个Pod拥有独立IP地址,且所有Pod可以直接通信
  2. 无NAT原则:Pod间通信不经过地址转换
  3. 显式暴露原则:服务对外暴露需要明确声明

图1

二、CNI插件选型与实践

主流CNI插件对比

插件网络模式特点适用场景
FlannelOverlay简单易用,性能中等中小规模集群
CalicoBGP/IPIP高性能,支持网络策略生产环境,需要安全隔离
CiliumeBPF深度可观测性,服务网格集成云原生微服务架构

Calico部署示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: calico-node
spec:
  template:
    spec:
      containers:
      - name: calico-node
        image: calico/node:v3.20.0
        env:
        - name: CALICO_IPV4POOL_CIDR
          value: "192.168.0.0/16"

实践建议

  1. 测试环境可先用Flannel快速搭建
  2. 生产环境推荐Calico或Cilium
  3. 跨云场景优先考虑支持BGP的解决方案

三、服务发现与负载均衡

Service类型详解

图2

典型Service定义

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  type: ClusterIP

Ingress高级配置示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: demo.example.com
    http:
      paths:
      - path: /api/(.*)
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80

实践建议

  1. 内部服务使用ClusterIP
  2. 需要外部访问时配合Ingress使用
  3. 生产环境Ingress Controller至少部署2个副本

四、网络策略实战

网络策略示例:限制前端只能访问后端

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: frontend-policy
spec:
  podSelector:
    matchLabels:
      role: frontend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: backend
    ports:
    - protocol: TCP
      port: 6379

策略生效验证命令

kubectl describe networkpolicy frontend-policy
kubectl run -it --rm testpod --image=alpine -- sh
ping <backend-pod-ip>

五、DNS服务解析机制

CoreDNS默认配置示例:

.:53 {
    errors
    health {
       lameduck 5s
    }
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
       pods insecure
       fallthrough in-addr.arpa ip6.arpa
    }
    prometheus :9153
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance
}

域名解析规则

  • Service解析:<service>.<ns>.svc.cluster.local
  • Pod解析:<pod-ip>.<ns>.pod.cluster.local

六、网络性能优化技巧

  1. 大流量服务优化

    apiVersion: v1
    kind: Service
    metadata:
      name: high-traffic
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
    spec:
      externalTrafficPolicy: Local
  2. CNI调优参数

    # Calico启用IPIP
    calicoctl patch ipPool default -p '{"spec":{"ipipMode": "Always"}}'
    
    # Flannel调整MTU
    kubectl patch ds kube-flannel-ds -n kube-system --type json -p '[{"op":"add","path":"/spec/template/spec/containers/0/env/-","value":{"name":"IFACE_MTU","value":"1440"}}]'

七、常见问题排查指南

  1. 网络连通性检查清单

    # 检查Pod网络
    kubectl exec -it <pod> -- ping <target-ip>
    
    # 检查Service端点
    kubectl get endpoints <service-name>
    
    # 检查DNS解析
    kubectl run -it --rm dns-test --image=busybox:1.28 -- nslookup <service>
  2. 网络插件日志查看

    kubectl logs -n kube-system <cni-pod-name>
    journalctl -u kubelet -f | grep network

总结:Kubernetes网络体系需要根据业务场景选择合适的组件组合,建议从简单配置开始,逐步引入网络策略和服务治理能力。对于关键业务系统,务必进行网络性能基准测试和故障演练。

添加新评论