Skip to content

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 功能目前不能和集群互联网络功能同时使用

使用步骤

  1. 创建 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
  1. 等待 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}
  1. 给 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
Clone this wiki locally