-
Notifications
You must be signed in to change notification settings - Fork 457
Underlay 网络支持
默认情况下 OVN 使用 Geneve 对跨主机流量进行封装,在基础设施之上抽象出一层虚拟的 overlay 网络。对于希望容器网络直接使用物理网络地址段情况,可以将 Kube-OVN 工作在 Underlay 模式,可以直接给容器分配物理网络中的地址资源,达到更好的性能以及和物理网络的连通性。
该模式下 Kube-OVN 网络表现和 Macvlan 类似,但相比 Macvlan 提供了地址管理,固定IP,服务发现,网络策略和 QoS 等功能。但由于该模式下容器网络直接使用物理网络资源进行包转发,Geneve 模式下的 SNAT/EIP, 分布式网关/集中式网关等 L3 功能无法使用。
当前模式下需要宿主机将一块网卡桥接到 ovs bridge 中提供容器和物理网络直通的功能。该网卡桥接后无法用于主机间通信,因此宿主机需要有多网卡分别承担管理流量和容器流量。从 1.7.0 版本开始,Kube-OVN 会将网卡的 Mac 地址、IP 地址、路由以及 MTU 将转移或复制至对应的 OVS Bridge,以支持单网卡部署 Underlay 网络。OVS Bridge 名称格式为 br-PROVIDER_NAME
,PROVIDER_NAME
为 Provider 网络名称(默认为 provider)。
在 1.7.0 及之前支持 Underlay 的版本中,使用 Underlay 网络需要在部署时指定网络模式为 vlan
或 hybrid
,并配置其它相关参数。
从 1.7.1 版本开始,Kube-OVN 内置混合模式支持,支持在同一个集群中动态创建/删除 Overlay 和 Underlay 网络。部署时指定的网络模式及相关参数只在默认子网中生效,网络模式不再支持 hybrid
选项。
- 下载安装脚本
wget https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.7/dist/images/install.sh
- 修改脚本中相应配置
NETWORK_TYPE 设置为 vlan
VLAN_INTERFACE_NAME 设置为宿主机上承担容器流量的网卡,例如 eth1
VLAN_ID 设置为 0
POD_CIDR 设置为物理网络 CIDR, 例如 192.168.1.0/24
POD_GATEWAY 设置为物理网络网关,例如192.168.1.1
EXCLUDE_IPS 排除范围,避免容器网段和物理网络已用 IP 冲突,例如 192.168.1.1..192.168.1.100
- 运行安装脚本
bash install.sh
创建如下 ProviderNetwork 并应用:
apiVersion: kubeovn.io/v1
kind: ProviderNetwork
metadata:
name: net1
spec:
defaultInterface: eth1
customInterfaces:
- interface: eth2
nodes:
- node1
excludeNodes:
- node2
defaultInterface
为默认使用的物理网卡名称;customInterfaces
为可选项,可针对特定节点指定需要桥接的物理网卡;excludeNodes
也是可选项,用于指定不桥接物理网卡的节点。
ProviderNetwork 创建成功后,各节点(除 excludeNodes 外)中会创建名为 br-net1(格式为 br-NAME
)的 OVS 网桥,并将指定的物理网卡桥接至此网桥。
excludeNodes
中的节点会被添加 net1.provider-network.ovn.kubernetes.io/exclude=true
标签,其它节点会被添加如下标签:
Key | Value | 描述 |
---|---|---|
net1.provider-network.ovn.kubernetes.io/ready | true | 节点中的桥接工作已完成,ProviderNetwork 在节点中可用 |
net1.provider-network.ovn.kubernetes.io/interface | eth1 | 节点中被桥接的物理网卡的名称 |
net1.provider-network.ovn.kubernetes.io/mtu | 1500 | 节点中被桥接的物理网卡的 MTU |
如果物理网卡上已经配置了 IP,则 IP 地址和网卡上的路由会被转移至 OVS 网桥。
创建如下 VLAN 并应用:
apiVersion: kubeovn.io/v1
kind: Vlan
metadata:
name: vlan1
spec:
id: 0
provider: net1
id
为 VLAN ID/Tag,provider
为需要使用的 ProviderNetwork 的名称。多个 VLAN 可以引用同一个 ProviderNetwork。
示例如下:
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
name: subnet1
spec:
cidrBlock: 172.17.0.0/16
gateway: 172.17.0.1
vlan: vlan1
natOutgoing: false
private: false
underlayGateway: true
将 vlan
的值指定为需要使用的 VLAN 名称即可。多个 Subnet 可以引用同一个 VLAN。
可按正常容器创建方式进行创建,查看容器 IP 是否在规定范围内,以及容器是否可以和物理网络互通。
如有固定 IP 需求,可参考 Pod 固定IP 和 Mac