-
Notifications
You must be signed in to change notification settings - Fork 450
Pod SNAT 和 EIP
Oilbeater edited this page Nov 11, 2020
·
8 revisions
从 v1.5.0 版本开始,Kube-OVN 利用 OVN 中 L3 Gateway 的功能来实现 Pod 级别的 SNAT 和 EIP 功能。通过使用 SNAT,一组 Pod 可以共享一个 IP 地址对外进行访问。通过 EIP 的功能,一个 Pod 可以直接和一个外部 IP 关联,外部服务可以通过 EIP 直接访问 Pod,Pod 也将通过这个 EIP 访问外部服务。
- 为了使用 OVN 的 L3 Gateway 能力,必须将一个单独的网卡接入 OVS 网桥中进行 Overlay 和 Underlay 网络的打通,主机必须有其他的网卡用于运维管理
- 由于经过 NAT 后的数据包会直接进入 Underlay 网络,必须确认当前的网络架构下此类数据包可以安全通过
- SNAT 和 EIP 功能目前不能和集群互联网络功能同时使用
- 创建
ovn-external-gw-config
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: ovn-external-gw-config
namespace: kube-system
data:
enable-external-gw: "true"
external-gw-nodes: "kube-ovn-worker" # NodeName in kubernetes which will act the overlay to underlay gateway functions
external-gw-nic: "eth1" # The nic that will be bridged into ovs and act as overlay to underlay gateway
nic-ip: "172.56.0.1/16" # The ip and mask of the underlay physical gateway
nic-mac: "16:52:f3:13:6a:25" # The mac of the underlay physical gateway
- 等待 Gateway 创建大约 1 分钟,检查 OVN 和 OVS 的状态
检查 OVN-NB 状态, 确认 ovn-external 逻辑交换机存在,并且 ovn-cluster-ovn-external 逻辑路由器端口上绑定了正确的地址和 chassis
[root@kube-ovn ~]# kubectl ko nbctl show
switch 3de4cea7-1a71-43f3-8b62-435a57ef16a6 (ovn-external)
port ln-ovn-external
type: localnet
addresses: ["unknown"]
port ovn-external-ovn-cluster
type: router
router-port: ovn-cluster-ovn-external
router e1eb83ad-34be-4ed5-9a02-fcc8b1d357c4 (ovn-cluster)
port ovn-cluster-ovn-external
mac: "ac:1f:6b:2d:33:f1"
networks: ["172.56.0.100/16"]
gateway chassis: [a5682814-2e2c-46dd-9c1c-6803ef0dab66]
检查 OVS 状态,确认相应的网卡已经桥接进 OVS bridge
[root@nrt1-x1 ~]# kubectl ko vsctl ${gateway node name} show
e7d81150-7743-4d6e-9e6f-5c688232e130
Bridge br-external
Port br-external
Interface br-external
type: internal
Port eno2
Interface eno2
Port patch-ln-ovn-external-to-br-int
Interface patch-ln-ovn-external-to-br-int
type: patch
options: {peer=patch-br-int-to-ln-ovn-external}
- 给 Pod 增加 SNAT 和 EIP 相关的注解
apiVersion: v1
kind: Pod
metadata:
name: pod-gw
annotations:
ovn.kubernetes.io/snat: 172.56.0.200
spec:
containers:
- name: snat-pod
image: nginx:alpine
---
apiVersion: v1
kind: Pod
metadata:
name: pod-gw
annotations:
ovn.kubernetes.io/eip: 172.56.0.233
spec:
containers:
- name: eip-pod
image: nginx:alpine