# 容器隧道网络模型说明
#### 容器隧道网络模型
容器隧道网络是在主机网络平面的基础上，通过隧道封装技术来构建一个独立的容器网络平面。CCE集群容器隧道网络使用了VXLAN作为隧道封装协议，并使用了Open vSwitch作为后端虚拟交换机。VXLAN是一种将以太网报文封装成UDP报文进行隧道传输的协议，而Open vSwitch是一款开源的虚拟交换机软件，提供网络隔离和数据转发等功能。
容器隧道网络虽然会有少量隧道封装性能损耗，但具有通用性强、互通性强、高级特性支持全面（例如NetworkPolicy网络隔离）等优势，适用于大多数性能要求不高的场景。
图1容器隧道网络   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001701593453.png "点击放大")
在容器隧道模型的集群中，节点内Pod间通信和跨节点Pod间通信路径不同：
- 节点内Pod间通信：同节点的Pod间通信通过本节点的OVS网桥直接转发。
- 跨节点Pod间通信：所有跨节点Pod间的通信通过OVS隧道网桥进行封装后，通过主机网卡转发到另一个节点上的Pod。
 
#### 优缺点
**优点**
- 容器网络和节点网络解耦，不受VPC配额规格、响应速度的限制（如VPC路由条目数、弹性网卡数、创建速度限制）。
- 支持网络隔离，具体请参见[配置网络策略（NetworkPolicy）限制Pod访问的对象](https://support.huaweicloud.com/usermanual-cce/cce_10_0059.html)。
- 支持带宽限制。
- 支持大规模组网，最大可支持2000节点规模。
**缺点**
- 由于隧道封装，网络问题排查难度较大，整体性能较低。
- Pod无法直接利用EIP、安全组等能力。
- 不支持外部网络与Pod IP直接进行网络通信。
 
#### 应用场景
- 对性能要求不高：由于需要额外的VXLAN隧道封装，相对于另外两种容器网络模式，性能存在一定的损耗（约5%-15%）。所以容器隧道网络适用于对性能要求不是特别高的业务场景，比如：Web应用、访问量不大的数据中台、后台服务等。
- 大规模组网：相比VPC路由网络受限于VPC路由条目配额的限制，容器隧道网络没有网络基础设施的任何限制；同时容器隧道网络把广播域控制到了节点级别，容器隧道网络最大可支持2000节点规模。
 
#### Pod IP地址管理
容器隧道网络按如下规则分配Pod IP：
- **网段独立隔离**：容器使用的IP网段（容器网段）和节点自身的IP网段完全分开设置，互不重叠，避免节点与Pod的IP地址冲突，也让两者的网段规划可独立调整。
- **按"块"给节点动态分配网段**：从容器网段中，按固定大小（默认16个IP，即掩码/28）分配Pod IP网段，并这些网段依次分配给集群中的节点。

- **节点Pod IP耗尽后可继续补充**：当分配给节点的Pod IP地址使用完后，会自动从容器网段中再申请一个新的Pod IP网段，避免因IP不足无法创建新Pod。
- **容器网段** **循环分配**：按容器网段的顺序，将Pod IP网段循环分配给新增节点或存量节点，避免某部分网段被过度占用。
- **Pod从分配给节点一个或多个网段中获取IP**：Pod调度到某个节点后，依次循环从分配给节点的一个或多个网段内获取IP地址，确保节点内Pod IP分配有序且不重复。例如分配给节点A的网段为172.16.0.0/28、172.16.1.16/28，172.16.0.0/28网段中的IP用尽后，会继续从172.16.1.16/28网段中分配Pod IP。
图2容器隧道网络IP地址分配   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001244141217.png "点击放大")
按如上IP分配，容器隧道网络的集群最多能创建节点数量 = 容器网段IP数量 ÷ 节点从容器网段中一次分配的IP网段大小（默认为16）
比如容器网段为172.16.0.0/16，则IP数量为65536，如果为每个节点分配的容器网段掩码为28，也就是每次分配16个Pod IP，则最多可创建节点数量为65536/16=4096。这是一种极端情况，如果创建4096个节点，则每个节点最多只能创建16个Pod，因为给每个节点只分配了16个IP的网段。另外集群能创建多少节点，还受节点子网的可用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)。
   
 
#### 容器隧道网络访问示例
在容器隧道网络集群中创建工作负载的访问示例如下。
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'
             resources:
               limits:
                 cpu: 250m
                 memory: 512Mi
               requests:
                 cpu: 250m
                 memory: 512Mi
         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-5bdc5699b7-5rvq4   1/1     Running   0          3m28s   10.0.0.20   192.168.0.42   <none>           <none>
   example-5bdc5699b7-984j9   1/1     Running   0          3m28s   10.0.0.21   192.168.0.42   <none>           <none>
   example-5bdc5699b7-lfxkm   1/1     Running   0          3m28s   10.0.0.22   192.168.0.42   <none>           <none>
   example-5bdc5699b7-wjcmg   1/1     Running   0          3m28s   10.0.0.52   192.168.0.64   <none>           <none>
   ```
   
   
4. 如果使用同一VPC内的云服务器从集群外直接访问Pod的IP，会发现无法访问。 
   而在集群内部节点或Pod内，可以使用Pod IP正常访问Pod。例如以下示例中，进入到容器中直接访问Pod IP，其中*example-5bdc5699b7-5rvq4* 为Pod名称，*10.0.0.21* 为Pod IP。
   ```
   kubectl exec -it example-5bdc5699b7-5rvq4 -- curl 10.0.0.21
   ```
   回显如下，说明可正常访问工作负载应用：
   ```
   <!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)。
 
