您可以通过下述方式为 VPC-CNI 模式的 Pod 直接绑定弹性公网 IP(EIP)。
IPAMDofTKE_QCSRole
,单击角色名称进入角色详情页面。QcloudAccessForIPAMDRoleInQcloudAllocateEIP
, 然后勾选已创建的预设策略 QcloudAccessForIPAMDRoleInQcloudAllocateEIP
。单击确定,完成为 IPAMD 组件角色添加 EIP 接口访问权限操作。该策略包含了 IPAMD 组件操作弹性公网 IP 所需的所有权限。如需自动关联 EIP,可参考以下 Yaml 示例:
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
k8s-app: busybox
name: busybox
namespace: default
spec:
replicas: 1
selector:
matchLabels:
k8s-app: busybox
qcloud-app: busybox
serviceName: ""
template:
metadata:
annotations:
tke.cloud.tencent.com/networks: "tke-route-eni"
tke.cloud.tencent.com/eip-attributes: '{"Bandwidth":"100","ISP":"BGP"}'
tke.cloud.tencent.com/eip-claim-delete-policy: "Never"
creationTimestamp: null
labels:
k8s-app: busybox
qcloud-app: busybox
spec:
containers:
- args:
- "10000000000"
command:
- sleep
image: busybox
imagePullPolicy: Always
name: busybox
resources:
limits:
tke.cloud.tencent.com/eni-ip: "1"
tke.cloud.tencent.com/eip: "1"
requests:
tke.cloud.tencent.com/eni-ip: "1"
tke.cloud.tencent.com/eip: "1"
tke.cloud.tencent.com/eip
,从而让调度器保证 Pod 调度到的节点仍有 EIP 资源可使用。ISP
参数可配置为 BGP
、CMCC
、CTCC
、CUCC
,分别对应普通线路 BGP IP、静态单线 IP(网络运营商中国移动、中国电信、中国联通)。若不填写,则默认值为 100 Mbps 和 BGP。流量按小时后付费
。如需自动关联指定 EIP,可参考以下 Yaml 示例:
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
k8s-app: busybox
name: busybox
namespace: default
spec:
replicas: 1
selector:
matchLabels:
k8s-app: busybox
qcloud-app: busybox
serviceName: ""
template:
metadata:
annotations:
tke.cloud.tencent.com/networks: "tke-route-eni"
tke.cloud.tencent.com/eip-id-list: "eip-xxx1,eip-xxx2"
creationTimestamp: null
labels:
k8s-app: busybox
qcloud-app: busybox
spec:
containers:
- args:
- "10000000000"
command:
- sleep
image: busybox
imagePullPolicy: Always
name: busybox
resources:
limits:
tke.cloud.tencent.com/eni-ip: "1"
tke.cloud.tencent.com/eip: "1"
requests:
tke.cloud.tencent.com/eni-ip: "1"
tke.cloud.tencent.com/eip: "1"
eip-xxx1
的 EIP,第二个副本使用 eipID 为 eip-xxx2
的 EIP。当前解析指定策略:Pod按照其名字末尾的编号依次选用注解中的 EIP,若名字末尾无编号(如deployment类型),则随机选用,冲突时只能有一个Pod关联成功。推荐无编号的 Pod 只指定单个 EIP。tke.cloud.tencent.com/eip
,从而让调度器保证 Pod 调度到的节点仍有 EIP 资源可使用。当前集群内默认部署了 ip-masq-agent
组件,该组件默认会对集群内 Pod 的主动外访流量以所在节点的地址做 SNAT。此外,如果 vpc 内配置了 NAT 网关,则其对 Pod 的主动外访流量也有影响。因此,如需让 Pod 的主动外访流量走其关联的 EIP,则需修改相关配置和路由策略以达到效果。
需修改集群内的 SNAT 规则来让关联 EIP 的 Pod 的主动外访流量不被做 SNAT:
kubectl -n kube-system edit cm ip-masq-agent-config
在data.config
字段中加入键为NonMasqueradeSrcCIDRs
的新字段,值为已关联 EIP 的 Pod 的内网 IP 网段列表,如 IP 为172.16.0.2
,则要填写172.16.0.2/32
。以下为样例:
apiVersion: v1
data:
config: '{"NonMasqueradeCIDRs":["172.16.0.0/16","10.67.0.0/16"],"NonMasqueradeSrcCIDRs":["172.16.0.2/32"],"MasqLinkLocal":true,"ResyncInterval":"1m0s","MasqLinkLocalIPv6":false}'
kind: ConfigMap
metadata:
name: ip-masq-agent-config
namespace: kube-system
填写后保存退出即生效,该配置会在一分钟内同步热更新。
该字段的作用是网段内的 Pod 主动外访流量不再做节点地址的 SNAT,如果填写较大的网段,则网段内的 Pod 也会不再做 SNAT,请慎重填写。
如果集群所在 VPC 内配置了 NAT 网关,请参考文档调整 NAT 网关和 EIP 的优先级确保配置正确(查询路由表时要查询 Pod 所在子网关联的路由表),否则 Pod 的主动外访流量可能优先走 NAT 网关,而非 EIP。
Pod 启用自动关联 EIP 特性后,网络组件会为该 Pod 在同 namespace 下创建同名的 CRD 对象 EIPClaim
。该对象描述 Pod 对 EIP 的需求。
对于非固定 EIP 的 Pod,其 Pod 销毁后 EIPClaim
也会被销毁,Pod 关联的 EIP 随之销毁回收。而对于固定 EIP 的 Pod,其 Pod 销毁后 EIPClaim
仍然保留,EIP 也因此保留。同名的 Pod 启动后会使用同名的 EIPClaim
关联的 EIP,从而实现 EIP 保留。
下面介绍三种回收 EIP 的方法:过期回收、手动回收及级联回收。
在 创建集群 页面,容器网络插件选择 VPC-CNI 模式并且勾选开启支持固定 Pod IP 支持,如下图所示:
在高级设置中设置 IP 回收策略,可以设置 Pod 销毁后多少秒回收保留的固定 IP。如下图所示:
对于存量集群,也可支持变更:
kubectl edit deploy tke-eni-ipamd -n kube-system
。spec.template.spec.containers[0].args
中加入/修改启动参数。- --claim-expired-duration=1h # 可填写不小于 5m 的任意值
对于急需回收的 EIP,找到对应的 Pod 的名称空间和名称,执行以下命令通过手动回收:
注意:需保证回收的 EIP 对应的 Pod 已经销毁,否则会再次触发关联绑定 EIP。
kubectl delete eipc <podname> -n <namespace>
目前的固定 EIP 与 Pod 强绑定,而与具体的 Workload 无关(例如 deployment、statefulset 等)。Pod 销毁后,固定 EIP 不确定何时回收。TKE 现已实现删除 Pod 所属的 Workload 后即刻删除固定 EIP。要求 IPAMD 组件版本在 v3.3.9+(可通过镜像 tag 查看)。
以下步骤介绍如何开启级联回收:
kubectl edit deploy tke-eni-ipamd -n kube-system
。spec.template.spec.containers[0].args
中加入启动参数:- --enable-ownerref
修改后,ipamd 会自动重启并生效。生效后,增量 Workload 可实现级联删除固定 EIP,存量 Workload 暂不能支持。
本页内容是否解决了您的问题?