更新时间:2024-10-14 GMT+08:00

VPC网络模型说明

VPC网络模型

VPC网络模型将虚拟私有云VPC的路由方式与底层网络深度整合,适用于高性能场景,但节点数量受限于虚拟私有云VPC的路由配额。在VPC网络模型中,容器网段独立于节点网段进行单独设置。在容器IP地址分配时,集群中的每个节点会被分配固定大小的容器IP地址段,用于给该节点上运行的容器分配容器IP。由于VPC网络模型没有隧道封装的消耗,容器网络性能相对于容器隧道网络有一定优势。此外,使用VPC网络模型的集群时,由于VPC路由表中自动配置了容器网段与VPC网段之间的路由,可以支持同一VPC内的云服务器从集群外直接访问容器实例等特殊场景。
图1 VPC网络

在VPC网络模型的集群中,不同形式的网络通信路径不同:

  • 节点内Pod间通信:IPVlan子接口分配给节点上的Pod,因此同节点的Pod间通信可以直接通过IPVlan进行转发。
  • 跨节点Pod间通信:所有跨节点Pod间的通信均根据VPC路由表中的路由先访问到默认网关,然后借助VPC的路由转发能力,将访问流量转发到另一个节点上的Pod。
  • Pod访问集群外网络:集群内的容器在访问集群外网络时,系统会将容器IP通过NAT转换成节点IP,使Pod以节点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地址。
图2 VPC网络IP地址管理

按如上IP分配,VPC网络的集群最多能创建节点数量 = 容器网段IP数量 ÷ 节点从容器网段中分配IP网段的IP数量

比如容器网段为172.16.0.0/16,则IP数量为65536,节点分配容器网段掩码为25,也就是每个节点容器IP数量为128,则最多可创建节点数量为65536/128=512。另外,集群能创建多少节点,还受节点子网的可用IP数和集群规模的影响,详情请参见网段规划建议

网段规划建议

集群网络构成中介绍集群中网络地址可分为集群网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑:

  • 三个网段不能重叠,否则会导致冲突。
  • 保证每个网段有足够的IP地址可用
    • 集群网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。
    • 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建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的路由表。

在路由表中存在一条由CCE自动添加的自定义路由,该路由的目的地址为分配给该节点的容器网段,下一跳指向对应的节点。示例中集群容器网段为172.16.0.0/16,每个节点容器IP数量为128,则分配给该节点的容器网段为172.16.0.0/25,该网段包含128个容器IP。

当访问容器IP时,VPC路由就会将指向目的地址的流量转发到下一跳的节点,访问示例如下。

  1. 使用kubectl命令行工具连接集群,详情请参见通过kubectl连接集群
  2. 在集群中创建一个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

  3. 查看已运行的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>

  4. 您可以使用同一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>