# VPC网络模型说明
#### VPC网络模型
VPC网络模型将虚拟私有云VPC的路由方式与底层网络深度整合，适用于高性能场景，但节点数量受限于虚拟私有云VPC的路由配额。在VPC网络模型中，容器网段独立于节点网段进行单独设置。在Pod IP地址分配时，集群中的每个节点会被分配固定大小的Pod IP地址段，用于给该节点上运行的Pod分配IP地址。由于VPC网络模型没有隧道封装的消耗，容器网络性能相对于容器隧道网络有一定优势。此外，使用VPC网络模型的集群时，由于VPC路由表中自动配置了容器网段与VPC网段之间的路由，可以支持同一VPC内的云服务器从集群外直接访问容器实例等特殊场景。
图1VPC网络   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001199181338.png "点击放大")
在VPC网络模型的集群中，不同形式的网络通信路径不同：
- 节点内Pod间通信：IPVlan子接口分配给节点上的Pod，因此同节点的Pod间通信可以直接通过IPVlan进行转发。
- 跨节点Pod间通信：所有跨节点Pod间的通信均根据VPC路由表中的路由先访问到默认网关，然后借助VPC的路由转发能力，将访问流量转发到另一个节点上的Pod。
- Pod访问公网：集群内的容器在访问公网时，系统会将Pod IP通过NAT转换成节点IP，使Pod以节点IP的形式与外部进行通信。
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  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](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_10041.html)。
  
 
#### 优缺点
**优点**
- 由于没有隧道封装，网络问题易排查、性能较高。
- 在同一个VPC内，由于VPC路由表中自动配置了容器网段与VPC网段之间的路由，同VPC内的资源可以与集群内部的容器直接进行网络通信。
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  同理，如果该VPC和其他VPC或数据中心网络环境连通，且在VPC路由表中添加容器网段的路由，在网段不冲突的情况下，其他VPC或数据中心所属的资源也可以与集群内部的容器直接进行网络通信。
  
**缺点**
- 节点数量受限于虚拟私有云VPC的路由配额。
- 每个节点将会被分配固定大小的IP地址段，存在一定的容器网段IP地址浪费。
- Pod无法直接利用EIP、安全组等能力。
 
#### 应用场景
- 性能要求较高：由于没有额外的隧道封装，相比于容器隧道网络模式，VPC网络模型集群的容器网络性能接近于VPC网络性能，所以适用于对性能要求较高的业务场景，比如：AI计算、大数据计算等。
- 中小规模组网：由于VPC路由网络受限于VPC路由表条目配额的限制，建议集群规模为1000节点及以下。
 
 #### Pod IP地址管理
VPC网络模型根据如下规则分配Pod IP，核心原则是"先从容器网段中给节点预分配一段Pod IP网段，再给Pod分IP"：
- **网段独立隔离**：容器使用的IP网段（容器网段）和节点自身的IP网段完全分开设置，互不重叠，避免节点与Pod的IP地址冲突，也让两者的网段规划可独立调整。
- **节点维度预分配固定大小的Pod IP网段**：先以"每个节点"为单位，从容器网段里划出固定大小的IP网段（比如每个节点分配128个IP，对应掩码/25），这个网段的大小可以由用户在创建集群时自行配置，确保每个节点有足够IP供其上面的Pod使用。
- **每个节点依次分配** ：新增节点时，从容器网段中按顺序取用预设大小的网段。例如容器网段是172.16.0.0/16，第一个节点分 172.16.0.0/25，第二个分172.16.0.128/25，依次分配，直到容器网段用尽，如[图2]所示。
- **Pod使用节点预分配的网段中的IP**：Pod调度到某个节点后，就从该节点预分配的固定网段里依次获取IP，Pod IP地址不会超出该节点预分配的网段范围。
图2VPC网络IP地址管理   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001244261173.png "点击放大")
按如上IP分配，VPC网络的集群最多能创建节点数量 = 容器网段IP数量 ÷ 节点从容器网段中分配IP网段的IP数量
比如容器网段为172.16.0.0/16，则IP数量为65536，节点分配容器网段掩码为25，也就是每个节点Pod IP数量为128，则最多可创建节点数量为65536/128=512。另外，集群能创建多少节点，还受节点子网的可用IP数和集群规模的影响，详情请参见[网段规划建议]。
 #### 网段规划建议
在[集群网络构成](https://support.huaweicloud.com/usermanual-cce/cce_10_0010.html#cce_10_0010__section1131733719195)中介绍集群中网络地址可分为集群网络、容器网络、服务网络三块，在规划网络地址时需要从如下方面考虑：
- **三个网段不能重叠**，否则会导致冲突。且集群所在VPC下所有子网（包括扩展网段子网）不能和容器网段、服务网段冲突。
- 保证**每个网段有足够的IP地址可用** 。
  - 集群网段的IP地址要与集群规模相匹配，否则会因为IP地址不足导致无法创建节点。
  
  - 容器网段的IP地址要与业务规模相匹配，否则会因为IP地址不足导致无法创建Pod。每个节点上可以创建多少Pod还与其他参数设置相关，具体请参见[节点可创建的最大Pod数量说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0348.html)。
   
例如集群规模为200节点，容器网络模型为VPC网络。
则此时选择子网的可用IP数量需要超过200，否则会因为IP地址不足导致无法创建节点。
容器网段为172.16.0.0/16，可用IP数量为65536，如[Pod IP地址管理]中所述，VPC网络IP分配是分配固定大小的网段（使用掩码实现，确定每个节点最多分配多少Pod IP），例如上限为128，则此时集群最多支撑65536/128=512个节点。
#### VPC网络访问示例
本示例中，创建一个VPC网络的集群，且集群中包含一个Node节点。
在VPC控制台中，找到集群所在VPC，查看该VPC的路由表。
在路由表中存在一条由CCE自动添加的自定义路由，该路由的目的地址为分配给该节点的容器网段，下一跳指向对应的节点。示例中集群容器网段为172.16.0.0/16，每个节点Pod IP数量为128，则分配给该节点的容器网段为172.16.0.0/25，该网段包含128个Pod IP。
图3路由   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001199341324.png "点击放大")
当访问Pod IP时，VPC路由就会将指向目的地址的流量转发到下一跳的节点，访问示例如下。
1. 使用kubectl命令行工具连接集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
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>
   ```
   
   
 
#### 相关文档
- 有关不同网络模型集群中节点可创建的最大Pod数量的详细信息，请参见[节点可创建的最大Pod数量说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0348.html)。
- 关于集群网段的详细规划建议，请参见[集群网络地址段规划实践](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_00004.html)。
 
