# 在CCE Turbo集群中为Pod配置固定IP
#### 使用场景
在云原生网络2.0下，会为每个Pod分配用户VPC网络下的一张网卡，支持为StatefulSet工作负载的Pod（容器网卡）固定IP，适用于需要针对具体IP地址做访问控制、服务注册、服务发现、日志审计等场景。
例如，当有一个需要访问云上数据库的StatefulSet类型业务，需要对云上数据库进行严格的访问控制，只允许该业务进行访问，则可固定该业务的Pod IP，配置云上数据库的安全组只允许该业务的Pod IP可进行访问。
#### 约束限制
- 仅以下指定版本的CCE Turbo集群支持用户配置Pod固定IP：
  - v1.19集群：v1.19.16-r6及以上版本
  
  - v1.21集群：v1.21.9-r0及以上版本
  
  - v1.23集群：v1.23.7-r0及以上版本
  
  - v1.25集群：v1.25.3-r0及以上版本
  
  - v1.25以上版本集群
   
- 目前只支持StatefulSet类型的Pod或无ownerReferences的Pod固定IP，暂不支持Deployment、DaemonSet等其他类型的工作负载配置Pod固定IP，且不支持已设置[HostNetwork](https://support.huaweicloud.com/usermanual-cce/cce_10_0402.html)的Pod配置固定IP。
  如果您能保证Pod名称不变，CCE Turbo的v1.19.16-r80、v1.21.12-r0、v1.23.11-r0、v1.25.6-r0、v1.27.3-r0、v1.28.1-r0及以上版本支持配置非Statefulset类型的Pod固定IP，详见[表1]。
  
- 对Pod的IP地址无明确要求的业务不建议配置固定IP，因为配置了固定IP的Pod，Pod重建的耗时会略微变长同时IP地址的利用率会下降。
- 暂不支持CCE Turbo集群中BMS节点上的Pod配置固定IP。在BMS节点（使用弹性网卡）跟ECS节点（使用辅助弹性网卡）混合使用的CCE Turbo集群中，需要为Pod设置节点亲和性调度，以保证Pod不会调度到BMS节点，否则将导致固定IP无法保留。
- 暂不支持CCE Turbo集群的边缘节点上的Pod配置固定IP。在边缘节点跟中心侧节点混合使用的CCE Turbo集群中，需要为Pod设置节点亲和性调度，以保证Pod不会调度到边缘节点，否则将导致固定IP无法保留。
- 不支持直接修改Pod对象的固定IP的annotations的值，如果直接修改的话，后台不会生效；如有修改诉求，请直接修改对应的StatefulSet工作负载spec.template字段下的annotations配置。
- 当固定IP的Pod重建调度时，如果待调度的节点上没有剩余的网卡配额（预绑定的网卡会占用节点的网卡配额），固定IP的网卡会尝试抢占预绑定的网卡，此时固定IP的Pod启动会略微变慢。使用固定IP的节点，请合理配置节点网卡动态预热以确保不会全预热网卡。
 
#### 通过控制台设置
通过控制台创建工作负载时，您可在创建工作负载页面的"高级配置 \> 网络配置"中设置Pod固定IP。
- 是否开启固定IP：开启固定IP后，Pod每次重启都不会改变Pod IP。
- 回收时间间隔：Pod删除后相关IP地址的保留时长。在此时间段内，原Pod IP地址无法被其他Pod使用。
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002024277669.png "点击放大")
#### 通过kubectl命令行设置
您可以通过对StatefulSet添加annotations来设置是否开启Pod固定IP功能，如下所示。
```
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
spec:
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        pod.alpha.kubernetes.io/initialized: 'true'
        yangtse.io/static-ip: 'true'
        yangtse.io/static-ip-expire-no-cascading: 'false'
        yangtse.io/static-ip-expire-duration: 5m
    spec:
      containers:
        - name: container-0
          image: nginx:alpine
          resources:
            limits:
              cpu: 100m
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 200Mi
      imagePullSecrets:
        - name: default-secret
```
 表1Pod固定IP的annotation配置 
| annotation                              | 默认值   | 参数说明                                                                                                                                                                                                                       | 取值范围                                                                                                         |
|:---|:---|:---|:---|
| yangtse.io/static-ip                     | false  | 是否开启Pod固定IP，只有StatefulSet类型的Pod或无ownerReferences的Pod支持，默认不开启。                                                                                                                                                              | "false"或"true"                                                                                            |
| yangtse.io/static-ip-skip-check          | false   | 是否关闭Pod的类型校验，如果您的Pod的ownerReferences不是StatefulSet，且您能保证Pod名称不变，可设置此参数以支持其他类型的Pod固定IP。如果Pod名称发生改变，固定IP将失效。 v1.19.16-r80、v1.21.12-r0、v1.23.11-r0、v1.25.6-r0、v1.27.3-r0、v1.28.1-r0及以上版本的集群支持该参数。 | "false"或"true"                                                                                            |
| yangtse.io/static-ip-expire-duration     | 5m   | 删除固定IP的Pod后，对应的固定IP网卡过期回收的时间间隔。                                                                                                                                                                                             | 支持时间格式为Go time type，例如1h30m、5m。关于Go time type，请参见[Go time type](https://pkg.go.dev/time#ParseDuration)。 |
| yangtse.io/static-ip-expire-no-cascading | false | 是否关闭StatefulSet工作负载的级联回收。 默认为false，表示StatefulSet删除后，会级联删除对应的固定IP网卡。如果您需要在删除StatefulSet对象后，在网卡过期回收时间内保留对应的固定IP，用于下一次重建同名的StatefulSet再次使用对应的固定IP，请将该参数设为true。                                  | "false"或"true"                                                                                           |
   
