全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

固定Pod IP

最近更新时间:2024-01-04 20:00:04

KCE目前支持在Flannel、Calico网络模型下选择附加开启VPC-CNI模式,当您的业务存在固定Pod IP需求时,可以选择StatefulSet类型的工作负载并开启固定IP模式。启用VPC-CNI模式的Statefulset创建的Pod将通过弹性网卡分配VPC中的IP,当Pod发生漂移或重启时可保证IP不变,对 IP 无限制的业务不推荐使用固定 IP 模式。

使用场景

  • 有状态业务(如数据库、MQ)场景,需要确保IP地址和端口号不变保持稳定链接

  • 安全策略场景,需要使用已授权的IP地址来访问某个业务

  • 传统微服务应用直接使用Pod IP进行微服务注册

能力及限制

  • 支持Pod销毁后保留IP,以使得Pod重建、迁移IP不变

  • 支持 Pod IP关联弹性公网 IP,Pod可以外访

  • 支持Statefulset类型工作负载启用固定Pod IP(其他类型暂不支持)

  • 不支持跨子网调度固定IP的Pod

  • 不支持容器子网与其他集群或业务共享,以确保固定IP模式下的保留IP不被占用

前提条件

  • 您已使用金山云容器服务服务创建一个正常运行的Kubernetes集群,关于如何创建集群,请参见创建集群

使用方式

开启VPC-CNI模式下固定Pod IP功能

  1. 在创建集群时,选择启用VPC-CNI附加模式;开启固定Pod IP功能

  1. 在集群详情页中也可以启用VPC-CNI模式,并开启固定Pod IP

说明:

  • 当开启固定IP功能后,需要设置IP回收策略,当Pod销毁后超过设置时间将对IP进行回收,不填写即默认为不回收。

  • 对于非固定IP的Pod不会受此功能的影响,即当Pod销毁后立即回收Pod IP。

通过控制台创建固定Pod IP的Statefulset

  1. 创建Statefulset类型工作负载,在部署配置中点击”展开高级配置“,选中”VPC-CNI“网络模式,在开启固定Pod IP,完成Statefulset创建。

  1. 验证效果

#检查statefulset状态
$:~# kubectl get sts sts -owide
NAME   READY   AGE    CONTAINERS   IMAGES
sts         1/1        3m3s   sts                    nginx:latest
#查看pod ip
$:~# kubectl get po sts-0 -owide
NAME    READY   STATUS    RESTARTS   AGE         IP                NODE        NOMINATED NODE   READINESS GATES
sts-0      1/1         Running   0                 3m11s    10.0.0.236   10.0.0.47    <none>                      <none>
#删除pod sts-0
$:~# kubectl delete po sts-0
pod "sts-0" deleted
# pod重建后查看IP
$:~# kubectl get po sts-0 -owide
NAME    READY   STATUS    RESTARTS   AGE         IP                NODE        NOMINATED NODE   READINESS GATES
sts-0      1/1         Running   0                 41s          10.0.0.236   10.0.0.47    <none>                      <none>

通过Yaml创建固定Pod IP的Statefulset

  1. 创建Yaml文件,并通过Kubectl apply的方式创建Statefulset

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    ksyun-app: sts-3
  name: sts-3
  namespace: default
spec:
  podManagementPolicy: OrderedReady
  replicas: 1
  selector:
    matchLabels:
      ksyun-app: sts-3
  serviceName: ""
  template:
    metadata:
      annotations:
        k8s.ksyun.com/pod-eniip: "true"
        k8s.ksyun.com/pod-ip-fixed: "true"
        v1.multus-cni.io/default-network: "kube-system/vpc-cni"
      creationTimestamp: null
      labels:
        ksyun-app: sts-3
    spec:
      containers:
      - image: hub.kce.ksyun.com/xiangqian/nginx:1.22.0
        imagePullPolicy: Always
        name: nginx
        resources:
          limits:
            ksyun/eni-private-ip: "1"
          requests:
            ksyun/eni-private-ip: "1"
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: ksyunregistrykey
      restartPolicy: Always
      schedulerName: default-scheduler
  • spec.template.metadata.annotations中k8s.ksyun.com/pod-eniip: "true" 和spec.resources中的ksyun/eni-private-ip: "1"说明Pod使用共享网卡模式;如果使用的是独立网卡模式,请将annotations更改为k8s.ksyun.com/pod-eni: "true"和resources部分更改为ksyun/eni: "1"

独占、共享模式固定IP简析

独占模式

固定IP模式下,会为Pod创建同namespace下同name的CRD对象PodEni。该对象中会记录Pod的IP保留策略和周期、IP地址、使用的弹性网卡ID、可用区等。当pod删除时,

1)如果非固定ip的pod,则同时删除关联的PodEni对象,并且卸载和删除eni。

2)如果是固定ip的pod,则不删除PodEni对象。包括卸载eni但不删除eni。

3)当Pod创建时,如果annotation中注明使用固定IP,则查找是否有相应的PodEni存在,没有的话,新分配eni;如果有,则进行第四步。

4)根据PodEni描述,将eni挂载到pod所在宿主机上进行使用(独占模式)。

共享模式

固定IP模式下,会为pod创建同namespace下以pod ip命名的CRD对象podeniip。该对象中会记录pod的IP保留策略和周期、IP地址、子网ID、可用区等。当pod删除时

1)如果是非固定ip的pod,则同时删除关联的VpcIP对象,并且取消pod ip的分配。

2)如果是固定ip的pod,则保留关联的PodEniIP对象,将eni-ip从eni上取消分配,并且设置为子网的预留IP。

3)当pod创建时,如果annotation中注明使用固定ip,则查找是否存在相应的podeniip对象,没有的话,新创建关联的podeniip对象。如果有,则进行第四步。

4)根据podeniip描述,取消对eni-ip的预留,将其分配给指定弹性网卡;指定弹性网卡的获取参考第5)步。

5)如果该节点上已挂载了相应子网的弹性网卡,并且没有达到支持辅助ip个数的上限,则使用已有eni。如果没有可用的已绑定的eni,则从相应子网中新建eni进行绑定。

常见问题

手动回收Pod IP

当资源不足时,需要紧急回收时,支持手动删除保留的资源。

手动回收:对于急需回收的 IP 地址,需要先确定需回收的 IP 被哪个 Pod 占用,找到对应的 Pod 的名称空间和名称,手动回收podeni或者podeniip,以及登录到控制台上手动执行eni的删除或者eni-ip的取消分配。

静态Pod使用固定 Pod IP

静态Pod同样支持使用固定Pod IP功能,Yaml中需填写的annotation和resources请参考 通过Yaml创建固定Pod IP的Statefulset

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈