第275篇:Kubernetes 网络:CNI、Pod 网络与 Service

关键词:Kubernetes、CNI、Pod网络、Service、ClusterIP、NodePort、网络模型


一、引言

Kubernetes(K8s)作为容器编排的事实标准,其网络模型是整个平台的核心组件之一。Kubernetes定义了一套严格的网络模型要求,并通过CNI(Container Network Interface)插件机制实现灵活的网络方案。

理解Kubernetes网络模型、CNI插件的工作原理以及Service网络的设计,是部署和运维Kubernetes集群的前提。

二、核心概念

2.1 Kubernetes 网络模型

Kubernetes定义了以下网络模型要求:

要求 说明
Pod扁平网络 所有Pod可以在不需要NAT的情况下互相通信
每个Pod独立IP 每个Pod拥有一个唯一的IP地址
节点可达 节点上的所有进程(包括系统进程)可以与该节点上所有Pod通信
Pod自指 Pod使用的IP与其他节点访问该Pod的IP相同
网络隔离 通过NetworkPolicy实现Pod间网络隔离(可选)

Kubernetes 网络模型 - 图示

2.2 CNI(Container Network Interface)

CNI是CNCF孵化的容器网络标准,定义了容器网络插件的接口规范:

CNI的核心接口:

接口 说明 触发时机
ADD 添加容器到网络 Pod创建时
DEL 从网络删除容器 Pod删除时
CHECK 检查容器网络状态 健康检查
VERSIONS 获取CNI版本 初始化时

CNI工作流程:

CNI(Container Network Interface) - 图示

2.3 Pod 网络

Pod网络是Kubernetes的基本网络单元:

Pod网络的特点: - 同一Pod内的容器共享网络命名空间(相同的IP和端口空间) - 每个Pod通过veth pair连接到宿主机的网络命名空间 - Pod的IP地址由CNI插件分配和管理

Pod的IP分配方式:

方式 说明 适用场景
宿主IP Pod使用宿主机的IP 特殊场景
CNI分配 CNI插件从地址池分配 通用场景
主机网络 Pod直接使用宿主机网络命名空间 高性能场景

2.4 Kubernetes Service

Service是Kubernetes中实现服务发现和负载均衡的抽象:

Service的类型:

类型 说明 访问方式
ClusterIP 集群内部虚拟IP 集群内Pod访问
NodePort 节点端口映射 外部通过节点IP:端口访问
LoadBalancer 云提供商负载均衡器 外部通过LB IP访问
ExternalName DNS别名 重定向到外部服务

Service的工作原理:

Kubernetes Service - 图示

三、技术细节

3.1 kube-proxy 的三种模式

kube-proxy负责实现Service的负载均衡:

模式 原理 性能 特性
userspace 用户空间代理 低 已废弃
iptables iptables规则 中 随机负载均衡
ipvs IPVS负载均衡 高 支持多种负载均衡算法

iptables模式: - kube-proxy监听Service和Endpoints的变化 - 生成iptables规则,将Service VIP的流量DNAT到后端Pod - 负载均衡算法为随机选择

IPVS模式: - 使用Linux IPVS模块实现负载均衡 - 支持rr(轮询)、lc(最少连接)、dh(目的哈希)等算法 - 性能优于iptables模式

3.2 Pod 间通信模型

Pod 间通信模型 - 图示

3.3 Service 流量路径

ClusterIP Service流量路径: 1. Pod发送报文到Service的ClusterIP 2. kube-proxy的iptables/ipvs规则将ClusterIP DNAT到后端Pod IP 3. 报文转发到目标Pod

NodePort Service流量路径: 1. 外部客户端访问NodeIP:NodePort 2. kube-proxy将流量转发到Service的ClusterIP 3. 再转发到后端Pod

3.4 IPAM(IP地址管理)机制

CNI插件通过IPAM子插件管理Pod IP地址分配:

IPAM类型 说明 适用场景
host-local 从本地地址池分配IP 单节点或简单场景
DHCP 从DHCP服务器获取IP 与现有DHCP基础设施集成
静态 手动指定IP 固定IP需求
Calico IPAM BGP感知的IP分配 Calico环境
Cilium IPAM Kubernetes API管理 Cilium环境

host-local IPAM配置示例:

{
  "cniVersion": "0.3.1",
  "name": "mynet",
  "type": "veth",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/16",
    "rangeStart": "10.244.1.128",
    "rangeEnd": "10.244.1.254",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ],
    "gateway": "10.244.1.1"
  }
}

3.5 Multus:多网卡CNI

Kubernetes默认每个Pod只有一个网络接口。Multus CNI允许Pod附加多个网络接口:

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: storage-network
spec:
  config: '{
    "cniVersion": "0.3.1",
    "type": "macvlan",
    "master": "eth1",
    "mode": "bridge",
    "ipam": {
      "type": "host-local",
      "subnet": "10.100.0.0/16",
      "rangeStart": "10.100.0.100",
      "rangeEnd": "10.100.0.200",
      "routes": [
        { "dst": "0.0.0.0/0" }
      ],
      "gateway": "10.100.0.1"
    }
  }'
---
# Pod使用多网卡
apiVersion: v1
kind: Pod
metadata:
  name: multi-net-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: storage-network
spec:
  containers:
  - name: app
    image: myapp:latest
    # 默认网卡: eth0 (Pod网络)
    # 附加网卡: net1 (storage-network)
多网卡场景 说明
管理+存储网络分离 管理流量走默认网络, 存储流量走专用网络
业务+监控网络分离 业务流量与监控流量物理隔离
SR-IOV直通 附加网卡使用SR-IOV VF, 获得裸金属性能
多租户隔离 不同租户流量走不同VLAN/VXLAN网络

3.6 Pod 网络 Troubleshooting 流程

Pod 网络 Troubleshooting 流程 - 图示

四、实战配置/案例分析

4.1 CNI 插件配置(以Calico为例)

# Calico CNI 配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: calico-config
  namespace: kube-system
data:
  cni_network_config: |
    {
      "name": "k8s-pod-network",
      "cniVersion": "0.3.1",
      "type": "calico",
      "ipam": {
        "type": "calico-ipam",
        "subnet": "192.168.0.0/16"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    }
---
# Calico DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: calico-node
  namespace: kube-system
spec:
  template:
    spec:
      containers:
      - name: calico-node
        image: calico/node:v3.26
        env:
        - name: CALICO_IPV4POOL_CIDR
          value: "192.168.0.0/16"
        - name: IP_AUTODETECTION_METHOD
          value: "interface=eth0"

4.2 Service 配置示例

# ClusterIP Service
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
---
# NodePort Service
apiVersion: v1
kind: Service
metadata:
  name: my-app-nodeport
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 30080
---
# Headless Service (无ClusterIP)
apiVersion: v1
kind: Service
metadata:
  name: my-app-headless
spec:
  clusterIP: None
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080

4.3 故障案例:Pod间网络不通

现象:跨节点的Pod无法通信,同节点Pod通信正常。

排查过程:

# 1. 检查Pod IP
kubectl get pods -o wide
# Pod-A: 192.168.1.5 (节点1)
# Pod-B: 192.168.2.5 (节点2)

# 2. 从Pod-A ping Pod-B
kubectl exec pod-a -- ping 192.168.2.5
# 请求超时

# 3. 检查节点路由
ip route show | grep 192.168
# 节点1缺少到192.168.2.0/24的路由

# 4. 检查CNI状态
kubectl get pods -n kube-system | grep calico
# calico-node在节点1的状态为CrashLoopBackOff

# 5. 检查calico日志
kubectl logs calico-node-xxx -n kube-system
# 错误: BGP peer connection failed, 节点间BGP会话未建立

根因:节点1上的calico-node Pod异常退出(CrashLoopBackOff),导致该节点的CNI路由和BGP会话失效,跨节点Pod无法通信。

解决: 1. 检查calico-node的资源限制和日志,修复crash原因 2. 临时重启calico-node Pod恢复网络 3. 监控CNI Pod的健康状态,设置告警

五、总结

组件 功能 关键概念
CNI Pod网络插件标准 ADD/DEL接口, IPAM
Pod网络 Pod间扁平通信 独立IP, veth pair
kube-proxy Service负载均衡 iptables/IPVS模式
Service 服务发现和负载均衡 ClusterIP/NodePort/LB
Endpoints Service后端Pod列表 自动更新
IPAM IP地址管理 host-local/DHCP/静态
Multus 多网卡CNI NetworkAttachmentDefinition
Service类型 内部访问 外部访问 适用场景
ClusterIP ✓ ✗ 集群内部服务
NodePort ✓ ✓ 测试/开发
LoadBalancer ✓ ✓ 生产(云环境)
ExternalName ✗ DNS解析 外部服务代理
Headless Pod直接访问 ✗ StatefulSet/自定义DNS

思考

  1. Kubernetes要求Pod扁平网络(所有Pod直接可达),这在物理上是如何实现的?CNI插件扮演什么角色?
  2. kube-proxy的iptables模式和IPVS模式在负载均衡算法上有什么区别?哪种模式更适合大规模集群?
  3. Headless Service(clusterIP: None)的用途是什么?什么场景下需要使用Headless Service?
  4. Multus多网卡CNI如何解决Pod需要同时接入多个网络的需求?与VLAN子接口方案相比有什么优势?
  5. Pod IP在Pod重启后是否会变化?如果业务依赖固定IP,应该如何设计?

下篇预告:第276篇:Flannel、Calico、Cilium 方案对比