k8s ovn egressip
简介:
集群管理员为命名空间分配一个或多个出口 IP 地址,或分配给命名空间中的特定 pod。
出口 IP 地址功能可确保来自一个或多个命名空间中的一个或多个 pod 的流量具有集群网络之外的服务具有一致的源 IP 地址;
出口 IP 地址作为额外 IP 地址在节点的主网络接口中使用,且必须与节点的主 IP 地址位于同一个子网中。不能为集群中的任何其他节点分配额外的 IP 地址。
在一些集群配置中,应用程序 pod 和入口路由器 pod 在同一个节点上运行。如果在这种情况下为应用程序项目配置出口 IP,则在从应用程序项目向路由发送请求时不会使用 IP。
将出口 IP 分配给 pod
要将一个或多个出口 IP 分配给命名空间中的命名空间或特定 pod,必须满足以下条件:
- 集群中至少有一个节点必须具有
k8s.ovn.org/egress-assignable: ""
标签。(不存在可以添加) - 存在一个
EgressIP
对象定义一个或多个出口 IP 地址,用作从命名空间中离开集群的流量的源 IP 地址。
将出口 IP 分配给节点
在创建 EgressIP
对象时,以下条件适用于标记为 k8s.ovn.org/egress-assignable: ""
标签的节点:
- 每次不会将出口 IP 地址分配给多个节点。
- 出口 IP 地址可在可以托管出口 IP 地址的可用节点之间平衡。
- 如果
EgressIP
对象中的spec.EgressIPs
数组指定了多个 IP 地址,则不会有超过一个指定地址的节点托管。 - 如果节点不可用,则会自动重新分配给它的所有出口 IP 地址,但符合前面描述的条件。
当 Pod 与多个 EgressIP
对象的选择器匹配时,无法保证在 EgressIP
对象中指定的出口 IP 地址被分配为 pod 的出口 IP 地址。
另外,如果 EgressIP
对象指定了多个出口 IP 地址,则无法保证可以使用哪些出口 IP 地址。例如,如果 pod 与具有两个出口 IP 地址 10.10.20.1
和 10.10.20.2
的 EgressIP
对象的选择器匹配,则可能用于每个 TCP 连接或 UDP 对话。
EgressIP
对象
以下 EgressIP
对象描述了一个配置,该配置选择将 env
标签设置为 prod
的任意命名空间中的所有 pod。所选 pod 的出口 IP 地址为 192.168.126.10
和 192.168.126.102
。
对象信息:
root@master:~# kubectl describe egressip Name: egressip-test Namespace: Labels: <none> Annotations: <none> API Version: k8s.ovn.org/v1 Kind: EgressIP Metadata: Creation Timestamp: 2023-03-08T05:40:26Z Generation: 14 Spec: Egress I Ps: 192.168.108.29 192.168.108.30 Namespace Selector: Match Labels: Ns - Egressip: ns-egressip Pod Selector: Status: Items: Egress IP: 192.168.108.29 Node: node2 Egress IP: 192.168.108.30 Node: node1 Events: <none>
查看系统已经分配的egressip,(这里未显示完全)
root@master:~# kubectl get egressip NAME EGRESSIPS ASSIGNED NODE ASSIGNED EGRESSIPS egressip-test 192.168.108.29 node2 192.168.108.29
POD 与外部主机进行通讯,抓包查看信息:
root@master:~# kubectl get pod -n egressip -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-busybox-65fdc868df-4wm6z 1/1 Running 0 75m 10.244.1.15 node2 <none> <none> pod-busybox-65fdc868df-j7h45 1/1 Running 0 76m 10.244.2.10 node1 <none> <none> pod-busybox-egressip 1/1 Running 0 15m 10.244.2.12 node1 <none> <none> root@master:~# kubectl exec -n egressip pod-busybox-65fdc868df-4wm6z -- ping 192.168.108.26 -c 2 PING 192.168.108.26 (192.168.108.26): 56 data bytes 64 bytes from 192.168.108.26: seq=0 ttl=126 time=8.152 ms 64 bytes from 192.168.108.26: seq=1 ttl=126 time=8.083 ms --- 192.168.108.26 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 8.083/8.117/8.152 ms
抓包信息内容: