VPC网络模型说明
VPC网络模型
在VPC网络模型的集群中,不同形式的网络通信路径不同:
- 节点内Pod间通信:IPVlan子接口分配给节点上的Pod,因此同节点的Pod间通信可以直接通过IPVlan进行转发。
- 跨节点Pod间通信:所有跨节点Pod间的通信均根据VPC路由表中的路由先访问到默认网关,然后借助VPC的路由转发能力,将访问流量转发到另一个节点上的Pod。
- Pod访问公网:集群内的容器在访问公网时,系统会将容器IP通过NAT转换成节点IP,使Pod以节点IP的形式与外部进行通信。
VPC网络集群中默认将10.0.0.0/8、172.16.0.0/12、192.168.0.0/16这三个VPC私有网段视为集群私有网段。如果集群所在VPC使用了扩展网段,创建、重置节点等操作也会将扩展网段添加到集群私有网段中。
在Pod中发起访问请求时,如果Pod访问的目的地址在集群私有网段范围内,则节点不会将Pod IP进行网络地址转换,可以借由上层VPC直接将报文送达至目的地址,即直接使用Pod IP与集群私有网络地址进行通信。
当VPC网络集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上时,CCE提供nonMasqueradeCIDRs参数设置集群私有网段,以满足不同的使用场景,详情请参见在VPC网络集群中访问集群外地址时使用Pod IP作为客户端源IP。
优缺点
优点
- 由于没有隧道封装,网络问题易排查、性能较高。
- 在同一个VPC内,由于VPC路由表中自动配置了容器网段与VPC网段之间的路由,同VPC内的资源可以与集群内部的容器直接进行网络通信。
同理,如果该VPC和其他VPC或数据中心网络环境连通,且在VPC路由表中添加容器网段的路由,在网段不冲突的情况下,其他VPC或数据中心所属的资源也可以与集群内部的容器直接进行网络通信。
缺点
- 节点数量受限于虚拟私有云VPC的路由配额。
- 每个节点将会被分配固定大小的IP地址段,存在一定的容器网段IP地址浪费。
- Pod无法直接利用EIP、安全组等能力。
应用场景
- 性能要求较高:由于没有额外的隧道封装,相比于容器隧道网络模式,VPC网络模型集群的容器网络性能接近于VPC网络性能,所以适用于对性能要求较高的业务场景,比如:AI计算、大数据计算等。
- 中小规模组网:由于VPC路由网络受限于VPC路由表条目配额的限制,建议集群规模为1000节点及以下。
容器IP地址管理
VPC网络模型根据如下规则分配容器IP:
- 容器网段独立于节点网段进行单独设置。
- 按节点维度划分地址段,集群的所有节点从容器网段中分配一个固定大小(用户自己配置)的IP网段。
- 容器网段依次循环分配IP网段给新增节点。
- 调度到节点上的Pod依次循环从分配给节点的IP网段内分配IP地址。
按如上IP分配,VPC网络的集群最多能创建节点数量 = 容器网段IP数量 ÷ 节点从容器网段中分配IP网段的IP数量
比如容器网段为172.16.0.0/16,则IP数量为65536,节点分配容器网段掩码为25,也就是每个节点容器IP数量为128,则最多可创建节点数量为65536/128=512。另外,集群能创建多少节点,还受节点子网的可用IP数和集群规模的影响,详情请参见网段规划建议。
网段规划建议
在集群网络构成中介绍集群中网络地址可分为集群网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑:
- 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。
- 保证每个网段有足够的IP地址可用。
- 集群网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。
- 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。每个节点上可以创建多少Pod还与其他参数设置相关,具体请参见节点可创建的最大Pod数量说明。
例如集群规模为200节点,容器网络模型为VPC网络。
则此时选择子网的可用IP数量需要超过200,否则会因为IP地址不足导致无法创建节点。
容器网段为172.16.0.0/16,可用IP数量为65536,如容器IP地址管理中所述,VPC网络IP分配是分配固定大小的网段(使用掩码实现,确定每个节点最多分配多少容器IP),例如上限为128,则此时集群最多支撑65536/128=512个节点。
VPC网络访问示例
本示例中,创建一个VPC网络的集群,且集群中包含一个Node节点。
在VPC控制台中,找到集群所在VPC,查看该VPC的路由表。
当访问容器IP时,VPC路由就会将指向目的地址的流量转发到下一跳的节点,访问示例如下。
- 使用kubectl命令行工具连接集群,详情请参见通过kubectl连接集群。
- 在集群中创建一个Deployment。
创建deployment.yaml文件,文件内容示例如下:
kind: Deployment apiVersion: apps/v1 metadata: name: example namespace: default spec: replicas: 4 selector: matchLabels: app: example template: metadata: labels: app: example spec: containers: - name: container-0 image: 'nginx:perl' imagePullSecrets: - name: default-secret
创建该工作负载:
kubectl apply -f deployment.yaml
- 查看已运行的Pod。
kubectl get pod -owide
回显如下:NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES example-86b9779494-l8qrw 1/1 Running 0 14s 172.16.0.6 192.168.0.99 <none> <none> example-86b9779494-svs8t 1/1 Running 0 14s 172.16.0.7 192.168.0.99 <none> <none> example-86b9779494-x8kl5 1/1 Running 0 14s 172.16.0.5 192.168.0.99 <none> <none> example-86b9779494-zt627 1/1 Running 0 14s 172.16.0.8 192.168.0.99 <none> <none>
- 您可以使用同一VPC内的云服务器从集群外直接访问Pod的IP。而在集群内部节点或Pod内,也可以使用Pod IP正常访问Pod。例如以下示例中,进入到容器中直接访问Pod IP,其中example-86b9779494-l8qrw为Pod名称,172.16.0.7为Pod IP。
kubectl exec -it example-86b9779494-l8qrw -- curl 172.16.0.7
回显如下,说明可正常访问工作负载应用:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>