文档

配置ECI Pod使用固定IP地址

更新时间:

某些业务场景下,可能需要某一业务Pod使用固定的IP地址。本文介绍如何配置ECI Pod使用固定的IP地址。

功能说明

默认情况下,创建ECI Pod时,系统会从eci-profile中配置的交换机网段中,随机为Pod分配一个IP地址。如果Pod因为故障释放了,IP地址会随之释放,新创建的Pod会被分配新的IP地址。在某些业务场景下(例如一些IP地址直接暴露的服务),可能需要某一Pod使用固定的IP地址,否则会影响实际业务。

基于上述场景,ECI支持了固定IP地址的功能。在创建ECI Pod时,如果Pod启用了固定IP地址,则系统会从配置的交换机网段中为其分配两个IP地址,一个为动态IP地址(该地址在集群内不可见),一个为固定IP地址。该Pod释放后,系统会保留其固定的IP地址,在有效期内(默认48小时),如果新创建的Pod与被释放的Pod的Cluster ID、Namespace和Pod Name一致,且启用了固定IP地址,则系统会将保留的IP地址分配给新创建的Pod,从而实现同一业务需求的Pod的IP地址保持不变。

说明

该功能场景下,您可以使用StatefulSet来部署业务,StatefulSet包含的Pod释放后,系统会自动创建新的相同Namespace和Pod Name的Pod。

配置说明

您可以在Pod metadata中添加Annotation来配置ECI Pod启用固定IP地址,以及固定IP地址空闲后的保留时长。相关Annotation说明如下:

Annotation

示例值

说明

k8s.aliyun.com/eci-fixed-ip

"true"

配置为true表示Pod启用固定IP地址。

k8s.aliyun.com/eci-fixed-ip-retain-hour

"24"

固定IP地址空闲后的保留时长,即启用固定IP地址的Pod释放后,其固定IP地址的保留时长,单位为小时。

如果没有配置该Annotation,默认保留48小时。

配置示例

  1. 创建Service和StatefulSet。

    kubectl apply -f fixedIp.yaml

    fixedIp.yaml的内容示例如下,表示创建一个Service和一个StatefulSet,StatefulSet中包含一个ECI Pod,该Pod配置了启用固定IP地址的Annotation。

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      minReadySeconds: 10
      template:
        metadata:
          annotations:
            k8s.aliyun.com/eci-fixed-ip: "true"  #启用固定IP地址
          labels:
            app: nginx
            alibabacloud.com/eci: "true"
        spec:
          containers:
          - name: nginx
            image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2
            ports:
            - containerPort: 80
              name: web
  2. 执行以下命令监控Pod状态变化。

    kubectl get pod -o wide -w

    返回示例如下,可以看到StatefulSet对应一个名称为web-0的Pod,Pod的IP地址为172.16.0.129。

    ECI固定IP1..png
  3. 重新打开一个命令行终端来连接集群,执行以下命令删除StatefulSet包含的Pod。

    kubectl delete pod web-0
  4. 切换回前一个命令行终端,继续观察Pod状态变化。

    新增的返回示例如下,可以看到删除Pod后,StatefulSet会自动创建一个新的Pod,新的Pod的IP地址保持不变。

    说明

    前一个Pod未完全删除前会一直占用IP地址,影响新Pod的创建速度。

    ECI固定IP2..png