某些业务场景下,可能需要某一业务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小时。 |
配置示例
创建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
执行以下命令监控Pod状态变化。
kubectl get pod -o wide -w
返回示例如下,可以看到StatefulSet对应一个名称为web-0的Pod,Pod的IP地址为172.16.0.129。
重新打开一个命令行终端来连接集群,执行以下命令删除StatefulSet包含的Pod。
kubectl delete pod web-0
切换回前一个命令行终端,继续观察Pod状态变化。
新增的返回示例如下,可以看到删除Pod后,StatefulSet会自动创建一个新的Pod,新的Pod的IP地址保持不变。
说明前一个Pod未完全删除前会一直占用IP地址,影响新Pod的创建速度。