OVN-Kubernetes 网络插件
OpenShift Container Platform 中 OVN-Kubernetes 网络插件的深度配置和故障排除
摘要
第 1 章 关于 OVN-Kubernetes 网络插件 复制链接链接已复制到粘贴板!
OpenShift Container Platform 集群在 pod 和服务网络中使用虚拟网络。
Red Hat OpenShift Networking 的一部分,OVN-Kubernetes 网络插件是 OpenShift Container Platform 的默认网络供应商。OVN-Kubernetes 基于 Open Virtual Network(OVN),它提供了一个基于 overlay 的网络实现。使用 OVN-Kubernetes 插件的集群还在每个节点上运行 Open vSwitch (OVS)。OVN 在每个节点上配置 OVS 来实现声明的网络配置。
OVN-Kubernetes 是 OpenShift Container Platform 和单节点 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® 和 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 Container Platform 的更新版本会失败,因为 Network Operator 处于Degraded状态。红帽不支持为集群禁用 IPv6 adddresses,因此不要将ipv6.disable参数设置为1。
1.3. 会话关联性 复制链接链接已复制到粘贴板!
会话关联性是适用于 Kubernetes Service 对象的功能。如果要确保每次连接到 <service_VIP>:<Port> 时,您可以使用 会话关联性,流量始终被加载到同一后端。如需更多信息,包括如何根据客户端的 IP 地址设置会话关联性,请参阅会话关联性。
1.3.1. 会话关联性的粘性超时 复制链接链接已复制到粘贴板!
OpenShift Container Platform 的 OVN-Kubernetes 网络插件根据最后一个数据包计算来自客户端的会话的粘性超时。例如,如果您运行 curl 命令 10 次,则粘性会话计时器从第十个数据包开始,而不是第一个数据包。因此,如果客户端不断联系该服务,则会话永远不会超时。当服务没有收到 timeoutSeconds 参数所设定的时间的数据包时,超时开始。
第 2 章 OVN-Kubernetes 架构 复制链接链接已复制到粘贴板!
2.1. OVN-Kubernetes 架构简介 复制链接链接已复制到粘贴板!
下图显示了 OVN-Kubernetes 架构。
图 2.1. OVK-Kubernetes 架构
主要组件是:
- Cloud Management System (CMS) - OVN 的特定平台客户端,为 OVN 集成提供 CMS 特定的插件。该插件将云管理系统的逻辑网络配置概念转换为 OVN 理解的 CMS 配置数据库中。
-
OVN 北向数据库(
nbdb)容器 - 存储由 CMS 插件传递的逻辑网络配置。 -
OVN 南向数据库(
sbdb)容器 - 存储每个节点上的 Open vSwitch (OVS)系统的物理和逻辑网络配置状态,包括绑定它们的表。 -
OVN 北向守护进程 (
ovn-northd) - 这是nbdb容器和sbdb容器之间的中介客户端。它以传统网络概念的形式将逻辑网络配置(从nbdb容器)转换为sbdb容器中的逻辑数据路径流。ovn-northd守护进程的容器名称为northd,它在ovnkube-nodepod 中运行。 -
ovn-controller - 这是与 OVS 和 hypervisor 交互的 OVN 代理,适用于
sbdb容器所需的任何信息或更新。ovn-controller从sbdb容器读取逻辑流,将它们转换为OpenFlow流,并将它们发送到节点的 OVS 守护进程。容器名称为ovn-controller,它在ovnkube-nodepod 中运行。
OVN 北向数据库、北向数据库和南向数据库在集群中的每个节点上运行,大部分包含对该节点本地的和进程信息。
OVN 北向数据库具有通过云管理系统(CMS)传递到它的逻辑网络配置。OVN 北向数据库包含网络的当前状态,以逻辑端口、逻辑交换机、逻辑路由器等形式显示。ovn-northd (northd 容器) 连接到 OVN 北向数据库和 OVN 南向数据库。它以传统网络概念的形式将逻辑网络配置转换为 OVN 北向数据库中的逻辑数据路径流。
OVN 南向数据库具有网络的物理和逻辑表示,并将它们连接在一起。它包含节点的机箱信息,以及其他结构,如连接到集群中其他节点所需的远程传输交换机端口。OVN 南向数据库还包含所有逻辑流。逻辑流与每个节点上运行的 ovn-controller 进程共享,ovn-controller 将它们转换为 OpenFlow 规则到程序 Open vSwitch(OVS)。
Kubernetes control plane 节点在单独的节点上包含两个 ovnkube-control-plane pod,它为集群中的每个节点执行中央 IP 地址管理 (IPAM) 分配。在任何给定时间,只有一个 ovnkube-control-plane pod 是领导。
2.2. 列出 OVN-Kubernetes 项目中的所有资源 复制链接链接已复制到粘贴板!
查找在 OVN-Kubernetes 项目中运行的资源和容器对于帮助您了解 OVN-Kubernetes 网络实施非常重要。
先决条件
-
使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。
流程
运行以下命令,以获取 OVN-Kubernetes 项目中的所有资源、端点和
ConfigMap:oc get all,ep,cm -n openshift-ovn-kubernetes
$ oc get all,ep,cm -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 集群中的每个节点都有一个
ovnkube-nodepod。ovnkube-config配置映射具有 OpenShift Container Platform OVN-Kubernetes 配置。运行以下命令,列出
ovnkube-nodepod 中的所有容器:oc get pods ovnkube-node-bcvts -o jsonpath='{.spec.containers[*].name}' -n openshift-ovn-kubernetes$ oc get pods ovnkube-node-bcvts -o jsonpath='{.spec.containers[*].name}' -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
ovn-controller ovn-acl-logging kube-rbac-proxy-node kube-rbac-proxy-ovn-metrics northd nbdb sbdb ovnkube-controller
ovn-controller ovn-acl-logging kube-rbac-proxy-node kube-rbac-proxy-ovn-metrics northd nbdb sbdb ovnkube-controllerCopy to Clipboard Copied! Toggle word wrap Toggle overflow ovnkube-nodepod 由几个容器组成。它负责托管北向数据库(nbdb容器)、南向数据库(sbdb容器)、北守护进程 (northd容器)、ovn-controller和ovnkube-controller容器。ovnkube-controller容器会监视 API 对象,如 pod、egress IP、命名空间、服务、端点、出口防火墙和网络策略。它还负责为该节点从可用子网池中分配 pod IP。运行以下命令,列出
ovnkube-control-planepod 中的所有容器:oc get pods ovnkube-control-plane-65c6f55656-6d55h -o jsonpath='{.spec.containers[*].name}' -n openshift-ovn-kubernetes$ oc get pods ovnkube-control-plane-65c6f55656-6d55h -o jsonpath='{.spec.containers[*].name}' -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
kube-rbac-proxy ovnkube-cluster-manager
kube-rbac-proxy ovnkube-cluster-managerCopy to Clipboard Copied! Toggle word wrap Toggle overflow ovnkube-control-planepod 有一个容器(ovnkube-cluster-manager),它驻留在每个 OpenShift Container Platform 节点上。ovnkube-cluster-manager容器分配 pod 子网,将子网 IP 传输交换机到集群中的每个节点。kube-rbac-proxy容器监控ovnkube-cluster-manager容器的指标。
2.3. 列出 OVN-Kubernetes 北向数据库内容 复制链接链接已复制到粘贴板!
每个节点都由该节点上 ovnkube-node pod 中运行的 ovnkube-controller 容器控制。若要了解 OVN 逻辑网络实体,您需要检查作为容器在该节点上的 ovnkube-node pod 中运行的北向数据库,以查看您要查看的节点中的对象。
先决条件
-
使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。
要在集群中运行 ovn nbctl 或 sbctl 命令,您必须在相关节点上的 nbdb 或 sbdb 容器中打开远程 shell
运行以下命令列出 pod:
oc get po -n openshift-ovn-kubernetes
$ oc get po -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要使用节点信息列出 pod,请运行以下命令:
oc get pods -n openshift-ovn-kubernetes -owide
$ oc get pods -n openshift-ovn-kubernetes -owideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,进入 pod 以查看北向数据库:
oc rsh -c nbdb -n openshift-ovn-kubernetes ovnkube-node-55xs2
$ oc rsh -c nbdb -n openshift-ovn-kubernetes ovnkube-node-55xs2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令以显示北向数据库中的所有对象:
ovn-nbctl show
$ ovn-nbctl showCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此处列出输出太长。列表中包含 NAT 规则、逻辑交换机、负载均衡器等。
您可以使用以下可选命令缩小并专注于特定组件:
运行以下命令以显示逻辑路由器列表:
oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c northd -- ovn-nbctl lr-list
$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c northd -- ovn-nbctl lr-listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
45339f4f-7d0b-41d0-b5f9-9fca9ce40ce6 (GR_ci-ln-t487nnb-72292-mdcnq-master-2) 96a0a0f0-e7ed-4fec-8393-3195563de1b8 (ovn_cluster_router)
45339f4f-7d0b-41d0-b5f9-9fca9ce40ce6 (GR_ci-ln-t487nnb-72292-mdcnq-master-2) 96a0a0f0-e7ed-4fec-8393-3195563de1b8 (ovn_cluster_router)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在这个输出中,您可以看到每个节点中存在路由器,再加上
ovn_cluster_router。运行以下命令以显示逻辑交换机列表:
oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb -- ovn-nbctl ls-list
$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb -- ovn-nbctl ls-listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
bdd7dc3d-d848-4a74-b293-cc15128ea614 (ci-ln-t487nnb-72292-mdcnq-master-2) b349292d-ee03-4914-935f-1940b6cb91e5 (ext_ci-ln-t487nnb-72292-mdcnq-master-2) 0aac0754-ea32-4e33-b086-35eeabf0a140 (join) 992509d7-2c3f-4432-88db-c179e43592e5 (transit_switch)
bdd7dc3d-d848-4a74-b293-cc15128ea614 (ci-ln-t487nnb-72292-mdcnq-master-2) b349292d-ee03-4914-935f-1940b6cb91e5 (ext_ci-ln-t487nnb-72292-mdcnq-master-2) 0aac0754-ea32-4e33-b086-35eeabf0a140 (join) 992509d7-2c3f-4432-88db-c179e43592e5 (transit_switch)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在这个输出中,您可以看到每个节点的 ext 交换机以及节点名称本身和 join 开关。
运行以下命令以显示负载均衡器列表:
oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb -- ovn-nbctl lb-list
$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb -- ovn-nbctl lb-listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在这个截断的输出中,您可以看到有许多 OVN-Kubernetes 负载均衡器。OVN-Kubernetes 中的负载均衡器是服务的表示。
运行以下命令,以显示可用于命令
ovn-nbctl的选项:oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb ovn-nbctl --help
$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb ovn-nbctl --helpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4. ovn-nbctl 的命令行参数检查北向数据库内容 复制链接链接已复制到粘贴板!
下表描述了可与 ovn-nbctl 一起使用的命令行参数,以检查北向数据库的内容。
在您要查看内容的 pod 中打开一个远程 shell,然后运行 ovn-nbctl 命令。
| 参数 | 描述 |
|---|---|
|
| 从特定节点看到的北向数据库内容概述。 |
|
| 显示与指定交换机或路由器关联的详细信息。 |
|
| 显示逻辑路由器。 |
|
|
使用 |
|
| 显示指定路由器的网络地址转换详情。 |
|
| 显示逻辑交换机 |
|
|
使用 |
|
| 获取逻辑端口的类型。 |
|
| 显示负载平衡器。 |
2.5. 列出 OVN-Kubernetes 南向数据库内容 复制链接链接已复制到粘贴板!
每个节点都由该节点上 ovnkube-node pod 中运行的 ovnkube-controller 容器控制。若要了解 OVN 逻辑网络实体,您需要检查作为容器在该节点上的 ovnkube-node pod 中运行的北向数据库,以查看您要查看的节点中的对象。
先决条件
-
使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。
要在集群中运行 ovn nbctl 或 sbctl 命令,您必须在相关节点上的 nbdb 或 sbdb 容器中打开远程 shell
运行以下命令列出 pod:
oc get po -n openshift-ovn-kubernetes
$ oc get po -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要使用节点信息列出 pod,请运行以下命令:
oc get pods -n openshift-ovn-kubernetes -owide
$ oc get pods -n openshift-ovn-kubernetes -owideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 进入 pod 以查看南向数据库:
oc rsh -c sbdb -n openshift-ovn-kubernetes ovnkube-node-55xs2
$ oc rsh -c sbdb -n openshift-ovn-kubernetes ovnkube-node-55xs2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令以显示南向数据库中的所有对象:
ovn-sbctl show
$ ovn-sbctl showCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此详细输出显示了附加到机箱的机箱和端口,本例中为所有路由器端口以及像主机网络一样运行的任何内容。任何 pod 使用源网络地址转换(SNAT)与更广泛的网络通信。其 IP 地址转换为运行 Pod 的节点的 IP 地址,然后发送到网络。
除了机箱信息外,南向数据库还具有所有逻辑流,这些逻辑流随后发送到每个节点上运行的
ovn-controller。ovn-controller将逻辑流转换为开放流规则,最终程序OpenvSwitch以便您的 pod 可以遵循开放流规则,并使其从网络移出。运行以下命令以
ovn-sbctl命令显示可用的选项:oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c sbdb ovn-sbctl --help
$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c sbdb ovn-sbctl --helpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6. ovn-sbctl 的命令行参数,以检查南向数据库内容 复制链接链接已复制到粘贴板!
下表描述了可用于 ovn-sbctl 的命令行参数,以检查南向数据库的内容。
在您要查看内容的 pod 中打开一个远程 shell,然后运行 ovn-sbctl 命令。
| 参数 | 描述 |
|---|---|
|
| 从特定节点看到的南向数据库内容概述。 |
|
| 列出特定端口的南向数据库的内容。 |
|
| 列出逻辑流。 |
2.7. OVN-Kubernetes 逻辑架构 复制链接链接已复制到粘贴板!
OVN 是网络虚拟化解决方案。它创建逻辑交换机和路由器。这些交换机和路由器是互连的,以创建任何网络拓扑。当您运行 ovnkube-trace 时,日志级别设置为 2 或 5 时,OVN-Kubernetes 逻辑组件会被公开。下图显示了如何在 OpenShift Container Platform 中连接路由器和交换机。
图 2.2. OVN-Kubernetes 路由器和交换机组件
涉及数据包处理的关键组件有:
- 网关路由器
-
网关路由器有时称为 L3 网关路由器,通常在分布式路由器和物理网络之间使用。网关路由器(包括其逻辑补丁端口)绑定到物理位置(而非分布式)或机箱。此路由器上的跳接端口称为 ovn-southbound 数据库(
ovn-sbdb)中的 l3gateway 端口。 - 分布式逻辑路由器
- 分布式逻辑路由器和其后面的逻辑交换机(虚拟机和容器附加)有效驻留在每个虚拟机监控程序上。
- 加入本地交换机
- 加入本地交换机用于连接分布式路由器和网关路由器。它可减少分布式路由器中所需的 IP 地址数量。
- 使用跳接端口的逻辑交换机
- 带有补丁端口的逻辑交换机用于虚拟化网络堆栈。它们通过隧道连接远程逻辑端口。
- 使用 localnet 端口的逻辑交换机
- 使用 localnet 端口的逻辑交换机用于将 OVN 连接到物理网络。它们通过将数据包桥接到使用 localnet 端口直接连接的物理 L2 片段来连接远程逻辑端口。
- 补丁端口
- 跳接端口代表逻辑交换机和逻辑路由器之间以及对等逻辑路由器之间的连接。单个连接在每个此类连接点上都有一对跳接端口。
- l3gateway 端口
-
l3gateway 端口是
ovn-sbdb中用于网关路由器中使用的逻辑补丁端口的端口绑定条目。它们称为 l3gateway 端口,而不是跳接端口,而只是这些端口绑定到机箱,就像网关路由器本身一样。 - localnet 端口
-
桥接逻辑交换机上存在 localnet 端口,允许从每个
ovn-controller实例连接到本地可访问的网络。这有助于从逻辑交换机对物理网络的直接连接建模。逻辑交换机只能附加一个 localnet 端口。
2.7.1. 在本地主机上安装 network-tools 复制链接链接已复制到粘贴板!
在本地主机上安装 network-tools,以提供一组工具来调试 OpenShift Container Platform 集群网络问题。
流程
使用以下命令将
network-tools存储库克隆到工作站:git clone git@github.com:openshift/network-tools.git
$ git clone git@github.com:openshift/network-tools.gitCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更改到您刚才克隆的存储库的目录:
cd network-tools
$ cd network-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有可用的命令:
./debug-scripts/network-tools -h
$ ./debug-scripts/network-tools -hCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7.2. 运行 network-tools 复制链接链接已复制到粘贴板!
通过运行 network-tools 来获取逻辑交换机和路由器的信息。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin权限的用户身份登录集群。 -
您已在本地主机上安装了
network-tools。
流程
运行以下命令列出路由器:
./debug-scripts/network-tools ovn-db-run-command ovn-nbctl lr-list
$ ./debug-scripts/network-tools ovn-db-run-command ovn-nbctl lr-listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
944a7b53-7948-4ad2-a494-82b55eeccf87 (GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99) 84bd4a4c-4b0b-4a47-b0cf-a2c32709fc53 (ovn_cluster_router)
944a7b53-7948-4ad2-a494-82b55eeccf87 (GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99) 84bd4a4c-4b0b-4a47-b0cf-a2c32709fc53 (ovn_cluster_router)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令列出 localnet 端口:
./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=localnet
$ ./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=localnetCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令列出
l3gateway端口:./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=l3gateway
$ ./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=l3gatewayCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令列出跳接端口:
./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=patch
$ ./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=patchCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 3 章 OVN-Kubernetes 故障排除 复制链接链接已复制到粘贴板!
OVN-Kubernetes 具有许多内置健康检查和日志来源。按照这些部分中的说明检查集群。如果需要一个支持问题单,请参阅 支持指南来通过 must-gather 收集其他信息。仅在支持团队要求这样做时,才使用 -- gather_network_logs。
3.1. 使用就绪度探测监控 OVN-Kubernetes 健康状况 复制链接链接已复制到粘贴板!
ovnkube-control-plane 和 ovnkube-node pod 配置有就绪度探测的容器。
先决条件
-
访问 OpenShift CLI(
oc)。 -
您可以使用
cluster-admin权限访问集群。 -
您已安装了
jq。
流程
运行以下命令,查看
ovnkube-node就绪度探测的详情:oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node \ -o json | jq '.items[0].spec.containers[] | .name,.readinessProbe'
$ oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node \ -o json | jq '.items[0].spec.containers[] | .name,.readinessProbe'Copy to Clipboard Copied! Toggle word wrap Toggle overflow ovnkube-nodepod 中的北向和南向数据库容器的就绪度探测会检查数据库和ovnkube-controller容器的健康状态。ovnkube-nodepod 中的ovnkube-controller容器有一个就绪度探测来验证 OVN-Kubernetes CNI 配置文件是否存在,这代表 pod 没有运行,或者没有准备好接受配置 pod 的请求。使用以下命令,显示命名空间的所有事件,包括探测失败:
oc get events -n openshift-ovn-kubernetes
$ oc get events -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 仅显示特定 pod 的事件:
oc describe pod ovnkube-node-9lqfk -n openshift-ovn-kubernetes
$ oc describe pod ovnkube-node-9lqfk -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示集群网络 Operator 的消息和状态:
oc get co/network -o json | jq '.status.conditions[]'
$ oc get co/network -o json | jq '.status.conditions[]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下脚本,显示
ovnkube-nodepod 中每个容器的就绪状态:for p in $(oc get pods --selector app=ovnkube-node -n openshift-ovn-kubernetes \ -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); do echo === $p ===; \ oc get pods -n openshift-ovn-kubernetes $p -o json | jq '.status.containerStatuses[] | .name, .ready'; \ done$ for p in $(oc get pods --selector app=ovnkube-node -n openshift-ovn-kubernetes \ -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); do echo === $p ===; \ oc get pods -n openshift-ovn-kubernetes $p -o json | jq '.status.containerStatuses[] | .name, .ready'; \ doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意预期的是所有容器状态都报告为
true。就绪度探测失败,将状态设置为false。
3.2. 在控制台中查看 OVN-Kubernetes 警报 复制链接链接已复制到粘贴板!
Alerting UI 提供有关警报及其相关警报规则和静默的详细信息。
先决条件
- 对于您要查看指标的项目,您可以作为开发者或具有查看权限的用户访问集群。
流程 (UI)
- 在 Administrator 视角中,选择 Observe → Alerting。在此视角中,Alerting UI 有三个主要页面,即 Alerts、Silences 和 Alerting Rules 页面。
- 选择 Observe → Alerting → Alerting Rules 来查看 OVN-Kubernetes 警报的规则。
3.3. 在 CLI 中查看 OVN-Kubernetes 警报 复制链接链接已复制到粘贴板!
您可以从命令行获取有关警报及其监管警报规则和静默的信息。
先决条件
-
使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。 -
您已安装了
jq。
流程
运行以下命令,查看活动或触发警报:
运行以下命令设置警报管理器路由环境变量:
ALERT_MANAGER=$(oc get route alertmanager-main -n openshift-monitoring \ -o jsonpath='{@.spec.host}')$ ALERT_MANAGER=$(oc get route alertmanager-main -n openshift-monitoring \ -o jsonpath='{@.spec.host}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将
$ALERT_MANAGER替换为Alertmanager实例的 URL,向警报管理器路由 API 发出curl请求:curl -s -k -H "Authorization: Bearer $(oc create token prometheus-k8s -n openshift-monitoring)" https://$ALERT_MANAGER/api/v1/alerts | jq '.data[] | "\(.labels.severity) \(.labels.alertname) \(.labels.pod) \(.labels.container) \(.labels.endpoint) \(.labels.instance)"'
$ curl -s -k -H "Authorization: Bearer $(oc create token prometheus-k8s -n openshift-monitoring)" https://$ALERT_MANAGER/api/v1/alerts | jq '.data[] | "\(.labels.severity) \(.labels.alertname) \(.labels.pod) \(.labels.container) \(.labels.endpoint) \(.labels.instance)"'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令来查看警报规则:
oc -n openshift-monitoring exec -c prometheus prometheus-k8s-0 -- curl -s 'http://localhost:9090/api/v1/rules' | jq '.data.groups[].rules[] | select(((.name|contains("ovn")) or (.name|contains("OVN")) or (.name|contains("Ovn")) or (.name|contains("North")) or (.name|contains("South"))) and .type=="alerting")'$ oc -n openshift-monitoring exec -c prometheus prometheus-k8s-0 -- curl -s 'http://localhost:9090/api/v1/rules' | jq '.data.groups[].rules[] | select(((.name|contains("ovn")) or (.name|contains("OVN")) or (.name|contains("Ovn")) or (.name|contains("North")) or (.name|contains("South"))) and .type=="alerting")'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4. 使用 CLI 查看 OVN-Kubernetes 日志 复制链接链接已复制到粘贴板!
您可以使用 OpenShift CLI (oc)查看 ovnkube-master 和 ovnkube-node pod 中每个 pod 的日志。
先决条件
-
使用具有
cluster-admin角色的用户访问集群。 -
访问 OpenShift CLI(
oc)。 -
您已安装了
jq。
流程
查看特定 pod 的日志:
oc logs -f <pod_name> -c <container_name> -n <namespace>
$ oc logs -f <pod_name> -c <container_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
-f- 可选:指定输出是否遵循要写到日志中的内容。
<pod_name>- 指定 pod 的名称。
<container_name>- 可选:指定容器的名称。当 pod 具有多个容器时,您必须指定容器名称。
<namespace>- 指定 pod 运行的命名空间。
例如:
oc logs ovnkube-node-5dx44 -n openshift-ovn-kubernetes
$ oc logs ovnkube-node-5dx44 -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc logs -f ovnkube-node-5dx44 -c ovnkube-controller -n openshift-ovn-kubernetes
$ oc logs -f ovnkube-node-5dx44 -c ovnkube-controller -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出的日志文件内容。
检查
ovnkube-nodepod 中所有容器的最新条目:for p in $(oc get pods --selector app=ovnkube-node -n openshift-ovn-kubernetes \ -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); \ do echo === $p ===; for container in $(oc get pods -n openshift-ovn-kubernetes $p \ -o json | jq -r '.status.containerStatuses[] | .name');do echo ---$container---; \ oc logs -c $container $p -n openshift-ovn-kubernetes --tail=5; done; done$ for p in $(oc get pods --selector app=ovnkube-node -n openshift-ovn-kubernetes \ -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); \ do echo === $p ===; for container in $(oc get pods -n openshift-ovn-kubernetes $p \ -o json | jq -r '.status.containerStatuses[] | .name');do echo ---$container---; \ oc logs -c $container $p -n openshift-ovn-kubernetes --tail=5; done; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令,查看
ovnkube-nodepod 中每个容器的最后 5 行:oc logs -l app=ovnkube-node -n openshift-ovn-kubernetes --all-containers --tail 5
$ oc logs -l app=ovnkube-node -n openshift-ovn-kubernetes --all-containers --tail 5Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5. 使用 Web 控制台查看 OVN-Kubernetes 日志 复制链接链接已复制到粘贴板!
您可以在 web 控制台中查看 ovnkube-master 和 ovnkube-node pod 中每个 pod 的日志。
先决条件
-
访问 OpenShift CLI(
oc)。
流程
- 在 OpenShift Container Platform 控制台中,导航到 Workloads → Pods,或通过您要调查的资源导航到 pod。
-
从下拉菜单中选择
openshift-ovn-kubernetes项目。 - 点您要调查的 pod 的名称。
-
点 Logs。默认情况下,
ovnkube-master显示与northd容器关联的日志。 - 使用向下下拉菜单选择每个容器的日志。
3.5.1. 更改 OVN-Kubernetes 日志级别 复制链接链接已复制到粘贴板!
OVN-Kubernetes 的默认日志级别为 4。要调试 OVN-Kubernetes,请将日志级别设置为 5。按照以下步骤增加 OVN-Kubernetes 的日志级别,以帮助您调试问题。
先决条件
-
您可以使用
cluster-admin权限访问集群。 - 访问 OpenShift Container Platform web 控制台。
流程
运行以下命令,以获取 OVN-Kubernetes 项目中所有 pod 的详细信息:
oc get po -o wide -n openshift-ovn-kubernetes
$ oc get po -o wide -n openshift-ovn-kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建类似以下示例的
ConfigMap文件,并使用文件名,如env-overrides.yaml:ConfigMap文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令应用
ConfigMap文件:oc apply -n openshift-ovn-kubernetes -f env-overrides.yaml
$ oc apply -n openshift-ovn-kubernetes -f env-overrides.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
configmap/env-overrides.yaml created
configmap/env-overrides.yaml createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令重启
ovnkubepod 以应用新的日志级别:oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-0 -l app=ovnkube-node
$ oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-0 -l app=ovnkube-nodeCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-2 -l app=ovnkube-node
$ oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-2 -l app=ovnkube-nodeCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete pod -n openshift-ovn-kubernetes -l app=ovnkube-node
$ oc delete pod -n openshift-ovn-kubernetes -l app=ovnkube-nodeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证 'ConfigMap'file 是否已应用到特定 pod 的所有节点,请运行以下命令:
oc logs -n openshift-ovn-kubernetes --all-containers --prefix ovnkube-node-<xxxx> | grep -E -m 10 '(Logging config:|vconsole|DBG)'
$ oc logs -n openshift-ovn-kubernetes --all-containers --prefix ovnkube-node-<xxxx> | grep -E -m 10 '(Logging config:|vconsole|DBG)'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<XXXX>指定上一步中 pod 的随机字符序列。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
可选:运行以下命令来检查
ConfigMap文件是否已应用:for f in $(oc -n openshift-ovn-kubernetes get po -l 'app=ovnkube-node' --no-headers -o custom-columns=N:.metadata.name) ; do echo "---- $f ----" ; oc -n openshift-ovn-kubernetes exec -c ovnkube-controller $f -- pgrep -a -f init-ovnkube-controller | grep -P -o '^.*loglevel\s+\d' ; done
for f in $(oc -n openshift-ovn-kubernetes get po -l 'app=ovnkube-node' --no-headers -o custom-columns=N:.metadata.name) ; do echo "---- $f ----" ; oc -n openshift-ovn-kubernetes exec -c ovnkube-controller $f -- pgrep -a -f init-ovnkube-controller | grep -P -o '^.*loglevel\s+\d' ; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6. 检查 OVN-Kubernetes pod 网络连接 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 4.10 及更新的版本中,连接检查控制器会在集群中编配连接验证检查。这包括 Kubernetes API、OpenShift API 和单个节点。连接测试的结果存储在 openshift-network-diagnostics 命名空间中的 PodNetworkConnectivity 对象中。连接测试会每分钟以并行方式执行。
先决条件
-
访问 OpenShift CLI(
oc)。 -
使用具有
cluster-admin角色的用户访问集群。 -
您已安装了
jq。
流程
要列出当前的
PodNetworkConnectivityCheck对象,请输入以下命令:oc get podnetworkconnectivitychecks -n openshift-network-diagnostics
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnosticsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令查看每个连接对象的最新成功:
oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.successes[0]'
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.successes[0]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令查看每个连接对象的最新故障:
oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.failures[0]'
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.failures[0]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令查看每个连接对象的最新中断:
oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.outages[0]'
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.outages[0]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接检查控制器也会将来自这些检查的指标记录到 Prometheus 中。
运行以下命令来查看所有指标:
oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'$ oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看源 pod 和 openshift api 服务之间的延迟,持续 5 分钟:
oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'$ oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 4 章 使用 ovnkube-trace 追踪 Openflow 复制链接链接已复制到粘贴板!
OVN 和 OVS 流量流可以在一个名为 ovnkube-trace 的单个实用程序中模拟。ovnkube-trace 工具运行 ovn-trace、ovs-appctl ofproto/trace 和 ovn-detrace,并在单个输出中关联这些信息。
您可以从专用容器执行 ovnkube-trace 二进制文件。对于 OpenShift Container Platform 4.7 后的版本,您还可以将该二进制文件复制到本地主机中,并从该主机执行它。
4.1. 在本地主机上安装 ovnkube-trace 复制链接链接已复制到粘贴板!
ovnkube-trace 工具跟踪在 OVN-Kubernetes 驱动的 OpenShift Container Platform 集群中点之间的任意 UDP 或 TCP 流量的数据包模拟。将 ovnkube-trace 二进制文件复制到本地主机,使其可以针对集群运行。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
使用以下命令创建 pod 变量:
POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-control-plane -o name | head -1 | awk -F '/' '{print $NF}')$ POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-control-plane -o name | head -1 | awk -F '/' '{print $NF}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本地主机上运行以下命令,从
ovnkube-control-planepod 复制二进制文件:oc cp -n openshift-ovn-kubernetes $POD:/usr/bin/ovnkube-trace -c ovnkube-cluster-manager ovnkube-trace
$ oc cp -n openshift-ovn-kubernetes $POD:/usr/bin/ovnkube-trace -c ovnkube-cluster-manager ovnkube-traceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果您使用 Red Hat Enterprise Linux (RHEL) 8 运行
ovnkube-trace工具,您必须将文件/usr/lib/rhel8/ovnkube-trace复制到本地主机。运行以下命令,使
ovnkube-trace可执行:chmod +x ovnkube-trace
$ chmod +x ovnkube-traceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,显示
ovnkube-trace可用的选项:./ovnkube-trace -help
$ ./ovnkube-trace -helpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 支持的命令行参数是熟悉的 Kubernetes 构造,如命名空间、Pod、服务,因此您不需要查找 MAC 地址、目标节点的 IP 地址或 ICMP 类型。
日志级别为:
- 0 (最小输出)
- 2 (显示 trace 命令结果的详细输出)
- 5 (调试输出)
4.2. 运行 ovnkube-trace 复制链接链接已复制到粘贴板!
运行 ovn-trace 以模拟 OVN 逻辑网络内的数据包转发。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 -
您已在本地主机上安装了
ovnkube-trace
示例:测试 DNS 解析是否适用于部署的 pod
本例演示了如何从部署的 pod 测试 DNS 解析到集群中运行的核心 DNS pod。
流程
输入以下命令在 default 命名空间中启动 web 服务:
oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80
$ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出在
openshift-dns命名空间中运行的 pod:oc get pods -n openshift-dns
oc get pods -n openshift-dnsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下
ovnkube-trace命令来验证 DNS 解析是否正常工作:Copy to Clipboard Copied! Toggle word wrap Toggle overflow src&dstpod 在同一节点上放置时的输出示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow src&dstpod 放置到另一个节点上时的输出示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow ouput 表示从部署的 pod 到 DNS 端口的成功,也表示它已成功返回其他方向。因此,如果我的 Web pod 想要从核心 DNS 进行 dns 解析,则 UDP 端口 53 上支持双向流量。
例如,如果无法正常工作,并且您想要获取 ovn-trace、proto/trace 和 ovn-detrace 的 ovs-appctl,以及更多故障排除类型信息,将日志级别增加到 2,然后再次运行命令,如下所示:
这个日志级别的输出太大,无法在此处列出。在故障情况下,此命令的输出显示哪个流丢弃了该流量。例如,可以在不允许该流量的集群中配置 egress 或 ingress 网络策略。
示例:使用 debug 输出来验证配置的默认拒绝
本例演示了如何使用入口默认拒绝策略阻断流量的 debug 输出来识别。
流程
创建以下 YAML,以定义
deny-by-default策略,以拒绝所有命名空间中的所有 pod 的入口流量。将 YAML 保存到deny-by-default.yaml文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令应用策略:
oc apply -f deny-by-default.yaml
$ oc apply -f deny-by-default.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
networkpolicy.networking.k8s.io/deny-by-default created
networkpolicy.networking.k8s.io/deny-by-default createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在
default命名空间中启动 web 服务:oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80
$ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
prod命名空间:oc create namespace prod
$ oc create namespace prodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来标记
prod命名空间:oc label namespace/prod purpose=production
$ oc label namespace/prod purpose=productionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在
prod命名空间中部署alpine镜像并启动 shell:oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- sh
$ oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- shCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 打开另一个终端会话。
在这个新终端会话中,运行
ovn-trace以验证在命名空间prod中运行的源 podtest-6459与在default命名空间中的目标 pod 之间的通信失败:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ovn-trace source pod to destination pod indicates failure from test-6459 to web
ovn-trace source pod to destination pod indicates failure from test-6459 to webCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将日志级别增加到 2 以公开失败的原因:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 因为默认的 deny 策略被到位,所以入口流量会被阻止
创建一个策略,允许来自特定命名空间中所有 pod 的流量,其标签为
purpose=production。将 YAML 保存到web-allow-prod.yaml文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令应用策略:
oc apply -f web-allow-prod.yaml
$ oc apply -f web-allow-prod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令运行
ovnkube-trace来验证现在允许的流量:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在在第 6 步中打开的 shell 中运行以下命令,以将 nginx 连接到 web-server:
wget -qO- --timeout=2 http://web.default
wget -qO- --timeout=2 http://web.defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 5 章 转换为 IPv4/IPv6 双栈网络 复制链接链接已复制到粘贴板!
作为集群管理员,您可以将 IPv4 单栈集群转换为支持 IPv4 和 IPv6 地址系列的双网络集群网络。转换为双栈网络后,新的和现有 pod 启用了双栈网络。
当使用需要 IPv6 的双栈网络时,您无法使用 IPv4 映射 IPv6 地址,如 ::FFFF:198.51.100.1。
5.1. 转换为双栈集群网络 复制链接链接已复制到粘贴板!
作为集群管理员,您可以将单堆栈集群网络转换为双栈集群网络。
将集群转换为使用双栈网络后,您必须为它们重新创建任何现有 pod 以接收 IPv6 地址,因为只有新 pod 会被分配 IPv6 地址。
将单堆栈集群网络转换为双栈集群网络包括创建补丁并将其应用到集群的网络和子网。您可以转换为在安装程序置备的基础架构或用户置备的基础架构上运行的集群的双栈集群网络。
更改 clusterNetwork、serviceNetwork、apiServerInternalIPs 和 ingressIP 对象的每个补丁操作都会触发重启集群。更改 MachineNetworks 对象不会导致重启集群。
安装程序置备的基础架构中,如果您需要将 API 和 Ingress 服务的 IPv6 虚拟 IP (VIP)添加到现有的双栈配置的集群中,则只需要修补基础架构,而不是集群的网络。
如果您已经将集群升级到 OpenShift Container Platform 4.16 或更高版本,且您需要将单堆栈集群网络转换为双栈集群网络,则必须从 install-config.yaml 文件中为 API 和 Ingress 服务指定现有的 IPv4 machineNetwork 网络配置。此配置可确保 IPv4 流量与默认网关在同一网络接口中。
带有为 machineNetwork 网络添加 IPv4 地址块的 YAML 配置文件示例
- op: add path: /spec/platformSpec/baremetal/machineNetworks/- value: 192.168.1.0/24 # ...
- op: add
path: /spec/platformSpec/baremetal/machineNetworks/-
value: 192.168.1.0/24
# ...
- 1
- 确保为机器操作的
machineNetwork网络指定地址块。您必须为机器网络选择 API 和 Ingress IP 地址。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 集群使用 OVN-Kubernetes 网络插件。
- 集群节点具有 IPv6 地址。
- 您已根据基础架构配置了启用了 IPv6 的路由器。
流程
要为集群和服务网络指定 IPv6 地址块,请创建一个类似以下示例的 YAML 配置补丁文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 CLI 中输入以下命令来修补集群网络配置:
oc patch network.config.openshift.io cluster \ --type='json' --patch-file <file>.yaml
$ oc patch network.config.openshift.io cluster \1 --type='json' --patch-file <file>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 其中
file指定您创建的 YAML 文件的名称。
输出示例
network.config.openshift.io/cluster patched
network.config.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在为 API 和 Ingress 服务添加了 IPv6 VIP 的安装程序置备的基础架构中,完成以下步骤:
为集群指定 API 和 Ingress 服务的 IPv6 VIP。创建类似以下示例的 YAML 配置补丁文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 CLI 中输入以下命令来修补基础架构:
oc patch infrastructure cluster \ --type='json' --patch-file <file>.yaml
$ oc patch infrastructure cluster \ --type='json' --patch-file <file>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <file>
指定创建的 YAML 文件的名称。
输出示例
infrastructure/cluster patched
infrastructure/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在 CLI 中输入以下命令来显示集群网络配置:
oc describe network
$ oc describe networkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查集群网络配置是否识别您在 YAML 文件中指定的 IPv6 地址块,以验证在网络配置中成功安装补丁。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为在安装程序置备的基础架构中运行的集群完成以下附加任务:
在 CLI 中输入以下命令来显示集群基础架构配置:
oc describe infrastructure
$ oc describe infrastructureCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查基础架构是否识别您在 YAML 文件中指定的 IPv6 地址块,以验证在集群基础架构上安装补丁是否成功。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.2. 转换为单堆栈集群网络 复制链接链接已复制到粘贴板!
作为集群管理员,您可以将双栈集群网络转换为单堆栈集群网络。
如果您最初将 IPv4 单堆栈集群网络转换为双栈集群,则只能转换回 IPv4 单堆栈集群,而不是 IPv6 单堆栈集群网络。相同限制适用于对 IPv6 单堆栈集群网络的转换(只能转换回 IPv6)。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 集群使用 OVN-Kubernetes 网络插件。
- 集群节点具有 IPv6 地址。
- 您已启用了双栈网络。
流程
运行以下命令来编辑
networks.config.openshift.io自定义资源 (CR):oc edit networks.config.openshift.io
$ oc edit networks.config.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
删除在 "Converting to a dual-stack cluster network " 步骤中添加到
cidr和hostPrefix参数中的 IPv4 或 IPv6 配置。
第 6 章 配置 OVN-Kubernetes 内部 IP 地址子网 复制链接链接已复制到粘贴板!
作为集群管理员,您可以更改 OVN-Kubernetes 网络插件用于加入和传输子网的 IP 地址范围。
6.1. 配置 OVN-Kubernetes 加入子网 复制链接链接已复制到粘贴板!
您可以更改 OVN-Kubernetes 使用的 join 子网,以避免与环境中已存在的子网冲突。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 确保集群使用 OVN-Kubernetes 网络插件。
流程
要更改 OVN-Kubernetes 加入子网,请输入以下命令:
oc patch network.operator.openshift.io cluster --type='merge' \ -p='{"spec":{"defaultNetwork":{"ovnKubernetesConfig":$ oc patch network.operator.openshift.io cluster --type='merge' \ -p='{"spec":{"defaultNetwork":{"ovnKubernetesConfig": {"ipv4":{"internalJoinSubnet": "<join_subnet>"}, "ipv6":{"internalJoinSubnet": "<join_subnet>"}}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<join_subnet>-
指定 OVN-Kubernetes 内部使用的 IP 地址子网。子网必须大于集群中的节点数量,且必须足够大,以适应集群中的每个节点一个 IP 地址。此子网不能与 OpenShift Container Platform 或主机本身使用的任何其他子网重叠。IPv4 的默认值为
100.64.0.0/16,IPv6 的默认值是fd98::/64。
输出示例
network.operator.openshift.io/cluster patched
network.operator.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要确认配置处于活跃状态,请输入以下命令:
oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.defaultNetwork}"$ oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.defaultNetwork}"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令操作最多可能需要 30 分钟才能使此更改生效。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2. 将 OVN-Kubernetes 伪装子网配置为安装后操作 复制链接链接已复制到粘贴板!
您可以将 OVN-Kubernetes 使用的伪装子网更改为安装后操作,以避免与环境中已存在的子网冲突。
先决条件
-
安装 OpenShift CLI (
oc) 。 -
以具有
cluster-admin权限的用户身份登录集群。
流程
更改集群的伪装子网:
对于使用 IPv6 的双栈集群,请运行以下命令:
oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipv4":{"internalMasqueradeSubnet": "<ipv4_masquerade_subnet>"},"ipv6":{"internalMasqueradeSubnet": "<ipv6_masquerade_subnet>"}}}}}}'$ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipv4":{"internalMasqueradeSubnet": "<ipv4_masquerade_subnet>"},"ipv6":{"internalMasqueradeSubnet": "<ipv6_masquerade_subnet>"}}}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
ipv4_masquerade_subnet-
指定用作 IPv4 伪装子网的 IP 地址。此范围不能与 OpenShift Container Platform 或主机本身使用的任何其他子网重叠。在早于 4.17 的 OpenShift Container Platform 版本中,IPv4 的默认值是
169.254.169.0/29,升级到 4.17 的集群维护此值。对于从版本 4.17 开始的新集群,默认值为169.254.0.0/17。 ipv6_masquerade_subnet-
指定用作 IPv6 伪装子网的 IP 地址。此范围不能与 OpenShift Container Platform 或主机本身使用的任何其他子网重叠。IPv6 的默认值为
fd69::/125。
对于使用 IPv4 的集群,运行以下命令:
oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipv4":{"internalMasqueradeSubnet": "<ipv4_masquerade_subnet>"}}}}}}'$ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipv4":{"internalMasqueradeSubnet": "<ipv4_masquerade_subnet>"}}}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
ipv4_masquerade_subnet::一个 IP 地址,用作 IPv4 masquerade 子网。此范围不能与 OpenShift Container Platform 或主机本身使用的任何其他子网重叠。在早于 4.17 的 OpenShift Container Platform 版本中,IPv4 的默认值是169.254.169.0/29,升级到 4.17 的集群维护此值。对于从版本 4.17 开始的新集群,默认值为169.254.0.0/17。
6.3. 配置 OVN-Kubernetes 传输子网 复制链接链接已复制到粘贴板!
您可以更改 OVN-Kubernetes 使用的传输子网,以避免与环境中已存在的子网冲突。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 确保集群使用 OVN-Kubernetes 网络插件。
流程
要更改 OVN-Kubernetes 传输子网,请输入以下命令:
oc patch network.operator.openshift.io cluster --type='merge' \ -p='{"spec":{"defaultNetwork":{"ovnKubernetesConfig":$ oc patch network.operator.openshift.io cluster --type='merge' \ -p='{"spec":{"defaultNetwork":{"ovnKubernetesConfig": {"ipv4":{"internalTransitSwitchSubnet": "<transit_subnet>"}, "ipv6":{"internalTransitSwitchSubnet": "<transit_subnet>"}}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<transit_subnet>-
为分布式传输交换机指定一个 IP 地址子网,以启用 east-west 流量。此子网不能与 OVN-Kubernetes 或主机本身使用的任何其他子网重叠。IPv4 的默认值为
100.88.0.0/16,IPv6 的默认值是fd97::/64。
输出示例
network.operator.openshift.io/cluster patched
network.operator.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要确认配置处于活跃状态,请输入以下命令:
oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.defaultNetwork}"$ oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.defaultNetwork}"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可能需要 30 分钟才能使此更改生效。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 7 章 配置网关 复制链接链接已复制到粘贴板!
作为集群管理员,您可以配置 gatewayConfig 对象来管理外部流量离开集群的方式。为此,您可以将 routingViaHost 参数设置为以下值之一:
-
true表示出口流量通过托管 pod 的节点上的特定本地网关路由。通过主机的出口流量路由,此流量适用于主机的路由表。 -
false表示出口流量通过专用节点路由,但一组节点共享同一网关。出口流量不会通过主机路由。Open vSwitch (OVS)将流量直接输出到节点 IP 接口。
7.1. 配置出口路由策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 Cluster Network Operator (CNO)中的 gatewayConfig 规格配置出口路由策略。您可以使用以下步骤将 routingViaHost 字段设置为 true 或 false。
如果需要节点的主机网络充当与 OVN-Kubernetes 不相关的流量的路由器,按照流程中的可选步骤启用 IP 转发和 routingViaHost=true 配置。例如,将本地网关与 IP 转发相结合的可能用例包括:
- 配置通过节点的 IP 转发所有 pod 出口流量
- 将 OVN-Kubernetes CNI 与外部网络地址转换(NAT)设备集成
- 将 OVN-Kubernetes CNI 配置为使用内核路由表
先决条件
- 您以具有 admin 权限的用户身份登录。
流程
运行以下命令备份现有网络配置:
oc get network.operator cluster -o yaml > network-config-backup.yaml
$ oc get network.operator cluster -o yaml > network-config-backup.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令,将
routingViaHost参数设置为true。然后,出口流量会根据您在节点上配置的路由通过特定的网关进行路由。oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"routingViaHost": true}}}}}'$ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"routingViaHost": true}}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
routingViaHost=true配置的正确应用程序:oc get networks.operator.openshift.io cluster -o yaml | grep -A 5 "gatewayConfig"
$ oc get networks.operator.openshift.io cluster -o yaml | grep -A 5 "gatewayConfig"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 值为
true表示出口流量通过托管 pod 的节点上的特定本地网关路由。参数的false值表示一组节点共享单个网关,因此流量不会通过单个主机路由。
可选:运行以下命令来全局启用 IP 转发:
oc patch network.operator cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}'$ oc patch network.operator cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
ipForwardingspec 是否已设置为Global:oc get networks.operator.openshift.io cluster -o yaml | grep -A 5 "gatewayConfig"
$ oc get networks.operator.openshift.io cluster -o yaml | grep -A 5 "gatewayConfig"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 8 章 在默认网络中配置外部网关 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在默认网络上配置外部网关。
此功能提供以下优点:
- 根据每个命名空间对出口流量进行精细控制
- 静态和动态外部网关 IP 地址的灵活配置
- 支持 IPv4 和 IPv6 地址系列
8.1. 先决条件 复制链接链接已复制到粘贴板!
- 集群使用 OVN-Kubernetes 网络插件。
- 您的基础架构配置为路由来自二级外部网关的流量。
8.2. OpenShift Container Platform 如何决定外部网关 IP 地址 复制链接链接已复制到粘贴板!
您可以使用 k8s.ovn.org API 组中的 AdminPolicyBasedExternalRoute 自定义资源 (CR) 配置二级外部网关。CR 支持静态和动态方法来指定外部网关的 IP 地址。
AdminPolicyBasedExternalRoute CR 目标的每个命名空间不能被任何其他 AdminPolicyBasedExternalRoute CR 选择。命名空间不能有并发二级外部网关。
对策略的更改在控制器中被隔离。如果策略应用失败,对其他策略的更改不会触发其他策略的重试。策略只会重新评估,在对策略本身或与策略相关的对象(如目标命名空间、Pod 网关或命名空间从动态跃点托管它们)时应用更改可能出现的差异。
- 静态分配
- 您可以直接指定 IP 地址。
- 动态分配
您可以间接指定 IP 地址,带有命名空间和 pod 选择器,以及可选的网络附加定义。
- 如果提供了网络附加定义的名称,则使用网络附加定义的外部网关 IP 地址。
-
如果没有提供网络附加定义的名称,则使用 pod 本身的外部网关 IP 地址。但是,只有在 pod 配置为将
hostNetwork设置为true时,此方法才能正常工作。
8.3. AdminPolicyBasedExternalRoute 对象配置 复制链接链接已复制到粘贴板!
您可以使用以下属性来定义集群范围的 AdminPolicyBasedExternalRoute 对象。命名空间一次只能由一个 AdminPolicyBasedExternalRoute CR 选择。
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
指定 |
|
|
|
指定路由策略应用到的命名空间选择器。外部流量只支持 from:
namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: novxlan-externalgw-ecmp-4059
命名空间只能由一个 |
|
|
|
指定数据包转发到的目的地。需要是 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 指定静态 IP 地址的数组。 |
|
|
| 指定与配置了网络附加定义的 pod 对应的 pod 选择器,用作外部网关目标。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 指定下一个目的地跃点的 IPv4 或 IPv6 地址。 |
|
|
|
可选:指定网络是否支持 Bi-Directional Forwarding Detection (BFD)。默认值为 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 指定一个 [set-based](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#set-based-requirement)标签选择器来过滤与此网络配置匹配的命名空间中的 pod。 |
|
|
|
指定一个 |
|
|
|
可选:指定网络是否支持 Bi-Directional Forwarding Detection (BFD)。默认值为 |
|
|
| 可选:指定网络附加定义的名称。名称必须与与 pod 关联的逻辑网络列表匹配。如果没有指定此字段,则使用 pod 的主机网络。但是,pod 必须配置为主机网络 pod,才能使用主机网络。 |
8.3.1. 二级外部网关配置示例 复制链接链接已复制到粘贴板!
在以下示例中,AdminPolicyBasedExternalRoute 对象使用 kubernetes.io/metadata.name: novxlan-externalgw-ecmp-4059 标签在命名空间中将两个静态 IP 地址配置为 pod 的外部网关。
在以下示例中,AdminPolicyBasedExternalRoute 对象配置一个动态外部网关。用于外部网关的 IP 地址派生自与所选 pod 关联的额外网络附加。
在以下示例中,AdminPolicyBasedExternalRoute 对象同时配置静态和动态外部网关。
8.4. 配置二级外部网关 复制链接链接已复制到粘贴板!
您可以为集群中的命名空间在默认网络中配置外部网关。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
-
创建包含
AdminPolicyBasedExternalRoute对象的 YAML 文件。 要创建基于 admin 策略的外部路由,请输入以下命令:
oc create -f <file>.yaml
$ oc create -f <file>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<file>- 指定您在上一步中创建的 YAML 文件的名称。
输出示例
adminpolicybasedexternalroute.k8s.ovn.org/default-route-policy created
adminpolicybasedexternalroute.k8s.ovn.org/default-route-policy createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要确认已创建了基于 admin 策略的外部路由,请输入以下命令:
oc describe apbexternalroute <name> | tail -n 6
$ oc describe apbexternalroute <name> | tail -n 6Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<name>-
指定
AdminPolicyBasedExternalRoute对象的名称。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.5. 其他资源 复制链接链接已复制到粘贴板!
- 有关额外网络附加的更多信息,请参阅了解多个网络
第 9 章 配置出口 IP 地址 复制链接链接已复制到粘贴板!
作为集群管理员,您可以配置 OVN-Kubernetes Container Network Interface (CNI) 网络插件,为命名空间分配一个或多个出口 IP 地址,或分配给命名空间中的特定 pod。
目前,使用 HCP 集群的 ROSA 不支持配置出口 IP。
9.1. 出口 IP 地址架构设计和实施 复制链接链接已复制到粘贴板!
通过使用 OpenShift Container Platform 出口 IP 地址功能,您可以确保来自一个或多个命名空间中的一个或多个 pod 的流量为集群网络外的服务具有一致的源 IP 地址。
例如,您可能有一个 pod 定期查询托管在集群外服务器上的数据库。要强制对服务器进行访问要求,将数据包过滤设备配置为只允许来自特定 IP 地址的流量。为确保您可以可靠地允许从该特定 pod 访问服务器,您可以为向服务器发出请求的 pod 配置特定的出口 IP 地址。
分配给命名空间的出口 IP 地址与用来向特定目的地发送流量的出口路由器不同。
在一些集群配置中,应用程序 Pod 和入口路由器 pod 在同一个节点上运行。如果您在这种情况下为应用程序项目配置出口 IP 地址,当您向应用程序项目发送请求时,不会使用 IP 地址。
不能在任何 Linux 网络配置文件中配置出口 IP 地址,比如 ifcfg-eth0。
9.1.1. 平台支持 复制链接链接已复制到粘贴板!
在以下平台上支持在主主机网络中运行的 Egress IP 地址功能:
| 平台 | 支持 |
|---|---|
| 裸机 | 是 |
| VMware vSphere | 是 |
| Red Hat OpenStack Platform(RHOSP) | 是 |
| Amazon Web Services (AWS) | 是 |
| Google Cloud Platform (GCP) | 是 |
| Microsoft Azure | 是 |
| IBM Z® 和 IBM® LinuxONE | 是 |
| IBM Z® and IBM® LinuxONE for Red Hat Enterprise Linux (RHEL) KVM | 是 |
| IBM Power® | 是 |
| Nutanix | 是 |
在以下平台上支持在二级主机网络上运行的 Egress IP 地址功能:
| 平台 | 支持 |
|---|---|
| 裸机 | 是 |
在 Amazon Web Services(AWS)上置备的集群中不支持使用 EgressIP 功能将出口 IP 地址分配给 control plane 节点。(BZ#2039656)。
9.1.2. 公共云平台注意事项 复制链接链接已复制到粘贴板!
通常,公共云供应商对出口 IP 地址施加一个限制。这意味着,对于公共云基础架构上置备的集群,每个节点都有可分配 IP 地址的限制。如下公式描述了每个节点的可分配 IP 地址或 IP 容量 上限:
IP capacity = public cloud default capacity - sum(current IP assignments)
IP capacity = public cloud default capacity - sum(current IP assignments)
虽然 Egress IP 地址功能管理每个节点的 IP 地址容量,但在部署中计划这个约束非常重要。例如,如果公共云提供商将 IP 地址容量限制为每个节点 10 个 IP 地址,并且您有 8 个节点,则可分配的 IP 地址总数仅为 80。为了获得更高的 IP 地址容量,您需要分配额外的节点。例如,如果您需要 150 个可分配的 IP 地址,则需要分配 7 个节点。
要确认公共云环境中任何节点的 IP 容量和子网,您可以输入 oc get node <node_name> -o yaml 命令。cloud.network.openshift.io/egress-ipconfig 注解包括节点的容量和子网信息。
注解值是一个带有单个对象的数组,其中包含为主网络接口提供以下信息的字段:
-
interface:指定 AWS 和 Azure 上的接口 ID,以及 GCP 上的接口名称。 -
ifaddr:为一个或多个 IP 地址系列指定子网掩码。 -
capacity:指定节点的 IP 地址容量。在 AWS 上,IP 地址容量为每个 IP 地址系列提供。在 Azure 和 GCP 上,IP 地址容量同时包括 IPv4 和 IPv6 地址。
为节点之间的流量自动附加和分离出口 IP 地址。这允许命名空间中许多 pod 的流量在集群外的位置上具有一致的源 IP 地址。
RHOSP 出口 IP 地址功能会创建一个名为 egressip-<IP address> 的 neutron 保留端口。使用与 OpenShift Container Platform 集群安装相同的 RHOSP 用户,您可以为此保留端口分配一个浮动 IP 地址,以便为出口流量具有可预测的 SNAT 地址。当 RHOSP 网络上的出口 IP 地址从一个节点移到另一个节点时,因为节点故障转移(例如,neutron 保留端口会被删除并重新创建)。这意味着浮动 IP 关联丢失,您需要手动将浮动 IP 地址重新分配给新的保留端口。
当 RHOSP 集群管理员为保留端口分配一个浮动 IP 时,OpenShift Container Platform 无法删除保留端口。CloudPrivateIPConfig 对象无法执行删除和移动操作,直到 RHOSP 集群管理员从保留端口取消分配浮动 IP。
以下示例演示了来自多个公共云提供商上节点的注解。注解被缩进以便于阅读。
AWS 上的 cloud.network.openshift.io/egress-ipconfig 注解示例
GCP 上的 cloud.network.openshift.io/egress-ipconfig 注解示例
以下小节描述了支持公共云环境的 IP 地址容量,用于容量计算。
9.1.2.1. Amazon Web Services(AWS)IP 地址容量限制 复制链接链接已复制到粘贴板!
在 AWS 上,IP 地址分配的限制取决于配置的实例类型。如需更多信息,请参阅 每个实例类型的每个网络接口的 IP 地址
9.1.2.2. Google Cloud Platform(GCP)IP 地址容量限制 复制链接链接已复制到粘贴板!
在 GCP 中,网络模型通过 IP 地址别名而不是 IP 地址分配来实施额外的节点 IP 地址。但是,IP 地址容量直接映射到 IP 别名容量。
IP 别名分配存在以下容量限制:
- 每个节点,IPv4 和 IPv6 的最大 IP 别名数为 100 个。
- 对于每个 VPC,IP 别名的最大数量没有被指定,但 OpenShift Container Platform 可扩展性测试显示最大为 15,000 个。
如需更多信息,请参阅 Per instance 配额和 Alias IP 范围概述。
9.1.2.3. Microsoft Azure IP 地址容量限制 复制链接链接已复制到粘贴板!
在 Azure 上,IP 地址分配有以下容量限制:
- 对于每个 NIC,对于 IPv4 和 IPv6,可分配 IP 地址的最大数量为 256。
- 对于每个虚拟网络,分配的 IP 地址的最大数量不能超过 65,536。
如需更多信息,请参阅网络限制。
9.1.3. 出口 IP 地址配置架构图 复制链接链接已复制到粘贴板!
下图显示了出口 IP 地址配置。图中描述了,在一个集群的三个节点上运行的两个不同命名空间中的四个 pod。节点从主机网络上的 192.168.126.0/18 CIDR 块中分配 IP 地址。
Node 1 和 Node 3 都标记为 k8s.ovn.org/egress-assignable: "",因此可用于分配出口 IP 地址。
图中的横线描述了 pod1、pod2 和 pod 3 的流量流,通过 pod 网络来从 Node 1 和 Node 3 出口集群。当外部服务从示例 EgressIP 对象选择的任何 pod 接收流量时,源 IP 地址为 192.168.126.10 或 192.168.126.102。这两个节点之间流量大致平衡。
根据示意图,以下清单文件定义命名空间:
命名空间对象
根据示意图,以下 EgressIP 对象描述了一个配置,该配置选择将 env 标签设置为 prod 的任意命名空间中的所有 pod。所选 pod 的出口 IP 地址为 192.168.126.10 和 192.168.126.102。
EgressIP 对象
对于上例中的配置,OpenShift Container Platform 会为可用节点分配两个出口 IP 地址。status 字段显示是否以及在哪里分配了出口 IP 地址。
9.1.4. 在额外网络接口中使用出口 IP 地址的注意事项 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,出口 IP 地址为管理员提供控制网络流量的方法。出口 IP 地址可用于 br-ex Open vSwitch (OVS)网桥接口,以及启用了 IP 连接的任何物理接口。
您可以运行以下命令来检查网络接口类型:
ip -details link show
$ ip -details link show
主网络接口被分配一个节点 IP 地址,该地址还包含子网掩码。此节点 IP 地址的信息可以通过检查 k8s.ovn.org/node-primary-ifaddr 注解从集群中的每个节点检索。在 IPv4 集群中,此注解类似以下示例:"k8s.ovn.org/node-primary-ifaddr: {"ipv4":"192.168.111.23/24"}"。
如果出口 IP 地址不在主网络接口子网的子网中,您可以在不属于主网络接口类型的另一个 Linux 网络接口中使用出口 IP 地址。这样一来,OpenShift Container Platform 管理员提供了对网络方面的更高级别控制,如路由、寻址、分段和安全策略。此功能允许用户选择通过特定网络接口路由工作负载流量,如流量分段或满足特殊要求。
如果出口 IP 地址不在主网络接口的子网中,则如果节点上存在,则出口流量的另一个网络接口可能会发生。
您可以通过检查 k8s.ovn.org/host-cidrs Kubernetes 节点注解来确定哪些其他网络接口可能会支持出口 IP 地址。此注释包含为主网络接口找到的地址和子网掩码。它还包含其他网络接口地址和子网掩码信息。这些地址和子网掩码分配给使用 最长前缀匹配路由 机制的网络接口,以确定哪个网络接口支持出口 IP 地址。
OVN-Kubernetes 提供了一种机制来控制和直接从特定命名空间和 pod 出站网络流量。这样可确保它通过特定的网络接口和特定的出口 IP 地址退出集群。
对于希望出口 IP 地址和流量通过不是主网络接口的特定接口路由的用户,必须满足以下条件:
- OpenShift Container Platform 安装在裸机集群中。此功能在云或虚拟机监控程序环境中被禁用。
- OpenShift Container Platform pod 没有配置为 主机网络。
- 如果删除了网络接口,或者如果 IP 地址和子网掩码(允许在接口上托管出口 IP 地址)被删除,则会重新配置出口 IP 地址。因此,出口 IP 地址可以分配给另一个节点和接口。
- 如果您在辅助网络接口卡(NIC)上使用 Egress IP 地址,则必须使用 Node Tuning Operator 在二级 NIC 上启用 IP 转发。
9.2. EgressIP 对象 复制链接链接已复制到粘贴板!
查看以下 YAML 文件以更好地了解如何有效地配置 EgressIP 对象以更好地满足您的需求。
以下 YAML 描述了 EgressIP 对象的 API。对象的范围是集群范围的,它不在命名空间中创建。
其中:
<name>-
EgressIPs对象的名称。 <egressIPs>- 包括一个或多个 IP 地址的数组。
<namespaceSelector>- 出口 IP 地址与其关联的一个或多个命名空间选择器将。
<podSelector>- 可选参数。指定命名空间中的 pod 的一个或多个选择器来关联出口 IP 地址。通过使用这些选择器,可以选择命名空间中的 pod 子集。
以下 YAML 描述了命名空间选择器的小节:
命名空间选择器小节
namespaceSelector:
matchLabels:
<label_name>: <label_value>
namespaceSelector:
matchLabels:
<label_name>: <label_value>
其中:
<namespaceSelector>- 命名空间的一个或多个匹配规则。如果提供多个匹配规则,则会选择所有匹配的命名空间。
以下 YAML 描述了 pod 选择器的可选小节:
Pod 选择器片段
podSelector:
matchLabels:
<label_name>: <label_value>
podSelector:
matchLabels:
<label_name>: <label_value>
其中:
<podSelector>-
可选参数。与指定
namespaceSelector规则匹配的命名空间中的 pod 的一个或多个匹配规则。如果指定,则仅选择匹配的 pod。命名空间中的其他 Pod 不会被选择。
在以下示例中,EgressIP 对象将 192.168.126.11 和 192.168.126.102 出口 IP 地址与将 app 标签设置为 web 的 pod 关联,并位于将 env 标签设置为 prod 的命名空间中:
EgressIP 对象示例
在以下示例中,EgressIP 对象将 192.168.127.30 和 192.168.127.40 出口 IP 地址与任何没有将 environment 标签设置为 development 的 pod 相关联:
EgressIP 对象示例
9.3. 将出口 IP 分配给命名空间、节点和 pod 复制链接链接已复制到粘贴板!
要将一个或多个出口 IP 分配给命名空间中的命名空间或特定 pod,必须满足以下条件:
-
集群中至少有一个节点必须具有
k8s.ovn.org/egress-assignable: ""标签。 -
存在一个
EgressIP对象定义一个或多个出口 IP 地址,用作从命名空间中离开集群的流量的源 IP 地址。
如果您在为出口 IP 分配标记集群中的任何节点之前创建 EgressIP 对象,OpenShift Container Platform 可能会将每个出口 IP 地址分配给第一个节点,并使用 k8s.ovn.org/egress-assignable: "" 标签。
要确保出口 IP 地址在集群中的不同节点广泛分发,请在创建任何 EgressIP 对象前,始终将标签应用到您想托管出口 IP 地址的节点。
在创建 EgressIP 对象时,以下条件适用于标记为 k8s.ovn.org/egress-assignable: "" 标签的节点:
- 每次不会将出口 IP 地址分配给多个节点。
- 出口 IP 地址可在可以托管出口 IP 地址的可用节点之间平衡。
如果
EgressIP对象中的spec.EgressIPs数组指定了多个 IP 地址,则适用以下条件:- 任何节点都不会托管超过一个指定的 IP 地址。
- 流量在给定命名空间的指定 IP 地址之间大致相等。
- 如果节点不可用,则会自动重新分配给它的所有出口 IP 地址,但符合前面描述的条件。
当 Pod 与多个 EgressIP 对象的选择器匹配时,无法保证在 EgressIP 对象中指定的出口 IP 地址被分配为 pod 的出口 IP 地址。
另外,如果 EgressIP 对象指定了多个出口 IP 地址,则无法保证可以使用哪些出口 IP 地址。例如,如果 pod 与带有两个出口 IP 地址 (10.10.20.1 和 10.10.20.2) 的 EgressIP 对象的选择器匹配,其中任何一个都可以用于每个 TCP 连接或 UDP 对话。
9.4. 为一个命名空间分配出口 IP 地址 复制链接链接已复制到粘贴板!
您可以将一个或多个出口 IP 地址分配给一个命名空间,或分配给命名空间中的特定 pod。
先决条件
-
安装 OpenShift CLI(
oc)。 - 以集群管理员身份登录集群。
- 至少配置一个节点来托管出口 IP 地址。
流程
创建
EgressIP对象。-
创建一个
<egressips_name>.yaml文件,其中<egressips_name>是对象的名称。 在您创建的文件中,定义一个
EgressIP对象,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
创建一个
运行以下命令来创建对象。
oc apply -f <egressips_name>.yaml
$ oc apply -f <egressips_name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<egressips_name>-
将
<egressips_name>替换为对象的名称。
输出示例
egressips.k8s.ovn.org/<egressips_name> created
egressips.k8s.ovn.org/<egressips_name> createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
可选:保存
<egressips_name>.yaml文件,以便稍后进行修改。 为需要出口 IP 地址的命名空间添加标签。要在第 1 步中定义的
EgressIP对象的命名空间中添加标签,请运行以下命令:oc label ns <namespace> env=qa
$ oc label ns <namespace> env=qaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>-
将
<namespace>替换为需要出口 IP 地址的命名空间。
验证
要显示集群中正在使用的所有出口 IP 地址,请输入以下命令:
oc get egressip -o yaml
$ oc get egressip -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意无论配置了多少个出口 IP 地址,
oc get egressip只返回一个出口 IP 地址。这并不是程序错误,它是 Kubernetes 的一个限制。作为临时解决方案,您可以传递-o yaml或-o json标志来返回所有正在使用的出口 IP 地址。输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.5. 标记节点以托管出口 IP 地址 复制链接链接已复制到粘贴板!
您可以将 k8s.ovn.org/egress-assignable="" 标签应用到集群中的节点,以便 OpenShift Container Platform 可以为该节点分配一个或多个出口 IP 地址。
先决条件
-
安装 OpenShift CLI(
oc)。 - 以集群管理员身份登录集群。
流程
要标记节点,使其可以托管一个或多个出口 IP 地址,请输入以下命令:
oc label nodes <node_name> k8s.ovn.org/egress-assignable=""
$ oc label nodes <node_name> k8s.ovn.org/egress-assignable=""1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 要标记的节点的名称。
提示您还可以应用以下 YAML 将标签添加到节点:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.6. 为 EgressIP 对象配置双栈网络 复制链接链接已复制到粘贴板!
对于为双栈网络配置的集群,您可以将双栈网络应用到单个 EgressIP 对象。然后,EgressIP 对象可以将双栈网络扩展到 pod。
红帽不支持创建两个 EgressIP 对象来代表双栈网络。例如,使用一个对象指定 IPv4 地址并使用另一个对象指定 IPv6 地址。此配置限制会影响到 pod 的地址类型分配。
先决条件
-
您创建两个出口节点,以便
EgressIP对象可将 IPv4 地址分配给一个节点,并将 IPv6 地址分配给其他节点。如需更多信息,请参阅"向节点"分配出口 IP 地址"。
流程
创建
EgressIP对象并为对象配置 IPv4 和 IPv6 地址。以下示例EgressIP对象使用选择器来标识哪些 pod 将指定的出口 IP 地址用于其出站流量:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
创建
Pod清单文件以测试并验证您的EgressIP对象。pod 充当发送出站流量的客户端工作负载,以验证EgressIP策略是否按预期工作。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<labels>-
设置自定义标识符,以便
EgressIP对象可以使用这些标签将出口 IP 地址应用到目标 pod。
从 pod 内运行
curl请求,再到外部服务器。此操作会验证出站流量是否使用您在EgressIP对象中指定的地址。curl <ipv_address>
$ curl <ipv_address>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<ipv_address>-
根据
EgressIP对象,输入 IPv4 或 IPv6 地址。
9.7. egressIPConfig 对象 复制链接链接已复制到粘贴板!
作为出口 IP 的功能,reachabilityTotalTimeoutSeconds 参数配置 EgressIP 节点可访问性检查总超时时间(以秒为单位)。如果在这个超时时间内无法访问 EgressIP 节点,则会声明该节点。
您可以在配置文件中为 egressIPConfig 对象设置 reachabilityTotalTimeoutSeconds 的值。设置较大的值可能会导致 EgressIP 实现对节点更改做出反应的速度较慢。对于有问题的 EgressIP 节点,这个实现的反应会较慢。
如果您从 egressIPConfig 对象中省略了 reachabilityTotalTimeoutSeconds 参数,则平台会选择一个合理的默认值,这可能会随时间变化。当前的默认值为 1 秒。0 代表禁用 EgressIP 节点的访问性检查。
以下 egressIPConfig 对象描述了将 reachabilityTotalTimeoutSeconds 从默认的 1 秒探测改为 5 秒探测:
其中:
<egressIPConfig>-
egressIPConfig包含EgressIP对象选项的配置。通过更改这些配置,您可以扩展EgressIP对象。 <reachabilityTotalTimeoutSeconds>-
reachabilityTotalTimeoutSeconds的值接受从0到60的整数值。0代表禁用 egressIP 节点的访问性检查。将1的值设置为60对应于探测向节点发送可达性检查的超时时间(以秒为单位)。
第 10 章 配置出口服务 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 egress 服务为负载均衡器服务后面的 pod 配置出口流量。
出口服务只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
您可以使用以下方法使用 EgressService 自定义资源(CR)管理出口流量:
将负载均衡器服务 IP 地址分配为负载均衡器服务后面的 pod 的源 IP 地址。
将负载均衡器 IP 地址分配在这个上下文中的源 IP 地址对于显示单个出口和入口点很有用。例如,在某些情况下,与负载均衡器服务后面的应用程序通信的外部系统可能会预期应用程序的源和目标 IP 地址相同。
注意当您将负载均衡器服务 IP 地址分配给服务后面的 pod 的出口流量时,OVN-Kubernetes 会将入口和出口点限制为单一节点。这限制了 MetalLB 通常提供的流量的负载均衡。
将负载均衡器后面的 pod 的出口流量分配给与默认节点网络不同的网络。
这可用于将负载均衡器后面的应用程序的出口流量分配给与默认网络不同的网络。通常,不同的网络通过使用与网络接口关联的 VRF 实例来实施。
10.1. 出口服务自定义资源 复制链接链接已复制到粘贴板!
在 EgressService 自定义资源中定义出口服务的配置。以下 YAML 描述了配置出口服务的字段:
- 1
- 指定出口服务的名称。
EgressService资源的名称必须与您要修改的负载均衡器服务的名称匹配。 - 2
- 指定出口服务的命名空间。
EgressService的命名空间必须与您要修改的负载均衡器服务的命名空间匹配。egress 服务是命名空间范围的。 - 3
- 为服务后面的 pod 指定出口流量的源 IP 地址。有效值为
LoadBalancerIP或Network。使用LoadBalancerIP值将LoadBalancer服务入口 IP 地址分配为出口流量的源 IP 地址。指定Network将网络接口 IP 地址分配为出口流量的源 IP 地址。 - 4
- 可选: 如果您将
LoadBalancerIP值用于sourceIPBy规格,则单一节点处理LoadBalancer服务流量。使用nodeSelector字段来限制哪些节点可以被分配。当选择节点来处理服务流量时,OVN-Kubernetes 以以下格式标记节点:egress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""。如果没有指定nodeSelector字段,任何节点都可以管理LoadBalancer服务流量。 - 5
- 可选:指定出口流量的路由表 ID。确保值与
NodeNetworkConfigurationPolicy资源中定义的route-table-idID 匹配。如果没有network规格,egress 服务将使用默认主机网络。
出口服务规格示例
10.2. 部署出口服务 复制链接链接已复制到粘贴板!
您可以部署出口服务,以管理 LoadBalancer 服务后面的 pod 的出口流量。
以下示例将出口流量配置为具有与 LoadBalancer 服务的入口 IP 地址相同的源 IP 地址。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 -
已配置了 MetalLB
BGPPeer资源。
流程
为服务创建一个带有所需 IP 的
IPAddressPoolCR:创建一个文件,如
ip-addr-pool.yaml,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,为 IP 地址池应用配置:
oc apply -f ip-addr-pool.yaml
$ oc apply -f ip-addr-pool.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建
Service和EgressServiceCR:创建一个文件,如
service-egress-service.yaml,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果使用
sourceIPBy: "LoadBalancerIP"设置,您必须在BGPAdvertisement自定义资源(CR) 中指定 load-balancer 节点。运行以下命令,为服务和出口服务应用配置:
oc apply -f service-egress-service.yaml
$ oc apply -f service-egress-service.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建
BGPAdvertisementCR 来公告服务:创建一个文件,如
service-bgp-advertisement.yaml,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 在本例中,
EgressServiceCR 将出口流量的源 IP 地址配置为使用负载均衡器服务 IP 地址。因此,您必须指定负载均衡器节点返回流量,以便为来自 pod 的流量使用相同的返回路径。
验证
运行以下命令,验证您可以访问 MetalLB 服务后运行的 pod 的应用程序端点:
curl <external_ip_address>:<port_number>
$ curl <external_ip_address>:<port_number>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 更新外部 IP 地址和端口号,以适合您的应用程序端点。
-
如果您将
LoadBalancer服务的入口 IP 地址分配为出口流量的源 IP 地址,请使用tcpdump等工具分析外部客户端接收的数据包来验证此配置。
第 11 章 使用出口路由器 pod 的注意事项 复制链接链接已复制到粘贴板!
11.1. 关于出口路由器 pod 复制链接链接已复制到粘贴板!
OpenShift Container Platform 出口路由器(egress router ) pod 使用一个来自专用的私有源 IP 地址,将网络流量重定向到指定的远程服务器。出口路由器 pod 可以将网络流量发送到设置为仅允许从特定 IP 地址访问的服务器。
出口路由器 pod 并不适用于所有外向的连接。创建大量出口路由器 pod 可能会超过您的网络硬件的限制。例如,为每个项目或应用程序创建出口路由器 pod 可能会导致,在转换为使用软件来进行 MAC 地址过滤前超过了网络接口可以处理的本地 MAC 地址的数量。
出口路由器镜像与 Amazon AWS、Azure Cloud 或其他不支持第 2 层操作的云平台不兼容,因为它们与 macvlan 流量不兼容。
11.1.1. 出口路由器模式 复制链接链接已复制到粘贴板!
在重定向模式中,出口路由器 Pod 配置 iptables 规则,将流量从其自身 IP 地址重定向到一个或多个目标 IP 地址。需要使用保留源 IP 地址的客户端 pod 必须配置为访问出口路由器的服务,而不是直接连接到目标 IP。您可以使用 curl 命令从应用程序 pod 访问目标服务和端口。例如:
curl <router_service_IP> <port>
$ curl <router_service_IP> <port>
egress router CNI 插件只支持重定向模式。egress router CNI 插件不支持 HTTP 代理模式或 DNS 代理模式。
11.1.2. 出口路由器 pod 的实现 复制链接链接已复制到粘贴板!
出口路由器实施使用出口路由器 Container Network Interface(CNI)插件。该插件将二级网络接口添加到 pod。
出口路由器是一个带有两个网络接口的 pod。例如,pod 可以具有 eth0 和 net1 网络接口。eth0 接口位于集群网络中,pod 将继续将接口用于与集群相关的普通网络流量。net1 接口位于第二个网络中,它拥有那个网络的 IP 地址和网关。OpenShift Container Platform 集群中的其他 pod 可以访问出口路由器服务,服务使 pod 可以访问外部服务。出口路由器作为 pod 和外部系统间的桥接。
离开出口路由器的流量会通过一个节点退出,但数据包带有来自路由器 pod 的 net1 接口的 MAC 地址。
添加出口路由器自定义资源时,Cluster Network Operator 会创建以下对象:
-
pod 的
net1二级网络接口的网络附加定义。 - 出口路由器的部署。
如果您删除了一个出口路由器自定义资源,Operator 会删除上列表中与出口路由器关联的两个对象。
11.1.3. 部署注意事项 复制链接链接已复制到粘贴板!
出口路由器 pod 会为节点的主网络接口添加额外的 IP 地址和 MAC 地址。因此,您可能需要配置虚拟机监控程序或云供应商来允许额外的地址。
- Red Hat OpenStack Platform (RHOSP)
如果在 RHOSP 上部署 OpenShift Container Platform,则必须允许来自 OpenStack 环境上的出口路由器 Pod 的 IP 和 MAC 地址的流量。如果您不允许流量,则通信会失败:
openstack port set --allowed-address \ ip_address=<ip_address>,mac_address=<mac_address> <neutron_port_uuid>
$ openstack port set --allowed-address \ ip_address=<ip_address>,mac_address=<mac_address> <neutron_port_uuid>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - VMware vSphere
- 如果您使用 VMware vSphere,请参阅 VMware 文档来保护 vSphere 标准交换机。通过从 vSphere Web 客户端中选择主机虚拟交换机来查看并更改 VMware vSphere 默认设置。
具体来说,请确保启用了以下功能:
11.1.4. 故障切换配置 复制链接链接已复制到粘贴板!
为了避免停机,Cluster Network Operator 会将出口路由器 pod 部署为部署资源。部署名称为 egress-router-cni-deployment。与部署对应的 pod 具有 app=egress-router-cni 标签。
要为部署创建新服务,请使用 oc expose deployment/egress-router-cni-deployment --port <port_number> 命令或创建类似以下示例的文件:
第 12 章 以重定向模式部署出口路由器 pod 复制链接链接已复制到粘贴板!
作为集群管理员,您可以部署出口路由器 Pod,将流量重新指向来自保留源 IP 地址的指定目标 IP 地址。
出口路由器实施使用出口路由器 Container Network Interface(CNI)插件。
12.1. 出口路由器自定义资源 复制链接链接已复制到粘贴板!
在出口路由器自定义资源中定义出口路由器 pod 的配置。以下 YAML 描述了以重定向模式配置出口路由器的字段:
- 1
- 可选:
namespace字段指定要在其中创建出口路由器的命名空间。如果您没有在文件或命令行中指定值,则会使用default命名空间。 - 2
address字段指定要在第二个网络接口上配置的 IP 地址。- 3
ip字段指定节点用于出口路由器 pod 的物理网络中保留源 IP 地址和子网掩码。使用 CIDR 表示法指定 IP 地址和网络掩码。- 4
gateway字段指定网络网关的 IP 地址。- 5
- 可选:
redirectRules字段指定出口目的地 IP 地址、出口路由器端口和协议的组合。到指定端口和协议中的出口路由器的传入连接路由到目标 IP 地址。 - 6
- 可选:
targetPort字段指定目标 IP 地址上的网络端口。如果没有指定此字段,流量将路由到它到达的同一网络端口。 - 7
protocol字段支持 TCP、UDP 或 SCTP。- 8
- 可选:
fallbackIP字段指定目标 IP 地址。如果没有指定任何重定向规则,出口路由器会将所有流量发送到这个回退 IP 地址。如果您指定了重定向规则,则出口路由器将任何与规则中定义的网络端口的连接发送到这个回退 IP 地址。如果没有指定此字段,出口路由器会拒绝与规则中没有定义的网络端口的连接。
出口路由器规格示例
12.2. 以重定向模式部署出口路由器 复制链接链接已复制到粘贴板!
您可以部署出口路由器,将其自身保留源 IP 地址的流量重定向到一个或多个目标 IP 地址。
添加出口路由器后,需要使用保留源 IP 地址的客户端 pod 必须修改为连接到出口路由器,而不是直接连接到目标 IP。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
- 创建出口路由器定义。
为确保其他 pod 可以找到出口路由器 pod 的 IP 地址,请创建一个使用出口路由器的服务,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定出口路由器的标签。显示的值由 Cluster Network Operator 添加,且不可配置。
创建服务后,您的 Pod 可以连接到该服务。出口路由器 pod 将流量重定向到目标 IP 地址中对应的端口。连接来自保留的源 IP 地址。
验证
要验证 Cluster Network Operator 是否启动了出口路由器,请完成以下步骤:
查看 Operator 为出口路由器创建的网络附加定义:
oc get network-attachment-definition egress-router-cni-nad
$ oc get network-attachment-definition egress-router-cni-nadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 网络附加定义的名称不可配置。
输出示例
NAME AGE egress-router-cni-nad 18m
NAME AGE egress-router-cni-nad 18mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 查看出口路由器 pod 的部署:
oc get deployment egress-router-cni-deployment
$ oc get deployment egress-router-cni-deploymentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 部署的名称不可配置。
输出示例
NAME READY UP-TO-DATE AVAILABLE AGE egress-router-cni-deployment 1/1 1 1 18m
NAME READY UP-TO-DATE AVAILABLE AGE egress-router-cni-deployment 1/1 1 1 18mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 查看出口路由器 pod 的状态:
oc get pods -l app=egress-router-cni
$ oc get pods -l app=egress-router-cniCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE egress-router-cni-deployment-575465c75c-qkq6m 1/1 Running 0 18m
NAME READY STATUS RESTARTS AGE egress-router-cni-deployment-575465c75c-qkq6m 1/1 Running 0 18mCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 查看出口路由器 pod 的日志和路由表。
获取出口路由器 pod 的节点名称:
POD_NODENAME=$(oc get pod -l app=egress-router-cni -o jsonpath="{.items[0].spec.nodeName}")$ POD_NODENAME=$(oc get pod -l app=egress-router-cni -o jsonpath="{.items[0].spec.nodeName}")Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在目标节点上进入一个 debug 会话。此步骤被实例化为一个名为
<node_name>-debug的 debug pod:oc debug node/$POD_NODENAME
$ oc debug node/$POD_NODENAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
/host设为 debug shell 中的根目录。debug pod 在 pod 中的/host中挂载主机 的 root 文件系统。将根目录改为/host,您可以从主机的可执行路径中运行二进制文件:chroot /host
# chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
chroot环境控制台中显示出口路由器日志:cat /tmp/egress-router-log
# cat /tmp/egress-router-logCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当您启动出口路由器时,通过创建
EgressRouter对象来启动出口路由器时,日志文件位置和日志记录级别不可配置,如下所述。在
chroot环境控制台中获取容器 ID:crictl ps --name egress-router-cni-pod | awk '{print $1}'# crictl ps --name egress-router-cni-pod | awk '{print $1}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
CONTAINER bac9fae69ddb6
CONTAINER bac9fae69ddb6Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确定容器的进程 ID。在本例中,容器 ID 是
bac9fae69ddb6:crictl inspect -o yaml bac9fae69ddb6 | grep 'pid:' | awk '{print $2}'# crictl inspect -o yaml bac9fae69ddb6 | grep 'pid:' | awk '{print $2}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
68857
68857Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入容器的网络命名空间:
nsenter -n -t 68857
# nsenter -n -t 68857Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示路由表:
ip route
# ip routeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例输出中,
net1网络接口是默认路由。集群网络的流量使用eth0网络接口。192.168.12.0/24网络的流量使用net1网络接口,并来自保留源 IP 地址192.168.12.99。pod 将所有其他流量路由到网关的 IP 地址192.168.12.1。不显示服务网络的路由。输出示例
default via 192.168.12.1 dev net1 10.128.10.0/23 dev eth0 proto kernel scope link src 10.128.10.18 192.168.12.0/24 dev net1 proto kernel scope link src 192.168.12.99 192.168.12.1 dev net1
default via 192.168.12.1 dev net1 10.128.10.0/23 dev eth0 proto kernel scope link src 10.128.10.18 192.168.12.0/24 dev net1 proto kernel scope link src 192.168.12.99 192.168.12.1 dev net1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 13 章 为项目启用多播 复制链接链接已复制到粘贴板!
13.1. 关于多播 复制链接链接已复制到粘贴板!
通过使用 IP 多播,数据可同时广播到许多 IP 地址。
- 目前,多播最适用于低带宽协调或服务发现。它不是一个高带宽解决方案。
-
默认情况下,网络策略会影响命名空间中的所有连接。但是,多播不受网络策略的影响。如果在与网络策略相同的命名空间中启用了多播,则始终允许多播,即使有一个
deny-all网络策略。在启用网络策略前,集群管理员应考虑对多播的影响。
默认情况下,OpenShift Container Platform pod 之间多播流量被禁用。如果使用 OVN-Kubernetes 网络插件,可以根据每个项目启用多播。
13.2. 启用 pod 间多播 复制链接链接已复制到粘贴板!
您可以为项目启用 pod 间多播。
先决条件
-
安装 OpenShift CLI(
oc)。 -
您必须作为
cluster-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
第 14 章 为项目禁用多播 复制链接链接已复制到粘贴板!
14.1. 禁用 pod 间多播 复制链接链接已复制到粘贴板!
您可以为项目禁用 pod 间多播。
先决条件
-
安装 OpenShift CLI(
oc)。 -
您必须作为
cluster-admin角色用户登录集群。
流程
运行以下命令来禁用多播:
oc annotate namespace <namespace> \ k8s.ovn.org/multicast-enabled-$ oc annotate namespace <namespace> \1 k8s.ovn.org/multicast-enabled-Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 您要禁用多播的项目的
namespace。
提示您还可以应用以下 YAML 来删除注解:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 15 章 跟踪网络流 复制链接链接已复制到粘贴板!
作为集群管理员,您可以从集群中收集有关 pod 网络流的信息,以帮助以下区域:
- 监控 pod 网络上的入口和出口流量。
- 对性能问题进行故障排除。
- 为容量规划和安全审计收集数据。
当您启用网络流的集合时,只会收集与流量相关的元数据。例如,不会收集实际的数据包数据,而是只收集协议、源地址、目标地址、端口号、字节数和其他数据包级别的信息。
数据采用以下一种或多种记录格式收集:
- NetFlow
- sFlow
- IPFIX
当您使用一个或多个收集器 IP 地址和端口号配置 Cluster Network Operator(CNO)时,Operator 会在每个节点上配置 Open vSwitch(OVS),以将网络流记录发送到每个收集器。
您可以将 Operator 配置为将记录发送到多种类型的网络流收集器。例如,您可以将记录发送到 NetFlow 收集器,并将记录发送到 sFlow 收集器。
当 OVS 向收集器发送数据时,每种类型的收集器接收相同的记录。例如,如果您配置两个 NetFlow 收集器,节点上的 OVS 会将相同的记录发送到两个收集器。如果您还配置了两个 sFlow 收集器,则两个 sFlow 收集器将接收相同的记录。但是,每个收集器类型都具有唯一的记录格式。
收集网络流数据并将记录发送到收集器会影响性能。节点处理数据包的速度较慢。如果性能影响太大,您可以删除收集器的目的地,以禁用收集网络流数据并恢复性能。
启用网络流收集器可能会影响集群网络的整体性能。
15.1. 用于跟踪网络流的网络对象配置 复制链接链接已复制到粘贴板!
下表显示了在 Cluster Network Operator(CNO)中配置网络流收集器的字段:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CNO 对象的名称。这个名称始终是 |
|
|
|
一个或多个 |
|
|
| 最多 10 个收集器的 IP 地址和网络端口对列表。 |
|
|
| 最多 10 个收集器的 IP 地址和网络端口对列表。 |
|
|
| 最多 10 个收集器的 IP 地址和网络端口对列表。 |
将以下清单应用到 CNO 后,Operator 会在集群中的每个节点上配置 Open vSwitch(OVS),将网络流记录发送到侦听 192.168.1.99:2056 的 NetFlow 收集器。
跟踪网络流的配置示例
15.2. 为网络流收集器添加目的地 复制链接链接已复制到粘贴板!
作为集群管理器,您可以将 Cluster Network Operator(CNO)配置为发送有关 pod 网络的网络流元数据到网络流收集器。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 您有一个网络流收集器,知道它所侦听的 IP 地址和端口。
流程
创建补丁文件,用于指定网络流收集器类型以及收集器的 IP 地址和端口信息:
spec: exportNetworkFlows: netFlow: collectors: - 192.168.1.99:2056spec: exportNetworkFlows: netFlow: collectors: - 192.168.1.99:2056Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用网络流收集器配置 CNO:
oc patch network.operator cluster --type merge -p "$(cat <file_name>.yaml)"
$ oc patch network.operator cluster --type merge -p "$(cat <file_name>.yaml)"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
network.operator.openshift.io/cluster patched
network.operator.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
通常情况不需要进行验证。您可以运行以下命令,确认每个节点上的 Open vSwitch(OVS)已配置为将网络流记录发送到一个或多个收集器。
查看 Operator 配置,确认配置了
exportNetworkFlows字段:oc get network.operator cluster -o jsonpath="{.spec.exportNetworkFlows}"$ oc get network.operator cluster -o jsonpath="{.spec.exportNetworkFlows}"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
{"netFlow":{"collectors":["192.168.1.99:2056"]}}{"netFlow":{"collectors":["192.168.1.99:2056"]}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看每个节点中的 OVS 网络流配置:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.3. 删除网络流收集器的所有目的地 复制链接链接已复制到粘贴板!
作为集群管理员,您可以配置 Cluster Network Operator(CNO)来停止将网络流元数据发送到网络流收集器。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
删除所有网络流收集器:
oc patch network.operator cluster --type='json' \ -p='[{"op":"remove", "path":"/spec/exportNetworkFlows"}]'$ oc patch network.operator cluster --type='json' \ -p='[{"op":"remove", "path":"/spec/exportNetworkFlows"}]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
network.operator.openshift.io/cluster patched
network.operator.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 16 章 配置混合联网 复制链接链接已复制到粘贴板!
作为集群管理员,您可以配置 Red Hat OpenShift Networking OVN-Kubernetes 网络插件,以允许 Linux 和 Windows 节点分别托管 Linux 和 Windows 工作负载。
16.1. 使用 OVN-Kubernetes 配置混合网络 复制链接链接已复制到粘贴板!
您可以将集群配置为使用 OVN-Kubernetes 网络插件的混合网络。这允许支持不同节点网络配置的混合集群。
此配置是在同一集群中同时运行 Linux 和 Windows 节点所必需的。
先决条件
-
安装 OpenShift CLI (
oc) 。 -
以具有
cluster-admin权限的用户身份登录集群。 - 确保集群使用 OVN-Kubernetes 网络插件。
流程
要配置 OVN-Kubernetes 混合网络覆盖,请输入以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
cidr- 指定用于额外覆盖网络上节点的 CIDR 配置。这个 CIDR 不能与集群网络 CIDR 重叠。
hostPrefix-
指定要分配给每个节点的子网前缀长度。例如,如果
hostPrefix 设为23,则每个节点从 givencidr中分配 a/23子网,这样就能有 510(2^(32 - 23)- 2)个 pod IP 地址。如果需要从外部网络访问节点,请配置负载均衡器和路由器来管理流量。 hybridOverlayVXLANPort-
为额外覆盖网络指定自定义 VXLAN 端口。这是在 vSphere 上安装的集群中运行 Windows 节点所需要的,且不得为任何其他云供应商配置。自定义端口可以是除默认
4789端口外的任何打开的端口。有关此要求的更多信息,请参阅 Microsoft 文档中的 Pod 到主机间的 pod 连接性。
输出示例
network.operator.openshift.io/cluster patched
network.operator.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要确认配置是活跃的,请输入以下命令。应用更新可能需要几分钟。
oc get network.operator.openshift.io -o jsonpath="{.items[0].spec.defaultNetwork.ovnKubernetesConfig}"$ oc get network.operator.openshift.io -o jsonpath="{.items[0].spec.defaultNetwork.ovnKubernetesConfig}"Copy 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.