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® 和 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)。
-
使用您在集群安装过程中为节点创建的主网络接口(如
eth
0)来创建其他二级网络。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 ens4
Copy 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 interface
Copy 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 寻址,因此不要将ipv6.disable
参数设置为1
。
1.3. 会话关联性 复制链接链接已复制到粘贴板!
会话关联性是适用于 Kubernetes Service
对象的功能。如果要确保每次连接到 <service_VIP>:<Port> 时,您可以使用 会话关联性,流量始终被加载到同一后端。如需更多信息,包括如何根据客户端的 IP 地址设置会话关联性,请参阅会话关联性。
会话关联性的粘性超时
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-node
pod 中运行。 -
ovn-controller - 这是与 OVS 和 hypervisor 交互的 OVN 代理,适用于
sbdb
容器所需的任何信息或更新。ovn-controller
从sbdb
容器读取逻辑流,将它们转换为OpenFlow
流,并将它们发送到节点的 OVS 守护进程。容器名称为ovn-controller
,它在ovnkube-node
pod 中运行。
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-kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 集群中的每个节点都有一个
ovnkube-node
pod。ovnkube-config
配置映射具有 OpenShift Container Platform OVN-Kubernetes 配置。运行以下命令,列出
ovnkube-node
pod 中的所有容器: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-kubernetes
Copy 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-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ovnkube-node
pod 由几个容器组成。它负责托管北向数据库(nbdb
容器)、南向数据库(sbdb
容器)、北守护进程 (northd
容器)、ovn-controller
和ovnkube-controller
容器。ovnkube-controller
容器会监视 API 对象,如 pod、egress IP、命名空间、服务、端点、出口防火墙和网络策略。它还负责为该节点从可用子网池中分配 pod IP。运行以下命令,列出
ovnkube-control-plane
pod 中的所有容器: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-kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
kube-rbac-proxy ovnkube-cluster-manager
kube-rbac-proxy ovnkube-cluster-manager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ovnkube-control-plane
pod 有一个容器(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-kubernetes
Copy 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 -owide
Copy 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-55xs2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令以显示北向数据库中的所有对象:
ovn-nbctl show
$ ovn-nbctl show
Copy 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-list
Copy 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-list
Copy 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-list
Copy 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 --help
Copy 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-kubernetes
Copy 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 -owide
Copy 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-55xs2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令以显示南向数据库中的所有对象:
ovn-sbctl show
$ ovn-sbctl show
Copy 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 --help
Copy 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.git
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更改到您刚才克隆的存储库的目录:
cd network-tools
$ cd network-tools
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有可用的命令:
./debug-scripts/network-tools -h
$ ./debug-scripts/network-tools -h
Copy 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-list
Copy 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=localnet
Copy 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=l3gateway
Copy 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=patch
Copy 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-node
pod 中的北向和南向数据库容器的就绪度探测会检查数据库和ovnkube-controller
容器的健康状态。ovnkube-node
pod 中的ovnkube-controller
容器有一个就绪度探测来验证 OVN-Kubernetes CNI 配置文件是否存在,这代表 pod 没有运行,或者没有准备好接受配置 pod 的请求。使用以下命令,显示命名空间的所有事件,包括探测失败:
oc get events -n openshift-ovn-kubernetes
$ oc get events -n openshift-ovn-kubernetes
Copy 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-kubernetes
Copy 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-node
pod 中每个容器的就绪状态
: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'; \ done
Copy 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-kubernetes
Copy 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-kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出的日志文件内容。
检查
ovnkube-node
pod 中所有容器的最新条目: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; done
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令,查看
ovnkube-node
pod 中每个容器的最后 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 5
Copy 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-kubernetes
Copy 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.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
configmap/env-overrides.yaml created
configmap/env-overrides.yaml created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令重启
ovnkube
pod 以应用新的日志级别: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-node
Copy 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-node
Copy 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-node
Copy 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' ; done
Copy 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-diagnostics
Copy 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
3.7. 使用 CLI 检查带有 OVS 抽样的 OVN-Kubernetes 网络流量 复制链接链接已复制到粘贴板!
使用 OVS 抽样检查 OVN-Kubernetes 网络流量只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
OVN-Kubernetes 网络流量可以通过 CLI 来查看以下网络 API 的 OVS 抽样:
-
NetworkPolicy
-
AdminNetworkPolicy
-
BaselineNetworkPolicy
-
UserDefinedNetwork
隔离 -
EgressFirewall
- 多播 ACL。
这些网络事件的脚本可在每个 OVN-Kubernetes 节点的 /usr/bin/ovnkube-observ
路径中找到。
虽然 Network Observability Operator 和检查带有 OVS 抽样的 OVN-Kubernetes 网络流量都适合可调试,但 Network Observability Operator 旨在观察网络事件。另外,使用 CLI 检查带有 OVS 抽样的 OVN-Kubernetes 网络流量可帮助进行数据包追踪;也可以在安装 Network Observability Operator 时使用,但这不是强制要求。
管理员可以添加 --add-ovs-collect
选项来查看节点上的网络流量,或者传递额外的标志来过滤特定 pod 的结果。额外的标记可在带有 OVS 抽样标志"部分的 "OVN-Kubernetes 网络流量中找到。
使用以下步骤通过 CLI 查看 OVN-Kubernetes 网络流量。
先决条件
-
以具有
cluster-admin
权限的用户身份登录集群。 - 您已创建了源 pod 和目标 pod,并在它们之间运行流量。
-
您至少创建了以下网络 API 之一:
NetworkPolicy
、AdminNetworkPolicy
、BaselineNetworkPolicy
、UserDefinedNetwork
隔离、多播或出口防火墙。
流程
要使用 OVS 抽样功能启用
OVNObservability
,请输入以下命令在名为cluster
的FeatureGate
CR 中启用TechPreviewNoUpgrade
功能集:oc patch --type=merge --patch '{"spec": {"featureSet": "TechPreviewNoUpgrade"}}' featuregate/cluster
$ oc patch --type=merge --patch '{"spec": {"featureSet": "TechPreviewNoUpgrade"}}' featuregate/cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
featuregate.config.openshift.io/cluster patched
featuregate.config.openshift.io/cluster patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令确认启用了
OVNObservability
功能:oc get featuregate cluster -o yaml
$ oc get featuregate cluster -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
featureGates: # ... enabled: - name: OVNObservability
featureGates: # ... enabled: - name: OVNObservability
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令,获取命名空间中的 pod 列表,在其中创建了其中一个相关网络 API。请注意 pod 的
NODE
名称,因为以下步骤中使用它们。oc get pods -n <namespace> -o wide
$ oc get pods -n <namespace> -o wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES destination-pod 1/1 Running 0 53s 10.131.0.23 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none> source-pod 1/1 Running 0 56s 10.131.0.22 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none>
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES destination-pod 1/1 Running 0 53s 10.131.0.23 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none> source-pod 1/1 Running 0 56s 10.131.0.22 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令获取 OVN-Kubernetes pod 列表,并找到共享与上一步中的 pod 相同的
NODE
的 pod:oc get pods -n openshift-ovn-kubernetes -o wide
$ oc get pods -n openshift-ovn-kubernetes -o wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME ... READY STATUS RESTARTS AGE IP NODE NOMINATED NODE ovnkube-node-jzn5b 8/8 Running 1 (34m ago) 37m 10.0.128.2 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> ...
NAME ... READY STATUS RESTARTS AGE IP NODE NOMINATED NODE ovnkube-node-jzn5b 8/8 Running 1 (34m ago) 37m 10.0.128.2 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在
ovnkube-node
pod 中打开 bash shell:oc exec -it <pod_name> -n openshift-ovn-kubernetes -- bash
$ oc exec -it <pod_name> -n openshift-ovn-kubernetes -- bash
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ovnkube-node
pod 中,您可以运行ovnkube-observ -add-ovs-collector
脚本来显示使用 OVS 收集器的网络事件。例如:/usr/bin/ovnkube-observ -add-ovs-collector
# /usr/bin/ovnkube-observ -add-ovs-collector
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以通过带有
-filter-src-ip
标志和 pod 的 IP 地址输入以下命令来根据类型(如源 pod)过滤内容。例如:/usr/bin/ovnkube-observ -add-ovs-collector -filter-src-ip <pod_ip_address>
# /usr/bin/ovnkube-observ -add-ovs-collector -filter-src-ip <pod_ip_address>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关可以使用
/usr/bin/ovnkube-observ
传递的标记的完整列表,请参阅 "OVN-Kubernetes 网络流量带有 OVS sampling 标记"。
3.7.1. 使用 OVS 抽样标记的 OVN-Kubernetes 网络流量 复制链接链接已复制到粘贴板!
以下标记可用于使用 CLI 查看 OVN-Kubernetes 网络流量。在 ovnkube-node
pod 中打开 bash shell 后,将这些标记附加到终端中的以下语法中:
命令语法
/usr/bin/ovnkube-observ <flag>
# /usr/bin/ovnkube-observ <flag>
标记 | 描述 |
---|---|
|
返回可用于 |
| 添加 OVS 收集器以启用抽样。请谨慎使用。确保其他人没有使用可观察性。 |
|
通过 NBDB 数据丰富样本。默认值为 |
| 仅将数据包过滤到给定目标 IP。 |
| 仅过滤来自给定源 IP 的数据包。 |
| 使用 psample group_id 打印原始示例 Cookie。 |
| 将示例写入的输出文件。 |
| 打印完整接收的数据包.为 false 时,每个示例仅打印源和目标 IP。 |
第 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-plane
pod 复制二进制文件: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-trace
Copy 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-trace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,显示
ovnkube-trace
可用的选项:./ovnkube-trace -help
$ ./ovnkube-trace -help
Copy 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=80
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出在
openshift-dns
命名空间中运行的 pod:oc get pods -n openshift-dns
oc get pods -n openshift-dns
Copy 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&dst
pod 在同一节点上放置时的输出示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow src&dst
pod 放置到另一个节点上时的输出示例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.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
networkpolicy.networking.k8s.io/deny-by-default created
networkpolicy.networking.k8s.io/deny-by-default created
Copy 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=80
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
prod
命名空间:oc create namespace prod
$ oc create namespace prod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来标记
prod
命名空间:oc label namespace/prod purpose=production
$ oc label namespace/prod purpose=production
Copy 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 -- sh
Copy 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 web
Copy 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.yaml
Copy 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.default
Copy 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>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 其中
file
指定您创建的 YAML 文件的名称。
输出示例
network.config.openshift.io/cluster patched
network.config.openshift.io/cluster patched
Copy 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>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <file>
指定创建的 YAML 文件的名称。
输出示例
infrastructure/cluster patched
infrastructure/cluster patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在 CLI 中输入以下命令来显示集群网络配置:
oc describe network
$ oc describe network
Copy 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 infrastructure
Copy 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.io
Copy 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 patched
Copy 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 patched
Copy 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
spec 设置为 true
,对于共享模式将 false
设置为 false。
在本地网关模式中,流量通过主机路由,因此应用于主机的路由表。在共享网关模式中,流量不会通过主机路由。相反,Open vSwitch (OVS) 流量直接将流量输出到节点 IP 接口。
7.1. 设置本地和共享网关模式 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 Cluster Network Operator 中的 gatewayConfig
spec 配置网关模式。以下流程可用于将本地模式的 routingViaHost
字段设置为 true
,对于共享模式,使用 false
。
如果需要主机网络作为与 OVN-Kubernetes 相关的流量的路由器,按照可选步骤 4 启用 IP 转发和本地网关模式。例如,将本地网关模式与 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.yaml
Copy 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 运行以下命令验证本地网关模式是否已设置:
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
会设置本地网关模式,值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 运行以下命令,验证
ipForwarding
spec 是否已设置为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>.yaml
Copy 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 created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要确认已创建了基于 admin 策略的外部路由,请输入以下命令:
oc describe apbexternalroute <name> | tail -n 6
$ oc describe apbexternalroute <name> | tail -n 6
Copy 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。
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. 平台支持 复制链接链接已复制到粘贴板!
下表概述了对不同平台中的出口 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 | 是 |
在 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 地址。这也支持 OpenShift SDN 和 OVN-Kubernetes,这是 OpenShift Container Platform 4.19 中的 Red Hat OpenShift Networking 中的默认网络插件。
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 的注意事项 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,出口 IP 为管理员提供了一种控制网络流量的方法。Egress 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 的要求
对于希望出口 IP 和流量通过不是主网络接口的特定接口路由的用户,必须满足以下条件:
- OpenShift Container Platform 安装在裸机集群中。此功能在云或 hypervisor 环境中被禁用。
- 您的 OpenShift Container Platform pod 没有配置为 host-networked。
- 如果删除了网络接口,或者 IP 地址和子网掩码允许删除在接口上托管的出口 IP,则会重新配置出口 IP。因此,egress IP 可以分配给另一个节点和接口。
- 如果您在辅助网络接口卡(NIC)上使用 Egress IP 地址,则必须使用 Node Tuning Operator 在二级 NIC 上启用 IP 转发。
9.1.4. 将出口 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 地址的节点。
9.1.5. 将出口 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.1.6. 出口 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
。这两个节点之间流量大致平衡。
图中的以下资源被详细描述:
命名空间
对象命名空间在以下清单中定义:
命名空间对象
Copy to Clipboard Copied! Toggle word wrap Toggle overflow EgressIP
对象以下
EgressIP
对象描述了一个配置,该配置选择将env
标签设置为prod
的任意命名空间中的所有 pod。所选 pod 的出口 IP 地址为192.168.126.10
和192.168.126.102
。EgressIP
对象Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于上例中的配置,OpenShift Container Platform 会为可用节点分配两个出口 IP 地址。
status
字段显示是否以及在哪里分配了出口 IP 地址。
9.2. EgressIP 对象 复制链接链接已复制到粘贴板!
以下 YAML 描述了 EgressIP
对象的 API。对象有效的范围为集群,它不是在命名空间中创建的。
以下 YAML 描述了命名空间选择器的小节:
命名空间选择器小节
namespaceSelector: matchLabels: <label_name>: <label_value>
namespaceSelector:
matchLabels:
<label_name>: <label_value>
- 1
- 命名空间的一个或多个匹配规则。如果提供多个匹配规则,则会选择所有匹配的命名空间。
以下 YAML 描述了 pod 选择器的可选小节:
Pod 选择器片段
podSelector: matchLabels: <label_name>: <label_value>
podSelector:
matchLabels:
<label_name>: <label_value>
- 1
- 可选:与指定
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. egressIPConfig 对象 复制链接链接已复制到粘贴板!
作为出口 IP 的功能,reachabilityTotalTimeoutSeconds
参数配置 EgressIP 节点可访问性检查总超时时间(以秒为单位)。如果在这个超时时间内无法访问 EgressIP 节点,则会声明该节点。
您可以在配置文件中为 egressIPConfig
对象设置 reachabilityTotalTimeoutSeconds
的值。设置较大的值可能会导致 EgressIP 实现对节点更改做出反应的速度较慢。对于有问题的 EgressIP 节点,这个实现的反应会较慢。
如果您从 egressIPConfig
对象中省略了 reachabilityTotalTimeoutSeconds
参数,则平台会选择一个合理的默认值,这可能会随时间变化。当前的默认值为 1
秒。0
代表禁用 EgressIP 节点的访问性检查。
以下 egressIPConfig
对象描述了将 reachabilityTotalTimeoutSeconds
从默认的 1
秒探测改为 5
秒探测:
9.4. 标记节点以托管出口 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.5. 后续步骤 复制链接链接已复制到粘贴板!
第 10 章 分配出口 IP 地址 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为从一个命名空间中,或从一个命名空间内的特定 pod 中离开集群的网络流量分配一个出口 IP 地址。
10.1. 为一个命名空间分配出口 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>.yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<egressips_name>
替换为对象的名称。
输出示例
egressips.k8s.ovn.org/<egressips_name> created
egressips.k8s.ovn.org/<egressips_name> created
Copy 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=qa
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<namespace>
替换为需要出口 IP 地址的命名空间。
验证
要显示集群中所有正在使用的出口 IP,请输入以下命令:
oc get egressip -o yaml
$ oc get egressip -o yaml
Copy 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
第 11 章 配置出口服务 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 egress 服务为负载均衡器服务后面的 pod 配置出口流量。
出口服务只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
您可以使用以下方法使用 EgressService
自定义资源(CR)管理出口流量:
将负载均衡器服务 IP 地址分配为负载均衡器服务后面的 pod 的源 IP 地址。
将负载均衡器 IP 地址分配在这个上下文中的源 IP 地址对于显示单个出口和入口点很有用。例如,在某些情况下,与负载均衡器服务后面的应用程序通信的外部系统可能会预期应用程序的源和目标 IP 地址相同。
注意当您将负载均衡器服务 IP 地址分配给服务后面的 pod 的出口流量时,OVN-Kubernetes 会将入口和出口点限制为单一节点。这限制了 MetalLB 通常提供的流量的负载均衡。
将负载均衡器后面的 pod 的出口流量分配给与默认节点网络不同的网络。
这可用于将负载均衡器后面的应用程序的出口流量分配给与默认网络不同的网络。通常,不同的网络通过使用与网络接口关联的 VRF 实例来实施。
11.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-id
ID 匹配。如果没有network
规格,egress 服务将使用默认主机网络。
出口服务规格示例
11.2. 部署出口服务 复制链接链接已复制到粘贴板!
您可以部署出口服务,以管理 LoadBalancer
服务后面的 pod 的出口流量。
以下示例将出口流量配置为具有与 LoadBalancer
服务的入口 IP 地址相同的源 IP 地址。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 -
已配置了 MetalLB
BGPPeer
资源。
流程
为服务创建一个带有所需 IP 的
IPAddressPool
CR:创建一个文件,如
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.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建
Service
和EgressService
CR:创建一个文件,如
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.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建
BGPAdvertisement
CR 来公告服务:创建一个文件,如
service-bgp-advertisement.yaml
,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 在本例中,
EgressService
CR 将出口流量的源 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
等工具分析外部客户端接收的数据包来验证此配置。
第 12 章 使用出口路由器 pod 的注意事项 复制链接链接已复制到粘贴板!
12.1. 关于出口路由器 pod 复制链接链接已复制到粘贴板!
OpenShift Container Platform 出口路由器(egress router ) pod 使用一个来自专用的私有源 IP 地址,将网络流量重定向到指定的远程服务器。出口路由器 pod 可以将网络流量发送到设置为仅允许从特定 IP 地址访问的服务器。
出口路由器 pod 并不适用于所有外向的连接。创建大量出口路由器 pod 可能会超过您的网络硬件的限制。例如,为每个项目或应用程序创建出口路由器 pod 可能会导致,在转换为使用软件来进行 MAC 地址过滤前超过了网络接口可以处理的本地 MAC 地址的数量。
出口路由器镜像与 Amazon AWS、Azure Cloud 或其他不支持第 2 层操作的云平台不兼容,因为它们与 macvlan 流量不兼容。
12.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 代理模式。
12.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 会删除上列表中与出口路由器关联的两个对象。
12.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 默认设置。
具体来说,请确保启用了以下功能:
12.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>
命令或创建类似以下示例的文件:
第 13 章 以重定向模式部署出口路由器 pod 复制链接链接已复制到粘贴板!
作为集群管理员,您可以部署出口路由器 Pod,将流量重新指向来自保留源 IP 地址的指定目标 IP 地址。
出口路由器实施使用出口路由器 Container Network Interface(CNI)插件。
13.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 地址。如果没有指定此字段,出口路由器会拒绝与规则中没有定义的网络端口的连接。
出口路由器规格示例
13.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-nad
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 网络附加定义的名称不可配置。
输出示例
NAME AGE egress-router-cni-nad 18m
NAME AGE egress-router-cni-nad 18m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看出口路由器 pod 的部署:
oc get deployment egress-router-cni-deployment
$ oc get deployment egress-router-cni-deployment
Copy 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 18m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看出口路由器 pod 的状态:
oc get pods -l app=egress-router-cni
$ oc get pods -l app=egress-router-cni
Copy 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 18m
Copy 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_NODENAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
/host
设为 debug shell 中的根目录。debug pod 在 pod 中的/host
中挂载主机 的 root 文件系统。将根目录改为/host
,您可以从主机的可执行路径中运行二进制文件:chroot /host
# chroot /host
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
chroot
环境控制台中显示出口路由器日志:cat /tmp/egress-router-log
# cat /tmp/egress-router-log
Copy 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 bac9fae69ddb6
Copy 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
68857
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入容器的网络命名空间:
nsenter -n -t 68857
# nsenter -n -t 68857
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示路由表:
ip route
# ip route
Copy 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 net1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 14 章 为项目启用多播 复制链接链接已复制到粘贴板!
14.1. 关于多播 复制链接链接已复制到粘贴板!
通过使用 IP 多播,数据可同时广播到许多 IP 地址。
- 目前,多播最适用于低带宽协调或服务发现。它不是一个高带宽解决方案。
-
默认情况下,网络策略会影响命名空间中的所有连接。但是,多播不受网络策略的影响。如果在与网络策略相同的命名空间中启用了多播,则始终允许多播,即使有一个
deny-all
网络策略。在启用网络策略前,集群管理员应考虑对多播的影响。
默认情况下,OpenShift Container Platform pod 之间多播流量被禁用。如果使用 OVN-Kubernetes 网络插件,可以根据每个项目启用多播。
14.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=true
Copy 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:hostname
Copy 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
mlistener
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 15 章 为项目禁用多播 复制链接链接已复制到粘贴板!
15.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
第 16 章 跟踪网络流 复制链接链接已复制到粘贴板!
作为集群管理员,您可以从集群中收集有关 pod 网络流的信息,以帮助以下区域:
- 监控 pod 网络上的入口和出口流量。
- 对性能问题进行故障排除。
- 为容量规划和安全审计收集数据。
当您启用网络流的集合时,只会收集与流量相关的元数据。例如,不会收集实际的数据包数据,而是只收集协议、源地址、目标地址、端口号、字节数和其他数据包级别的信息。
数据采用以下一种或多种记录格式收集:
- NetFlow
- sFlow
- IPFIX
当您使用一个或多个收集器 IP 地址和端口号配置 Cluster Network Operator(CNO)时,Operator 会在每个节点上配置 Open vSwitch(OVS),以将网络流记录发送到每个收集器。
您可以将 Operator 配置为将记录发送到多种类型的网络流收集器。例如,您可以将记录发送到 NetFlow 收集器,并将记录发送到 sFlow 收集器。
当 OVS 向收集器发送数据时,每种类型的收集器接收相同的记录。例如,如果您配置两个 NetFlow 收集器,节点上的 OVS 会将相同的记录发送到两个收集器。如果您还配置了两个 sFlow 收集器,则两个 sFlow 收集器将接收相同的记录。但是,每个收集器类型都具有唯一的记录格式。
收集网络流数据并将记录发送到收集器会影响性能。节点处理数据包的速度较慢。如果性能影响太大,您可以删除收集器的目的地,以禁用收集网络流数据并恢复性能。
启用网络流收集器可能会影响集群网络的整体性能。
16.1. 用于跟踪网络流的网络对象配置 复制链接链接已复制到粘贴板!
下表显示了在 Cluster Network Operator(CNO)中配置网络流收集器的字段:
字段 | 类型 | 描述 |
---|---|---|
|
|
CNO 对象的名称。这个名称始终是 |
|
|
一个或多个 |
|
| 最多 10 个收集器的 IP 地址和网络端口对列表。 |
|
| 最多 10 个收集器的 IP 地址和网络端口对列表。 |
|
| 最多 10 个收集器的 IP 地址和网络端口对列表。 |
将以下清单应用到 CNO 后,Operator 会在集群中的每个节点上配置 Open vSwitch(OVS),将网络流记录发送到侦听 192.168.1.99:2056
的 NetFlow 收集器。
跟踪网络流的配置示例
16.2. 为网络流收集器添加目的地 复制链接链接已复制到粘贴板!
作为集群管理器,您可以将 Cluster Network Operator(CNO)配置为发送有关 pod 网络的网络流元数据到网络流收集器。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您有一个网络流收集器,知道它所侦听的 IP 地址和端口。
流程
创建补丁文件,用于指定网络流收集器类型以及收集器的 IP 地址和端口信息:
spec: exportNetworkFlows: netFlow: collectors: - 192.168.1.99:2056
spec: exportNetworkFlows: netFlow: collectors: - 192.168.1.99:2056
Copy 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 patched
Copy 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
16.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 patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 17 章 配置混合联网 复制链接链接已复制到粘贴板!
作为集群管理员,您可以配置 Red Hat OpenShift Networking OVN-Kubernetes 网络插件,以允许 Linux 和 Windows 节点分别托管 Linux 和 Windows 工作负载。
17.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 的连接性。注意Windows Server Long-Term Servicing Channel(LTSC):Windows Server 2019 在带有自定义
hybridOverlayVXLANPort
值的集群中不被支持,因为这个 Windows server 版本不支持选择使用自定义的 VXLAN 端口。
输出示例
network.operator.openshift.io/cluster patched
network.operator.openshift.io/cluster patched
Copy 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.