OVN-Kubernetes 网络插件
OpenShift Dedicated 中 OVN-Kubernetes 网络插件的深度配置和故障排除
摘要
第 1 章 关于 OVN-Kubernetes 网络插件 复制链接链接已复制到粘贴板!
OpenShift Dedicated 集群将虚拟网络用于 pod 和服务网络。
Red Hat OpenShift Networking 的一部分,OVN-Kubernetes 网络插件是 OpenShift Dedicated 的默认网络供应商。OVN-Kubernetes 基于 Open Virtual Network(OVN),它提供了一个基于 overlay 的网络实现。使用 OVN-Kubernetes 插件的集群还在每个节点上运行 Open vSwitch (OVS)。OVN 在每个节点上配置 OVS 来实现声明的网络配置。
OVN-Kubernetes 是 OpenShift Dedicated 和单节点 OpenShift 部署的默认网络解决方案。
OVN-Kubernetes (来自 OVS 项目)使用许多相同的结构,如开放流规则,来决定数据包通过网络传输的方式。如需更多信息,请参阅 Open Virtual Network 网站。
OVN-Kubernetes 是 OVS 的一系列守护进程,用于将虚拟网络配置转换为 OpenFlow 规则。OpenFlow 是一种用于与网络交换机和路由器通信的协议,为远程控制网络设备上的网络流量流提供了方法。这意味着网络管理员可以配置、管理和监视网络流量的流。
OVN-Kubernetes 提供了 OpenFlow 提供的更多高级功能。OVN 支持分布式虚拟路由、分布式逻辑交换机、访问控制、动态主机配置协议(DHCP)和 DNS。OVN 在逻辑流中实施分布式虚拟路由,这些路由等同于开放流。例如,如果您有一个向网络上的 DHCP 服务器发送 DHCP 请求的 pod,则请求中的逻辑流规则可帮助 OVN-Kubernetes 处理数据包。这意味着服务器可以响应网关、DNS 服务器、IP 地址和其他信息。
OVN-Kubernetes 在每个节点上运行一个守护进程。数据库和 OVN 控制器都有守护进程集,每个节点上运行的 OVN 控制器。OVN 控制器在节点上对 Open vSwitch 守护进程进行编程,以支持以下网络供应商功能:
- 出口 IP
- 防火墙
- 硬件卸载
- 混合网络
- 互联网协议安全(IPsec)加密
- IPv6
- 多播。
- 网络策略和网络策略日志
- 路由器
1.1. OVN-Kubernetes 目的 复制链接链接已复制到粘贴板!
OVN-Kubernetes 网络插件是一个开源、功能齐全的 Kubernetes CNI 插件,它使用 Open Virtual Network (OVN)来管理网络流量。OVN 是一个社区开发、与供应商无关的网络虚拟化解决方案。OVN-Kubernetes 网络插件使用以下技术:
- OVN 管理网络流量流。
- Kubernetes 网络策略支持和日志,包括入口和出口规则。
- 通用网络虚拟化封装(Geneve)协议,而不是虚拟可扩展局域网(VXLAN),以在节点之间创建覆盖网络。
OVN-Kubernetes 网络插件支持以下功能:
- 可以运行 Linux 和 Microsoft Windows 工作负载的混合集群。此环境称为混合网络。
- 将网络数据处理从主机中央处理单元(CPU)卸载到兼容的网卡和数据处理单元(DPU)。这称为硬件卸载(hardware offloading)。
- IPv4-primary 双栈网络,在裸机、VMware vSphere、IBM Power®、IBM Z® 和 Red Hat OpenStack Platform (RHOSP)平台上。
- RHOSP 和裸机平台上的 IPv6 单堆栈网络。
- 在裸机、VMware vSphere 或 RHOSP 平台上运行的集群的 IPv6-primary 双栈网络。
- 出口防火墙设备和出口 IP 地址。
- 以重定向模式运行的出口路由器设备。
- 集群内通信的 IPsec 加密。
红帽不支持使用 OVN-Kubernetes 网络插件的以下安装后配置:
- 配置主网络接口,包括使用 NMState Operator 为接口配置绑定。
-
在使用 Open vSwitch (OVS)或 OVN-Kubernetes
br-ex网桥网络的网络设备上配置子接口或附加网络接口。 - 在主网络接口上创建其他虚拟局域网(VLAN)。
-
使用您在集群安装过程中为节点创建的主网络接口(如
eth0)来创建其他二级网络。0或 bond
红帽支持以下使用 OVN-Kubernetes 网络插件的安装后配置:
-
从基础物理接口(如
eth0.100)创建额外的 VLAN,其中您将主网络接口配置为集群安装过程中节点的 VLAN。这是因为 Open vSwitch (OVS)网桥附加到初始 VLAN 子接口,如eth0.100,保留基础物理接口可用于新配置。 -
使用
localnet拓扑网络创建额外的 OVN 二级网络需要在NodeNetworkConfigurationPolicy(NNCP)对象中定义二级网络。创建网络后,Pod 或虚拟机(VM)可以附加到网络。这些从属网络为物理网络提供专用连接,可能或不能使用 VLAN 标记。您无法从主机没有所需设置的节点的主机网络访问这些网络,如所需的网络设置。
1.2. OVN-Kubernetes IPv6 和双栈限制 复制链接链接已复制到粘贴板!
OVN-Kubernetes 网络插件有以下限制:
对于为双栈网络配置的集群,IPv4 和 IPv6 流量都必须使用与默认网关相同的网络接口。
如果不满足此要求,则
ovnkube-node守护进程集中的主机上的容器集进入CrashLoopBackOff状态。如果您使用
oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node -o yaml等命令显示 pod,则status字段具有多个有关默认网关的消息,如以下输出所示:I1006 16:09:50.985852 60651 helper_linux.go:73] Found default gateway interface br-ex 192.168.127.1 I1006 16:09:50.985923 60651 helper_linux.go:73] Found default gateway interface ens4 fe80::5054:ff:febe:bcd4 F1006 16:09:50.985939 60651 ovnkube.go:130] multiple gateway interfaces detected: br-ex ens4
I1006 16:09:50.985852 60651 helper_linux.go:73] Found default gateway interface br-ex 192.168.127.1 I1006 16:09:50.985923 60651 helper_linux.go:73] Found default gateway interface ens4 fe80::5054:ff:febe:bcd4 F1006 16:09:50.985939 60651 ovnkube.go:130] multiple gateway interfaces detected: br-ex ens4Copy to Clipboard Copied! Toggle word wrap Toggle overflow 唯一的解析是重新配置主机网络,以便两个 IP 系列都针对默认网关使用相同的网络接口。
对于为双栈网络配置的集群,IPv4 和 IPv6 路由表必须包含默认网关。
如果不满足此要求,则
ovnkube-node守护进程集中的主机上的容器集进入CrashLoopBackOff状态。如果您使用
oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node -o yaml等命令显示 pod,则status字段具有多个有关默认网关的消息,如以下输出所示:I0512 19:07:17.589083 108432 helper_linux.go:74] Found default gateway interface br-ex 192.168.123.1 F0512 19:07:17.589141 108432 ovnkube.go:133] failed to get default gateway interface
I0512 19:07:17.589083 108432 helper_linux.go:74] Found default gateway interface br-ex 192.168.123.1 F0512 19:07:17.589141 108432 ovnkube.go:133] failed to get default gateway interfaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 唯一的解析是重新配置主机网络,以便两个 IP 系列都包含默认网关。
-
如果您为集群在
MachineConfig自定义资源(CR)的kernelArgument部分中将ipv6.disable参数设置为1,则 OVN-Kubernetes pod 会进入CrashLoopBackOff状态。另外,将集群更新至 OpenShift Dedicated 的更新版本会失败,因为 Network Operator 处于Degraded状态。红帽不支持为集群禁用 IPv6 寻址,因此不要将ipv6.disable参数设置为1。
1.3. 会话关联性 复制链接链接已复制到粘贴板!
会话关联性是适用于 Kubernetes Service 对象的功能。如果要确保每次连接到 <service_VIP>:<Port> 时,您可以使用 会话关联性,流量始终被加载到同一后端。如需更多信息,包括如何根据客户端的 IP 地址设置会话关联性,请参阅会话关联性。
1.3.1. 会话关联性的粘性超时 复制链接链接已复制到粘贴板!
OpenShift Dedicated 的 OVN-Kubernetes 网络插件根据最后一个数据包计算来自客户端的会话的粘性超时。例如,如果您运行 curl 命令 10 次,则粘性会话计时器从第十个数据包开始,而不是第一个数据包。因此,如果客户端不断联系该服务,则会话永远不会超时。当服务没有收到 timeoutSeconds 参数所设定的时间的数据包时,超时开始。
第 2 章 从 OpenShift SDN 网络插件迁移到 OVN-Kubernetes 网络插件 复制链接链接已复制到粘贴板!
作为 OpenShift Dedicated 集群管理员,您可以从 OpenShift SDN 网络插件启动迁移到 OVN-Kubernetes 网络插件,并使用 OCM CLI 验证迁移状态。
开始迁移前的一些注意事项包括:
- 集群版本必须是 4.16.43 及更高版本。
- 迁移过程无法中断。
- 无法迁移回 SDN 网络插件。
- 集群节点将在迁移过程中重新引导。
- 对节点中断的工作负载不会有影响。
- 根据集群大小和工作负载配置,迁移时间可能会在几分钟和小时之间而有所不同。
您只能在版本 4.16.43 及更高版本的集群中启动迁移。
先决条件
OpenShift Cluster Manager API 命令行界面(ocm)只是一个技术预览功能。有关红帽开发人员预览功能的支持范围的更多信息,请参阅 开发人员预览支持范围。
流程
使用以下内容创建 JSON 文件:
{ "type": "sdnToOvn" }{ "type": "sdnToOvn" }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:在 JSON 文件中,您可以使用任何或所有选项
加入、伪装和传输,以及每个选项的一个 CIDR 配置内部子网,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意OVN-Kubernetes 保留以下 IP 地址范围:
100.64.0.0/16。默认情况下,此 IP 地址范围用于 OVN-Kubernetes 的internalJoinSubnet参数。100.88.0.0/16。默认情况下,此 IP 地址范围用于 OVN-Kubernetes 的internalTransSwitchSubnet参数。如果 OpenShift SDN 使用这些 IP 地址,或者任何可能会与此集群通信的外部网络,则您必须在启动有限的实时迁移前使用不同的 IP 地址范围。如需更多信息,请参阅附加资源部分中的 对 OVN-Kubernetes 地址范围 进行补丁。
要启动迁移,请在终端窗口中运行以下命令:
ocm post /api/clusters_mgmt/v1/clusters/{cluster_id}/migrations$ ocm post /api/clusters_mgmt/v1/clusters/{cluster_id}/migrations1 --body=myjsonfile.json2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要检查迁移的状态,请运行以下命令:
ocm get cluster <cluster_id>/migrations
$ ocm get cluster <cluster_id>/migrations1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<cluster_id> 替换为迁移应用到的集群 ID。
第 3 章 配置集群范围代理 复制链接链接已复制到粘贴板!
如果使用现有的 Virtual Private Cloud (VPC),您可以在 OpenShift Dedicated 集群安装过程中或安装集群后配置集群范围代理。当您启用代理时,核心集群组件会被拒绝访问互联网,但代理不会影响用户工作负载。
只有集群系统出口流量会被代理,包括对云供应商 API 的调用。
您只能为使用客户云订阅 (CCS) 模型的 OpenShift Dedicated 集群启用代理。
如果使用集群范围代理,您需要维护到集群的代理可用性。如果代理不可用,这可能会影响集群的健康和支持性。
3.1. 配置集群范围代理的先决条件 复制链接链接已复制到粘贴板!
要配置集群范围的代理,您必须满足以下要求。当您在安装过程中或安装后配置代理时,这些要求有效。
3.1.1. 常规要求 复制链接链接已复制到粘贴板!
- 您是集群所有者。
- 您的帐户有足够的权限。
- 集群有一个现有的 Virtual Private Cloud (VPC)。
- 您为集群使用客户云订阅 (CCS) 模型。
- 代理可以访问集群的 VPC 和 VPC 的专用子网。代理还必须从 VPC 中用于集群以及 VPC 的专用子网访问。
您已在 VPC 端点中添加了以下端点:
-
ec2.<aws_region>.amazonaws.com -
elasticloadbalancing.<aws_region>.amazonaws.com s3.<aws_region>.amazonaws.com需要这些端点才能完成节点到 AWS EC2 API 的请求。由于代理在容器级别而不是在节点级别工作,因此您必须通过 AWS 专用网络将这些请求路由到 AWS EC2 API。在代理服务器中的允许列表中添加 EC2 API 的公共 IP 地址是不够的。
重要在使用集群范围代理时,您必须将
s3.<aws_region>.amazonaws.com端点配置为类型Gateway。
-
3.1.2. 网络要求 复制链接链接已复制到粘贴板!
如果您的代理重新加密出口流量,则必须为 OpenShift 所需的多个域和端口组合创建排除。
您的代理必须排除以下 OpenShift URL 的重新加密:
| 地址 | 协议/端口 | 功能 |
|---|---|---|
|
| https/443 | 必需。用于管理的 OpenShift 特定遥测。 |
|
| https/443 |
https://console.redhat.com/openshift 站点使用 |
3.2. 其他信任捆绑包的职责 复制链接链接已复制到粘贴板!
如果您提供额外的信任捆绑包,您需要进行以下要求:
- 确保其他信任捆绑包的内容有效
- 确保证书(包括中间证书)包含在额外的信任捆绑包中,且未过期
- 跟踪到期,并为附加信任捆绑包中包含的证书执行必要的续订
- 使用更新的额外信任捆绑包更新集群配置
3.3. 在安装过程中配置代理 复制链接链接已复制到粘贴板!
当您将带有客户云订阅 (CCS) 集群的 OpenShift Dedicated 安装到现有的 Virtual Private Cloud (VPC) 时,您可以配置 HTTP 或 HTTPS 代理。您可以使用 Red Hat OpenShift Cluster Manager 在安装过程中配置代理。
3.3.1. 使用 OpenShift Cluster Manager 在安装过程中配置代理 复制链接链接已复制到粘贴板!
如果要将 OpenShift Dedicated 集群安装到现有的 Virtual Private Cloud (VPC) 中,您可以使用 Red Hat OpenShift Cluster Manager 在安装过程中启用集群范围的 HTTP 或 HTTPS 代理。您只能为使用客户云订阅 (CCS) 模型的集群启用代理。
在安装前,您必须验证可以从 VPC 访问代理,该代理是否可从安装到的 VPC 中。该代理还必须从 VPC 的专用子网访问。
有关使用 OpenShift Cluster Manager 在安装过程中配置集群范围代理的详细步骤,请参阅在 AWS 上创建集群 或 在 Google Cloud 上创建集群。
3.4. 安装后配置代理 复制链接链接已复制到粘贴板!
当您将带有客户云订阅 (CCS) 集群的 OpenShift Dedicated 安装到现有的 Virtual Private Cloud (VPC) 时,您可以配置 HTTP 或 HTTPS 代理。您可以使用 Red Hat OpenShift Cluster Manager 在安装后配置代理。
3.5. 使用 OpenShift Cluster Manager 在安装后配置代理 复制链接链接已复制到粘贴板!
您可以使用 Red Hat OpenShift Cluster Manager 将集群范围的代理配置添加到 Virtual Private Cloud (VPC)的现有 OpenShift Dedicated 集群中。您只能为使用客户云订阅 (CCS) 模型的集群启用代理。
您还可以使用 OpenShift Cluster Manager 更新现有的集群范围代理配置。例如,如果代理的任何证书颁发机构过期,您可能需要更新代理的网络地址,或者替换额外的信任捆绑包。
集群将代理配置应用到 control plane 和计算节点。在应用配置时,每个集群节点暂时处于不可调度状态,并排空其工作负载。每个节点都会作为进程的一部分重启。
先决条件
- 您有一个使用客户云订阅(CCS)模型的 OpenShift Dedicated 集群。
- 您的集群部署在 VPC 中。
流程
- 进入到 OpenShift Cluster Manager 并选择您的集群。
- 在 Networking 页面上的 Virtual Private Cloud (VPC) 部分下,点 Edit cluster-wide proxy。
在 Edit cluster-wide proxy 页面中,提供代理配置详情:
至少在以下字段之一中输入值:
- 指定有效的 HTTP 代理 URL。
- 指定有效的 HTTPS 代理 URL。
在 Additional trust bundle 字段中,提供 PEM 编码 X.509 证书捆绑包。
如果您要替换现有的信任捆绑包文件,请选择 replace file 来查看字段。捆绑包添加到集群节点的可信证书存储中。如果使用 TLS-inspecting 代理,则需要额外的信任捆绑包文件,除非代理的身份证书由 Red Hat Enterprise Linux CoreOS (RHCOS)信任捆绑包的颁发机构签名。无论代理是透明的,还是需要使用
http-proxy和https-proxy参数显式配置,这个要求都适用。
- 单击 Confirm。
验证
- 在 Networking 页面上的 Virtual Private Cloud (VPC) 部分下,验证集群的代理配置是否如预期。
第 4 章 为项目启用多播 复制链接链接已复制到粘贴板!
4.1. 关于多播 复制链接链接已复制到粘贴板!
通过使用 IP 多播,数据可同时广播到许多 IP 地址。
- 目前,多播最适用于低带宽协调或服务发现。它不是一个高带宽解决方案。
-
默认情况下,网络策略会影响命名空间中的所有连接。但是,多播不受网络策略的影响。如果在与网络策略相同的命名空间中启用了多播,则始终允许多播,即使有一个
deny-all网络策略。在启用网络策略前,集群管理员应考虑对多播的影响。
默认情况下,OpenShift Dedicated pod 间的多播流量被禁用。如果使用 OVN-Kubernetes 网络插件,可以根据每个项目启用多播。
4.2. 启用 pod 间多播 复制链接链接已复制到粘贴板!
您可以为项目启用 pod 间多播。
先决条件
-
安装 OpenShift CLI (
oc) 。 -
您必须使用具有
cluster-admin或dedicated-admin角色的用户登录集群。
流程
运行以下命令,为项目启用多播。使用您要启用多播的项目的名称替换
<namespace>。oc annotate namespace <namespace> \ k8s.ovn.org/multicast-enabled=true$ oc annotate namespace <namespace> \ k8s.ovn.org/multicast-enabled=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来添加注解:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要验证项目是否启用了多播,请完成以下步骤:
将您的当前项目更改为启用多播的项目。使用项目名替换
<project>。oc project <project>
$ oc project <project>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 pod 以作为多播接收器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 pod 以作为多播发送器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在新的终端窗口或选项卡中,启动多播监听程序。
获得 Pod 的 IP 地址:
POD_IP=$(oc get pods mlistener -o jsonpath='{.status.podIP}')$ POD_IP=$(oc get pods mlistener -o jsonpath='{.status.podIP}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令启动多播监听程序:
oc exec mlistener -i -t -- \ socat UDP4-RECVFROM:30102,ip-add-membership=224.1.0.1:$POD_IP,fork EXEC:hostname$ oc exec mlistener -i -t -- \ socat UDP4-RECVFROM:30102,ip-add-membership=224.1.0.1:$POD_IP,fork EXEC:hostnameCopy to Clipboard Copied! Toggle word wrap Toggle overflow
启动多播传输。
获取 pod 网络 IP 地址范围:
CIDR=$(oc get Network.config.openshift.io cluster \ -o jsonpath='{.status.clusterNetwork[0].cidr}')$ CIDR=$(oc get Network.config.openshift.io cluster \ -o jsonpath='{.status.clusterNetwork[0].cidr}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要发送多播信息,请输入以下命令:
oc exec msender -i -t -- \ /bin/bash -c "echo | socat STDIO UDP4-DATAGRAM:224.1.0.1:30102,range=$CIDR,ip-multicast-ttl=64"$ oc exec msender -i -t -- \ /bin/bash -c "echo | socat STDIO UDP4-DATAGRAM:224.1.0.1:30102,range=$CIDR,ip-multicast-ttl=64"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果多播正在工作,则上一个命令会返回以下输出:
mlistener
mlistenerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Legal Notice
复制链接链接已复制到粘贴板!
Copyright © 2025 Red Hat
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.