
# 为Pod配置多网卡和多EIP
#### 应用场景
当Pod需要创建多张网卡管理网络流量时，可使用CCI服务多网卡多EIP功能。多网卡多EIP功能允许客户在同一命名空间下创建多个network，并通过Pod中annotation字段配置各个网卡使用的network和EIP。
#### 功能说明
- 创建多个network时，必须指定命名空间下某一个network为默认网络（spec.defaultNetwork为true），如果命名空间下仅有一个network，该network被识别为默认网络。
- 命名空间存在多个network时，默认网络不能更改成非默认网络。
- 命名空间存在多个network时，可以删除默认网络配置，但是需要删除后重新配置新的默认网络，否则网络功能异常。
- 创建多个network时，network之间的子网不能重复，并且所有的network配置的子网必须都在同一个VPC下。
- 多EIP功能禁止在Deployment上使用，仅支持在Pod上使用。
- Pod上可以通过yangtse.io/multi-eip-ids和k8s.v1.cni.cncf.io/networks两种annotation进行配置，但不可同时配置。
- 多网卡多EIP功能仅允许计费类型为通用型（轻享）（即general-computing-lite类型）的Pod使用。
- 单个Pod最多可以配置5张网卡。
- 单个Pod配置多张网卡时，Pod IP只会展示主网卡的IP（status.podIP和status.podIPs展示的是第一张网卡的IP信息）。
 
#### 约束与限制
- 使用多网卡的Pod在启动速度上会略微变慢，请合理规划使用。
- 多网卡多EIP配置，仅支持IPv4协议。
- Pod配置多网卡多EIP时，网络将默认使用主网卡，需要把其他网卡的特殊配置（例如EIP访问公网、安全组网段放通等）同步到主网卡上，否则可能出现镜像拉取失败、挂卷失败等问题。
- Pod配置多网卡多EIP时，不支持配置自动创建镜像快照cci.io/image-snapshot-create-if-not-present annotation功能。
- Pod配置多网卡多EIP时，不支持配置单个EIP annotation功能（包括yangtse.io/eip-bandwidth-id、yangtse.io/eip-bandwidth-size、yangtse.io/eip-network-type、yangtse.io/eip-charge-mode、yangtse.io/eip-bandwidth-name、yangtse.io/pod-with-eip、yangtse.io/eip-id）。
- 当主network下subnet IP耗尽时，不会选择非主network。
 
#### 操作步骤
1. 访问CCI API设置默认网络，并创建多个Network。
   ```
   apiVersion: yangtse/v2
   kind: Network
   metadata:
     name: test-network
     namespace: test
   spec:
     defaultNetwork: true           // defaultNetwork配置为true表示该network为默认网络
     networkType: underlay_neutron
     subnets:
     - subnetID: ${subnet1}
     - subnetID: ${subnet2}
   ```
   
2. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
3. 左侧导航栏中选择"负载管理 \> 容器组"，单击"YAML创建"。 ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002483709932.png "点击放大")
   
4. 配置Pod代码，示例如下所示：
   ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/note_3.0-zh-cn.png)
   本示例以**k8s.v1.cni.cncf.io/networks** 字段配置为例，如需使用**yangtse.io/multi-eip-ids** 字段，使用方法请参见[表1]。
   ```
   kind: Pod
   apiVersion: cci/v2
   metadata:
     name: pod-muti-eip-test
     annotations:
       k8s.v1.cni.cncf.io/networks: '[{"name":"second-network","interface":"eth0"},{"name":"default-network","interface":"eth1"},{"name":"default-network","interface":"eth2"},{"name":"second-network","interface":"eth3"}]'
       resource.cci.io/instance-type: general-computing-lite
       resource.cci.io/pod-size-specs: 0.25_0.5
   spec:
     containers:
       - name: init-myservice
         image: nginx:latest
         ports:
           - containerPort: 80
             protocol: TCP
         resources:
           limits:
             cpu: 250m
             memory: 512Mi
           requests:
             cpu: 250m
             memory: 512Mi
     restartPolicy: Always
     terminationGracePeriodSeconds: 30
     dnsPolicy: Default
     securityContext: {}
     imagePullSecrets:
       - name: imagepull-secret
   ```
    表1yangtse.io/multi-eip-ids和k8s.v1.cni.cncf.io/networks字段说明 
   | **字段名称**                    | **类型** | 格式                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 示例                                                                                                                                                                                                                                                                                                                                                                                            |
   |:---|:---|:---|:---|:---|
   | yangtse.io/multi-eip-ids    | String | eip-id1,eip-id2,eip-id3,eip-id4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | - EIP的ID值，以","分割，单个ID使用EIP服务未绑定EIP资源的ID且EIP的ID不重复。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | yangtse.io/multi-eip-ids: eip-id1,eip-id2,eip-id3,eip-id4                                                                                                                                                                                                                                                                                                                                     |
   | k8s.v1.cni.cncf.io/networks | String | \[ { "name": "second-network", "interface": "eth1", "eip": { "id": "eip-id", "bandwidth-size": "5", "network-type": "5_g-vm", "charge-mode": "bandwidth", "bandwidth-name": "eip-myself", "bandwidth-id": "bandwidth-id" } } \] | - name：非必填，默认值为""，不填使用默认network。network必须提前创建。  - interface：非必填，默认值为""，不填按照数组顺序构造网卡名。如数组的第一个元素，网卡名为 eth0,Pod内网卡的名称，请务必按照网卡顺序配置为eth0、eth1。  - eip：非必填，不填表示该网卡不需要配置EIP，Pod该网卡关联的EIP信息，一张网卡只能绑定一个EIP的ID，多张网卡不能绑定同一个EIP的ID。  - id：非必填，填写要求为已创建且未绑定的EIP的ID，不填表示不使用已有的EIP的ID。填写该字段后，bandwidth-id、bandwidth-size、bandwidth-name、network-type、charge-mode均无效。  - bandwidth-id：非必填，填写共享带宽ID表示使用该共享带宽自动创建EIP；不填写，表示使用独享带宽创建EIP。填写该字段后，bandwidth-size、bandwidth-name、charge-mode均无效。  - bandwidth-size：非必填，默认值为5，独享带宽大小，单位为Mbit/s。填写后将按照带宽大小创建独享带宽的EIP，和network-type、charge-mode、bandwidth-name一起使用。具体配置大小以各区域配置为准，详情请参见弹性公网IP控制台的购买页面。  - network-type：非必填，默认值为5_bgp，公网IP类型。填写后将按照公网IP类型创建EIP，和bandwidth-size、charge-mode、bandwidth-name一起使用。具体类型以各区域配置为准，详情请参见弹性公网IP控制台的购买页面。例如，"华东-上海一"区域支持以下类型： - 5_bgp：全动态BGP  - 5_sbgp：静态BGP    - charge-mode：非必填，计费类型。填写后将按照计费类型创建EIP，和bandwidth-size、network-type、bandwidth-name一起使用。默认值以各区域配置为准，配置参考： - bandwidth：按带宽计费  - traffic：按流量计费    - bandwidth-name：非必填，默认值随机生成，独享带宽名称。填写后将按照名称创建独享带宽，和bandwidth-size、network-type、charge-mode一起使用。配置参考： - 1-64个字符，开头结尾仅支持使用数字、字母，支持数字、字母、中文、_(下划线)、-（中划线）、.（点）。  - 最小长度：1  - 最大长度：64     | k8s.v1.cni.cncf.io/networks: \[{"name":"default-network","interface":"eth0","eip":{"id":"eip-id"}},{"name":"second-network","interface":"eth1","eip":{"bandwidth-size":"5","network-type":"5_g-vm","charge-mode":"bandwidth","bandwidth-name":"eip-myself"}},{"name":"third-network","interface":"eth2","eip":{"bandwidth-id":"bandwidth-id"}},{"name":"network-no-eip","interface":"eth3"}\] |
      
   
5. 单击"确定"。
 
