# 在CCE Turbo集群中为Pod配置固定EIP
#### 使用场景
在云原生网络2.0下，支持为StatefulSet工作负载或直接创建的Pod分配固定的公网IP（EIP）。
#### 约束限制
- 仅以下指定版本的CCE Turbo集群支持用户配置Pod固定EIP：
  - 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以上版本集群
   
- 开启固定EIP功能需要和Pod自动创建EIP功能配合使用，详情请参见[在CCE Turbo集群中为Pod配置EIP](https://support.huaweicloud.com/usermanual-cce/cce_10_0734.html)。
- 目前只支持StatefulSet类型的Pod或直接创建的Pod固定EIP，暂不支持Deployment、DaemonSet等其他类型的工作负载配置Pod固定EIP。
- 固定EIP创建后，生命周期内（如过期时间未到/Pod还在使用中）不支持通过Pod修改EIP属性。
- 对Pod的EIP地址无明确要求的业务不建议配置固定EIP，因为配置了固定EIP的Pod，Pod重建的耗时会略微变长。
 
#### 为Pod配置固定EIP
创建固定EIP的Pod时，填写EIP相关的annotation后，EIP会随Pod自动创建并绑定至该Pod。
- [独占带宽类型的固定EIP]
  创建有状态负载时固定**独占带宽** 类型的EIP，无需指定带宽ID，示例如下：
  ```
  apiVersion: apps/v1
  kind: StatefulSet
  metadata:
    name: nginx
  spec:
    serviceName: nginx
    replicas: 3
    selector:
      matchLabels:
        app: nginx
    template:
      metadata:
        labels:
          app: nginx
        annotations:
          yangtse.io/static-eip: 'true'   # Pod固定EIP
          yangtse.io/static-eip-expire-no-cascading: 'false'   # EIP级联删除
          yangtse.io/static-eip-expire-duration: 5m   # 固定EIP过期回收的时间间隔
          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计费模式
      spec:
        containers:
          - name: container-0
            image: nginx:alpine
            resources:
              limits:
                cpu: 100m
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
        imagePullSecrets:
          - name: default-secret
  ```
  表1Pod固定EIP的annotation配置 
  | annotation                               | 是否可选 | 默认值   | 参数说明                                                                                                                                                                                        | 取值范围                                                                                                         |
  |:---|:---|:---|:---|:---|
  | yangtse.io/static-eip                     | 必选  | false  | 是否开启Pod固定EIP，只有StatefulSet类型的Pod或无ownerReferences的Pod支持，默认不开启。                                                                                                                              | "false"或"true"                                                                                            |
  | yangtse.io/static-eip-expire-duration     | 可选   | 5m   | 删除固定EIP的Pod后，对应的固定EIP过期回收的时间间隔。                                                                                                                                                              | 支持时间格式为Go time type，例如1h30m、5m。关于Go time type，请参见[Go time type](https://pkg.go.dev/time#ParseDuration)。 |
  | yangtse.io/static-eip-expire-no-cascading | 可选  | false | 是否关闭StatefulSet工作负载的级联回收。 默认为false，表示StatefulSet删除后，会级联删除对应的固定EIP。如果您需要在删除StatefulSet对象后，在EIP过期回收时间内保留对应的固定EIP，用于下一次重建同名的StatefulSet再次使用对应的固定EIP，请将该参数设为true。 | "false"或"true"                                                                                           |
     
  表2独占带宽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服务的限制为准。                                                                                                                        |
     
- [共享带宽类型的固定EIP]
  创建有状态负载时固定**共享带宽** 类型的EIP，必须指定带宽ID，示例如下：
  ```
  apiVersion: apps/v1
  kind: StatefulSet
  metadata:
    name: nginx
  spec:
    serviceName: nginx
    replicas: 3
    selector:
      matchLabels:
        app: nginx
    template:
      metadata:
        labels:
          app: nginx
        annotations:
          yangtse.io/static-eip: 'true'   # Pod固定EIP
          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
      spec:
        containers:
          - name: container-0
            image: nginx:alpine
            resources:
              limits:
                cpu: 100m
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
        imagePullSecrets:
          - name: default-secret
  ```
  
  表3Pod固定EIP的annotation配置 
  | annotation                               | 是否可选 | 默认值   | 参数说明                                                                                                                                                                                                    | 取值范围                                                                                                         |
  |:---|:---|:---|:---|:---|
  | yangtse.io/static-eip                     | 必选  | false  | 是否开启Pod固定EIP，只有StatefulSet类型的Pod或无ownerReferences的Pod支持，默认不开启。                                                                                                                                          | "false"或"true"                                                                                            |
  | yangtse.io/static-eip-expire-duration     | 可选   | 5m   | 删除固定EIP的Pod后，对应的固定EIP过期回收的时间间隔。                                                                                                                                                                          | 支持时间格式为Go time type，例如1h30m、5m。关于Go time type，请参见[Go time type](https://pkg.go.dev/time#ParseDuration)。 |
  | yangtse.io/static-eip-expire-no-cascading | 可选  | false | 是否关闭StatefulSet工作负载的级联回收。 默认为false，表示StatefulSet删除后，会级联删除对应的固定EIP。如果您需要在删除StatefulSet对象后，在EIP过期回收时间内保留对应的固定EIP，用于下一次重建同名的StatefulSet再次使用对应的固定EIP，请将该参数设为true。 | "false"或"true"                                                                                           |
     
  表4共享带宽类型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](https://support.huaweicloud.com/usermanual-cce/cce_10_0734.html#cce_10_0734__table042411131132)。  - 填写该字段时，只允许同时指定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服务的限制为准。                                                                                                                                |
     
#### 删除固定EIP
删除Pod后，在配置的固定EIP过期时间内，如果有同名的Pod创建，EIP依旧可用。只有在EIP过期时间内没有同名Pod创建或者删除StatefulSet时开启级联删除EIP时，固定EIP才会删除。
