集群网络是保障集群内部组件通信、容器互通、服务暴露与外部访问的基础。根据 Kubernetes 的指引,集群网络需要满足扁平化、无 NAT 穿透等要求。本文主要介绍 VKE 集群的容器网络分类和基本概念。
- 节点网络:作为集群的底层网络基础,负责承载所有节点之间的通信,确保集群内所有节点(包括控制面节点与工作节点)能够双向互通,为容器网络、服务网络提供稳定的底层传输载体。
- 容器网络:用于集群内所有 Pod 之间的通信,遵循 Kubernetes 扁平化网络模型,确保每个 Pod 拥有独立且可路由的 IP 地址,Pod 之间可直接通过 IP 地址通信,无需经过 NAT 转换,降低通信延迟,提升转发效率。
- 服务网络:面向集群内部服务通信场景,为每组功能相同的 Pod 提供固定的虚拟 IP 地址(ClusterIP),屏蔽 Pod 生命周期短、IP 动态变化的特性,实现服务与后端 Pod 的解耦,确保集群内其他 Pod 或服务能够稳定访问目标服务。
- 外部网络:负责实现集群内业务与外部互通,通过 Ingress 等核心资源,统一管理集群外部四层或七层(HTTP/HTTPS)流量入口,实现域名路由、路径转发与流量管控,将外部请求安全、高效地转发至集群内对应的 Service 与 Pod。
VPC-CNI(Virtual Private Cloud - Container Network Interface)是容器服务(VKE)集群的容器网络方案之一,其基于 CNI(容器网络接口)标准与 VPC 弹性网卡能力实现,属于 Underlay 网络模式。该模式下 Pod 与节点处于同一 VPC 网络平面,直接复用 VPC 底层网络资源,无需额外隧道封装,兼顾高性能与高兼容性,广泛应用于时延敏感型、传统架构迁移等场景。
该模式为 VKE 集群在 VPC-CNI 网络模型中的默认网卡分配模式。在该模式下,多个 Pod 共享一张 VPC 辅助弹性网卡,IPAM 组件为该弹性网卡申请多个附加 IP,分配给不同 Pod 使用。该模式对节点资源消耗较低,可提升单节点 Pod 部署密度,为大多数业务的首选模式。
共享网卡模式下的网络通信流程如下:
- 同节点 Pod 通信:若 Pod 访问相同节点上的其他 Pod,根据 Pod 是否使用相同 ENI,转发路径不同:
- 当同节点同 ENI 下的 Pod 通信时,直接通过 IPvlan 进行转发。无需经过弹性网卡转发,延迟极低。
- 当同节点不同 ENI 下的 Pod 通信时,则借助 VPC 的路由转发能力,将访问流量转发到另一个 ENI 上的 Pod。
- 跨节点 Pod 通信:若 Pod 访问其他节点上的其他 Pod,则根据 VPC 路由表中的路由先访问到默认网关,然后借助 VPC 的路由转发能力,将访问流量转发到另一个节点上的 Pod。
- Pod 访问公网:Pod 在访问公网时,系统会将 Pod 的内网 IP 通过 VPC 中的 NAT 网关进行 SNAT 转换,进而访问公网。
VKE 支持基于 Trunk ENI 的独占弹性网卡模式,在该模式下,系统会在节点中绑定一张 Trunk ENI。每个需要独占网卡的 Pod,均绑定该 Trunk ENI 下的 Branch ENI,实现独占网卡绑定。该模式下可以为 Pod 网卡配置固定 IP,并绑定独立的安全组,解决 Pod 间网络隔离的场景需求。
Flannel 是一款开源轻量级容器网络解决方案,VKE 支持该网络模型,并采用了 VPC Router 模式,借助 VPC 中的默认路由表实现跨节点 Pod 通信,全程无隧道封装开销,性能优异,属于 Underlay 网络方案。
不同容器网络模型的 Pod 密度、校验规则等特性不同。详情如下表所示。
由于集群中的 Pod 是临时资源,生命周期短、IP 地址动态变化,无法直接作为服务访问入口。Kubernetes 中定义了 Service 作为服务抽象层,用于为一组功能相同的 Pod 提供固定的访问入口、负载均衡与服务发现能力,屏蔽 Pod 的动态扩缩容与 IP 变更,实现服务与后端 Pod 解耦。
Service 主要包含的类型,如下所示:
- ClusterIP:(默认类型)分配集群内部虚拟 IP,仅允许集群内部访问,用于服务间内部通信。
- NodePort:在 ClusterIP 的基础上,在每个节点开放固定端口,通过节点 IP + 端口的形式,从集群外部访问服务。
- LoadBalancer:对接 CLB 负载均衡器,自动创建公网/内网 CLB 实例,分配独立公网 IP,实现集群服务对外暴露。
- ExternalName:将集群外部服务映射为集群内部域名,实现集群内访问外部服务的统一化,无 IP 分配,仅做域名映射。
LoadBalancer 类型 Service 仅支持四层流量转发,而 Ingress 可以基于七层的 HTTP 和 HTTPS 协议实现转发,通过不同的转发规则将流量转发至集群内多个后端 Service,实现域名路由、路径转发、重定向、限流等高级流量管控功能。
Ingress 作为 Kubernetes 集群中一种独立的资源,主要由如下资源组成:
- Ingress 资源:Kubernetes API 对象,定义流量路由规则,包括域名、路径、目标 Service、HTTPS 证书等配置,仅为规则声明,不负责实际流量转发。
- Ingress Controller:负责监听集群外部的网络流量,并解析 ingress 规则,实现流量转发到后端服务的控制器组件,包括:APIG Ingress Controller、ALB Ingress Controller、CLB Ingress Controller 等。
VKE 集群使用 CoreDNS 实现集群内的服务发现和域名解析。CoreDNS 以组件形态部署在 kube-system 命名空间,并以 Pod 形式运行。集群内所有 Pod 默认将 CoreDNS 作为 DNS 服务器,自动解析集群内部域名与外部公网域名。
集群为每个 Service 分配固定的全限定域名(FQDN),格式为<service-name>.<namespace>.svc.cluster.local,其中:
- cluster.local:集群默认根域名,可自定义修改。
例如:当您在集群的 default 命名空间下,创建名为 service-demo 的服务时,其默认域名为service-demo.default.svc.cluster.local。集群内的任意 Pod 均可通过该域名直接访问该服务。