
# 在CCE Turbo集群中为Pod配置EIP
#### 使用场景
云原生网络2.0网络模式下，Pod使用的是VPC的弹性网卡/辅助弹性网卡，可直接绑定弹性公网IP。
为方便用户在CCE内直接为Pod关联弹性公网IP，用户只需在创建Pod时，配置annotation（yangtse.io/pod-with-eip: "true"），弹性公网IP就会随Pod自动创建并绑定至该Pod。
#### 前提条件
您已创建一个CCE Turbo集群，且集群版本满足以下要求：
| 为Pod配置EIP场景 | 集群版本要求                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|:---|:---|
| EIP跟随Pod创建  | - v1.19集群：v1.19.16-r20及以上版本  - v1.21集群：v1.21.10-r0及以上版本  - v1.23集群：v1.23.8-r0及以上版本  - v1.25集群：v1.25.3-r0及以上版本  - v1.25以上版本集群   |
| Pod使用已有EIP  | v1.23集群：v1.23.16-r0及以上版本 v1.25集群：v1.25.11-r0及以上版本 v1.27集群：v1.27.8-r0及以上版本 v1.28集群：v1.28.6-r0及以上版本 v1.29集群：v1.29.2-r0及以上版本 v1.29以上版本集群                                                                                                                                                                                      |
   
#### 约束限制
- 绑定EIP的Pod，如果要被公网成功访问，需要添加放通相应请求流量的安全组规则。
- 单个Pod只能绑定单个EIP。
- 创建Pod时，可指定相关的annotation配置EIP的属性，创建完成后，更新EIP相关的annotation均无效。
- 与Pod关联的EIP不要通过弹性公网IP的console或API直接操作（修改名称/删除/解绑/绑定/转包周期等操作），否则可能导致EIP功能异常。
- 自动创建的EIP被手动删除后，会导致网络异常，需要重建Pod。
 
#### EIP跟随Pod创建
创建Pod时，填写pod-with-eip的annotation后，EIP会随Pod自动创建并绑定至该Pod。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
- 自动创建EIP时，系统会自动为该EIP添加集群ID、命名空间、Pod名称的标签。
- 当自动创建EIP的Pod被删除时，自动创建的EIP会随Pod一起被删除。
 
以下示例创建一个名为nginx的无状态负载，EIP将随Pod自动创建并绑定至Pod。具体字段含义请参见[表2]。
- 创建Deployment时自动创建**独占带宽** 类型的EIP，无需指定带宽ID，示例如下：
  ```
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: nginx
  spec:
    replicas: 3
    selector:
      matchLabels:
        app: nginx
    template:
      metadata:
        labels:
          app: nginx
        annotations:
          yangtse.io/pod-with-eip: "true"  # EIP跟随Pod创建
          yangtse.io/eip-bandwidth-size: "5"   # EIP带宽，可选
          yangtse.io/eip-network-type: 5_bgp  # EIP类型，可选
          yangtse.io/eip-charge-mode: bandwidth   # EIP计费模式，可选
          yangtse.io/eip-bandwidth-name: <eip_bandwidth_name>  # EIP带宽名称，可选
          yangtse.io/eip-enterprise-project-id: '0'  # EIP企业项目，可选
          yangtse.io/eip-user-tags: '[{"key":"yourKey","value":"yourValue"}]'  # 自定义EIP资源标签，可选
      spec:
        containers:
          - name: container-0
            image: nginx:alpine
            resources:
              limits:
                cpu: 100m
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
        imagePullSecrets:
          - name: default-secret
  ```
   表1独占带宽EIP跟随Pod创建的annotation配置 
  | annotation                           | 是否可选 | 默认值   | 参数说明                                                                                                                                                                       | 取值范围                                                                                                                                                                                                                                                                                                             |
  |:---|:---|:---|:---|:---|
  | yangtse.io/pod-with-eip              | 必选   | false | 是否需要跟随Pod创建EIP并绑定到该Pod。                                                                                                                                                    | "false"或"true"                                                                                                                                                                                                                                                                                                   |
  | yangtse.io/eip-bandwidth-size        | 可选   | 5     | 带宽大小，单位为Mbit/s。                                                                                                                                                            | 具体范围以各区域配置为准，根据带宽的计费类型不同可能存在差异，详情请参见弹性公网IP控制台的购买页面。 例如，"华东-上海一"区域按带宽计费类型的带宽大小范围为1Mbit/s\~2000Mbit/s、按流量计费类型的带宽大小范围为1Mbit/s\~300Mbit/s。                                                                                                                                              |
  | yangtse.io/eip-network-type          | 可选   | 5_bgp | 公网IP类型。                                                                                                                                                                    | 具体类型以各区域配置为准，详情请参见弹性公网IP控制台的购买页面。 例如，"华东-上海一"区域支持以下类型： - 5_bgp：全动态BGP  - 5_sbgp：静态BGP   |
  | yangtse.io/eip-charge-mode           | 可选   | 空     | EIP计费模式。 **建议填写该参数。**若该参数为空，表示不指定计费模式，则以该区域下弹性公网IP接口的默认值为准。                                                                                 | - bandwidth：按带宽计费  - traffic：按流量计费                                                                                                                      |
  | yangtse.io/eip-bandwidth-name        | 可选   | Pod名称 | 带宽名称。                                                                                                                                                                      | - 1-64个字符，支持数字、字母、中文、_(下划线)、-（中划线）、.（点）  - 最小长度：1  - 最大长度：64                            |
  | yangtse.io/eip-enterprise-project-id | 可选   | '0'   | 创建EIP的企业项目ID。您可以在EPS服务控制台的"项目管理"页面查看企业项目ID。 v1.28.15-r80、v1.29.15-r40、v1.30.14-r40、v1.31.14-r0、v1.32.9-r0、v1.33.7-r0、v1.34.2-r0及以上版本的集群支持该功能。 | 不填写默认为'0'，代表使用default企业项目。 其它情况需要填写真实的企业项目ID。                                                                                                                                                                                                                                     |
  | yangtse.io/eip-user-tags             | 可选   | 空     | EIP上的资源标签属性。 v1.28.15-r80、v1.29.15-r40、v1.30.14-r40、v1.31.14-r0、v1.32.9-r0、v1.33.7-r0、v1.34.2-r0及以上版本的集群支持该功能。                               | 以JSON格式写入，示例如下： ``` '[{"key":"Project","value":"Migration-2024"},{"key":"Owner","value":"DevOps-Team"},{"key":"IsTemporary","value":"True"}]' ``` 支持最多17个自定义标签，key/value值输入范围请以EIP服务的限制为准。                                                                                          |
     
  
- 创建Deployment时自动创建**共享带宽** 类型的EIP，必须指定共享带宽ID，示例如下：
  ```
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: nginx
  spec:
    replicas: 3
    selector:
      matchLabels:
        app: nginx
    template:
      metadata:
        labels:
          app: nginx
        annotations:
          yangtse.io/pod-with-eip: "true"  # EIP跟随Pod创建
          yangtse.io/eip-network-type: 5_bgp  # EIP类型，可选
          yangtse.io/eip-bandwidth-id: <eip_bandwidth_id>  # EIP共享带宽ID
          yangtse.io/eip-enterprise-project-id: '0'  # EIP企业项目，可选
          yangtse.io/eip-user-tags: '[{"key":"yourKey","value":"yourValue"}]'  # 自定义EIP资源标签，可选
      spec:
        containers:
          - name: container-0
            image: nginx:alpine
            resources:
              limits:
                cpu: 100m
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
        imagePullSecrets:
          - name: default-secret
  ```
   表2共享带宽类型EIP跟随Pod创建的annotation配置 
  | annotation                           | 是否可选       | 默认值   | 参数说明                                                                                                                                                                                                                                                                                                                                       | 取值范围                                                                                                                                                                                                                                                                            |
  |:---|:---|:---|:---|:---|
  | yangtse.io/pod-with-eip              | 必选         | false | 是否需要跟随Pod创建EIP并绑定到该Pod。                                                                                                                                                                                                                                                                                                                    | "false"或"true"                                                                                                                                                                                                                                                                  |
  | yangtse.io/eip-network-type          | 可选         | 5_bgp | 公网IP类型。                                                                                                                                                                                                                                                                                                                                    | - 5_bgp  - 5_union  - 5_sbgp   具体类型以各区域配置为准，详情请参见弹性公网IP控制台。 |
  | yangtse.io/eip-bandwidth-id          | 使用共享型带宽时必选 | 空     | 已有的带宽ID。 - 不填写该字段时，则默认使用独占带宽的EIP。独占带宽EIP的参数设置请参见[表1]。  - 填写该字段时，只允许同时指定yangtse.io/eip-network-type字段，且该字段为可选。   | -                                                                                                                                                                                                                                                                               |
  | yangtse.io/eip-enterprise-project-id | 可选         | '0'   | 创建EIP的企业项目ID。您可以在EPS服务控制台的"项目管理"页面查看企业项目ID。 v1.28.15-r80、v1.29.15-r40、v1.30.14-r40、v1.31.14-r0、v1.32.9-r0、v1.33.7-r0、v1.34.2-r0及以上版本的集群支持该功能。                                                                                                                                                               | 不填写默认为'0'，代表使用default企业项目。 其它情况需要填写真实的企业项目ID。                                                                                                                                                                                                     |
  | yangtse.io/eip-user-tags             | 可选         | 空     | EIP上的资源标签属性。 v1.28.15-r80、v1.29.15-r40、v1.30.14-r40、v1.31.14-r0、v1.32.9-r0、v1.33.7-r0、v1.34.2-r0及以上版本的集群支持该功能。                                                                                                                                                                                                 | 以JSON格式写入，示例如下： ``` '[{"key":"Project","value":"Migration-2024"},{"key":"Owner","value":"DevOps-Team"},{"key":"IsTemporary","value":"True"}]' ``` 支持最多17个自定义标签，key/value值输入范围请以EIP服务的限制为准。                                                        |
     
  
 
#### Pod使用已有EIP
创建Pod时，填写yangtse.io/eip-id的annotation后，EIP会随Pod自动完成绑定。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
- 已有EIP绑定Pod后，系统会自动为该EIP添加集群ID、命名空间、Pod名称的标签。
- 当使用已有EIP的Pod被删除时，已有EIP会保留。系统会自动删除绑定EIP时添加的标签（集群ID、命名空间、Pod名称）。
- 删除集群时，请先删除使用已有EIP的Pod，否则该EIP上添加的标签可能会残留。
 
以下示例创建一个名为nginx的实例数为1的无状态负载，EIP将随Pod自动绑定至Pod。
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        yangtse.io/eip-id: <eip_id> # 已有EIP的ID
        yangtse.io/eip-user-tags: '[{"key":"yourKey","value":"yourValue"}]'  # 自定义EIP资源标签，可选
    spec:
      containers:
        - name: container-0
          image: nginx:alpine
          resources:
            limits:
              cpu: 100m
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 200Mi
      imagePullSecrets:
        - name: default-secret
```
表3使用已有EIP的annotation配置 
| annotation               | 是否可选 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|:---|
| yangtse.io/eip-id        | 必选   | 弹性公网IP的ID。 **获取方法：** 登录弹性公网IP控制台，在弹性公网IP列表单击需要绑定的EIP名称，找到"ID"字段复制即可。                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| yangtse.io/eip-user-tags | 可选   | EIP上的资源标签属性。 v1.28.15-r80、v1.29.15-r40、v1.30.14-r40、v1.31.14-r0、v1.32.9-r0、v1.33.7-r0、v1.34.2-r0及以上版本的集群支持该功能。 以JSON格式写入，示例如下： ``` '[{"key":"Project","value":"Migration-2024"},{"key":"Owner","value":"DevOps-Team"},{"key":"IsTemporary","value":"True"}]' ``` 支持最多17个自定义标签，key/value值输入范围请以EIP服务的限制为准。 注意： 使用已有EIP添加自定义标签时，如果直接删除集群，系统自动添加的标签和自定义标签仍会保留在EIP资源上。建议在删除集群前先清理使用该EIP的Pod；或在集群删除后，到EIP侧手动清理相关标签。 |
   
#### 检查Pod的EIP就绪
容器网络控制器会在Pod IP分配后，为Pod绑定EIP并回写分配结果至Pod的annotation（yangtse.io/allocated-ipv4-eip），Pod业务容器的启动时间可能早于EIP分配结果回写成功时间。
您可以尝试为Pod配置init container并使用downwardAPI类型的存储卷把yangtse.io/allocated-ipv4-eip的annotation通过volume挂载到init container里，并在init container中检查EIP是否已经分配成功。您可以参考以下示例配置init container。
```
apiVersion: v1
kind: Pod
metadata:
  name: example
  annotations:
    yangtse.io/pod-with-eip: "true"  
    yangtse.io/eip-bandwidth-size: "5" 
    yangtse.io/eip-network-type: 5_bgp
    yangtse.io/eip-charge-mode: bandwidth
    yangtse.io/eip-bandwidth-name: "xxx"
spec:
  initContainers:
  - name: init
    image: busybox:latest
    command: ['timeout', '60', 'sh', '-c', "until grep -E '[0-9]+' /etc/eipinfo/allocated-ipv4-eip; do echo waiting for allocated-ipv4-eip; sleep 2; done"]
    volumeMounts:
        - name: eipinfo
          mountPath: /etc/eipinfo
  volumes:
    - name: eipinfo
      downwardAPI:
        items:
          - path: "allocated-ipv4-eip"
            fieldRef:
              fieldPath: metadata.annotations['yangtse.io/allocated-ipv4-eip']
...
```
