最近更新时间: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功能
在集群详情页中也可以启用VPC-CNI模式,并开启固定Pod IP
说明:
当开启固定IP功能后,需要设置IP回收策略,当Pod销毁后超过设置时间将对IP进行回收,不填写即默认为不回收。
对于非固定IP的Pod不会受此功能的影响,即当Pod销毁后立即回收Pod IP。
创建Statefulset类型工作负载,在部署配置中点击”展开高级配置“,选中”VPC-CNI“网络模式,在开启固定Pod IP,完成Statefulset创建。
验证效果
#检查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文件,并通过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模式下,会为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进行绑定。
当资源不足时,需要紧急回收时,支持手动删除保留的资源。
手动回收:对于急需回收的 IP 地址,需要先确定需回收的 IP 被哪个 Pod 占用,找到对应的 Pod 的名称空间和名称,手动回收podeni或者podeniip,以及登录到控制台上手动执行eni的删除或者eni-ip的取消分配。
静态Pod同样支持使用固定Pod IP功能,Yaml中需填写的annotation和resources请参考 通过Yaml创建固定Pod IP的Statefulset 。
纯净模式