Kubernetes NMState
在 OpenShift Container Platform 中使用 Kubernetes NMState 观察和更新节点网络状态和配置
摘要
第 1 章 观察和更新节点网络状态和配置 复制链接链接已复制到粘贴板!
安装 Kubernetes NMState Operator 后,您可以使用 Operator 观察和更新集群的节点网络状态和网络配置。
有关如何安装 NMState Operator 的更多信息,请参阅 Kubernetes NMState Operator。
您无法提供修改 br-ex 网桥的任何配置,即 OVN-Kubernetes 管理的 Open vSwitch 网桥。但是,您可以配置自定义 br-ex 网桥。
如需更多信息,请参阅在裸机中部署安装程序置备的集群文档或在裸机中安装用户置备的集群 文档中的"创建包括自定义 br-ex 网桥的清单对象"。
1.1. 使用 CLI 查看节点的网络状态 复制链接链接已复制到粘贴板!
节点网络状态是集群中所有节点的网络配置。一个 NodeNetworkState
对象存在于集群中的每个节点上。此对象定期更新,并捕获该节点的网络状态。
先决条件
-
已安装 OpenShift CLI(
oc
)。
流程
列出集群中的所有
NodeNetworkState
对象:oc get nns
$ oc get nns
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
NodeNetworkState
对象以查看该节点上的网络。为了清楚,这个示例中的输出已被重新编辑:oc get nns node01 -o yaml
$ oc get nns node01 -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.2. 从 web 控制台查看节点(NNS)拓扑的网络状态的图形表示 复制链接链接已复制到粘贴板!
为了便于在集群中配置节点网络,您可以以图的形式查看它。NNS 拓扑图显示所有节点组件(网络接口控制器、网桥、绑定和 VLAN)、其属性和配置,以及节点之间的连接。
要打开集群的拓扑视图,请使用以下步骤:
在 OpenShift Container Platform Web 控制台的 Administrator 视图中,导航到 Networking → Node Network Configuration。
此时会打开 NNS 拓扑图。每组组件代表一个节点。
- 要显示节点的配置和属性,请单击节点的边框内。
- 要显示特定组件的功能或 YAML 文件(如接口或桥接),点组件的图标。
- 活跃组件的图标具有绿色的边框;断开连接的组件的图标具有红色边框。
1.3. 查看 NodeNetworkState 资源列表 复制链接链接已复制到粘贴板!
作为管理员,您可以使用 OpenShift Container Platform Web 控制台查看 NodeNetworkState
资源和网络接口列表,以及访问网络详情。
流程
- 导航到 Networking → Node Network Configuration。
单击 List 图标。
现在,您可以查看
NodeNetworkState
资源列表以及节点上创建的对应接口。-
您可以基于接口状态, 接口类型, 和 IP 进行过滤,或者使用基于条件名称或标签的搜索栏来缩小显示的
NodeNetworkState
资源范围。 -
要访问
NodeNetworkState
资源的详细信息,请点 Name 列中列出的NodeNetworkState
资源名称。 -
要展开并查看
NodeNetworkState
资源的 Network Details 部分,点大于符号(>)。或者,您也可以点 Network interface 列下的每个接口类型来查看网络详情。
-
您可以基于接口状态, 接口类型, 和 IP 进行过滤,或者使用基于条件名称或标签的搜索栏来缩小显示的
1.4. NodeNetworkConfigurationPolicy 清单文件 复制链接链接已复制到粘贴板!
NodeNetworkConfigurationPolicy
(NNCP)清单文件定义 Kubernetes NMState Operator 用来为 OpenShift Container Platform 集群中存在的节点配置网络的策略。
如果要将多个 NNCP CR 应用到节点,您必须按照策略名称字母排序的逻辑顺序创建 NNCP。Kubernetes NMState Operator 持续检查新创建的 NNCP CR,以便 Operator 可立即将 CR 应用到节点。请考虑以下逻辑顺序问题示例:
-
您可以创建 NNCP 1 来定义侦听 VLAN 端口的网桥接口,如
eth1.1000
。 -
您可以创建 NNCP 2 来定义 VLAN 接口并为此接口指定端口,如
eth1.1000
。 - 在将 NNCP 2 应用到节点前,请应用 NNCP 1。
节点会遇到节点连接问题,因为端口 eth1.1000
不存在。因此,集群会失败。
将节点网络策略应用到节点后,Kubernetes NMState Operator 根据节点网络策略详情配置节点的网络配置。
以下接口名称列表被保留,您不能使用带有 NMstate 配置的名称:
-
br-ext
-
br-int
-
br-local
-
br-nexthop
-
br0
-
ext-vxlan
-
ext
-
genev_sys_*
-
int
-
k8s-*
-
ovn-k8s-*
-
patch-br-*
-
tun0
-
vxlan_sys_*
您可以使用 OpenShift CLI (oc
)或 OpenShift Container Platform Web 控制台创建 NNCP。作为安装后任务,您可以创建 NNCP 或编辑现有的 NNCP。
在创建 NNCP 之前,请确保读取"示例不同接口的策略配置"文档。
如果要删除 NNCP,您可以使用 oc delete nncp
命令完成此操作。但是,此命令不会删除任何对象,如网桥接口。
删除向节点添加接口的节点网络策略不会更改节点上的策略配置。同样,删除接口不会删除策略,因为 Kubernetes NMState Operator 会在 pod 或节点重启时重新添加删除的接口。
要有效地删除 NNCP、节点网络策略和任何接口通常需要以下操作:
-
编辑 NNCP 并从文件中删除接口详情。确保您没有从文件中删除
name
,state
, 和type
参数。 -
在 NNCP 的
interfaces.state
部分下添加state: absent
。 -
运行
oc apply -f <nncp_file_name>
。在 Kubernetes NMState Operator 将节点网络策略应用到集群中的每个节点后,每个节点中存在的任何接口现在都会标记为 absent。 -
运行
oc delete nncp
以删除 NNCP。
1.6. 从 Web 控制台管理策略 复制链接链接已复制到粘贴板!
您可以通过将 NodeNetworkConfigurationPolicy
清单应用到集群来更新节点网络的配置,如为节点添加或删除接口。通过访问 Networking 菜单下的 NodeNetworkConfigurationPolicy 页面中创建的策略列表,从 web 控制台管理策略。通过此页面,您可以创建、更新、监控和删除策略。
1.6.1. 监控策略状态 复制链接链接已复制到粘贴板!
您可以在 NodeNetworkConfigurationPolicy 页面中监控策略状态。本页以表格格式显示集群中创建的所有策略,其列如下:
- Name
- 创建的策略的名称。
- 匹配的节点
- 应用策略的节点计数。这可能是基于节点选择器或集群中的所有节点的节点子集。
- 节点网络状态
- 匹配节点的 Enactment 状态。您可以点 enactment 状态并查看状态的详细信息。
要查找所需的策略,您可以使用 Filter 选项或搜索选项根据 enactment 状态过滤列表。
1.6.2. 创建策略 复制链接链接已复制到粘贴板!
您可以使用 web 控制台中的表单或 YAML 创建策略。当使用表单创建策略时,您可以看到新策略如何实时更改集群中的节点拓扑。
流程
- 导航到 Networking → Node Network Configuration。
在 Node Network Configuration 页面上,点 Create 并选择 From Form 选项。
注意要使用 YAML 创建策略,请点击 Create → With YAML 选项。但是,以下步骤只适用于表单方法。
- 可选:选择 Apply this NodeNetworkConfigurationPolicy only to specific subsets of nodes using the node selector 复选框,以指定必须应用策略的节点。
- 在 Policy name 字段中输入策略名称。
- 可选:在 Description 字段中输入策略的描述。
- 点 Next 进入 Policy Interfaces 部分。
在 Policy Interfaces 部分的 Bridging 部分中,默认添加名为
br0
的网桥接口,并在可编辑的字段中使用预设置值。如果需要,执行以下步骤来编辑值:- 在 Interface name 字段中输入接口名称。
- 选择所需的网络状态。默认选择的状态为 Up。
选择接口类型。可用的类型是 Bridge、绑定 和 Ethernet。默认选择的值是 Bridge。
注意不支持使用表单添加 VLAN 接口。要添加 VLAN 接口,您必须使用 YAML 来创建策略。添加后,您无法使用表单编辑策略。
可选: 在 IP 配置部分中,选中 IPv4 复选框,为接口分配 IPv4 地址,并配置 IP 地址分配详情:
- 点IP 地址,将接口配置为使用静态 IP 地址;或点 DHCP 将接口配置为自动分配 IP 地址。
如果您选择了 IP 地址 选项,在 IPV4 address 字段中输入 IPv4 地址,并在 Prefix length 字段中输入前缀长度。
如果您选择了 DHCP 选项,请取消选择您要禁用的选项。可用选项包括 Auto-DNS、Auto-routes 和 Auto-gateway。所有选项都被默认选择。
- 可选:在 Port 字段中输入端口号。
- 可选: 选中启用 STP复选框以启用 STP。
- 可选: 要为策略添加一个接口,点 Add another interface to the policy。
- 可选: 要从策略中删除接口,请点击接口旁的 图标。
注意或者,您可以点页面顶部的 Edit YAML 继续使用 YAML 编辑表单。
- 点 Next 进入表单的 Review 部分。
- 验证设置并点 Create 创建策略。
1.7. 更新策略 复制链接链接已复制到粘贴板!
1.7.1. 使用表单更新策略 复制链接链接已复制到粘贴板!
流程
- 进入到 Networking → NodeNetworkConfigurationPolicy。
-
在 NodeNetworkConfigurationPolicy 页面中,点您要编辑的策略旁的
图标,然后点 Edit。
- 编辑您要更新的字段。
- 点击 Save。
不支持使用表单添加 VLAN 接口。要添加 VLAN 接口,您必须使用 YAML 来创建策略。添加后,您无法使用表单编辑策略。
1.7.2. 使用 YAML 更新策略 复制链接链接已复制到粘贴板!
流程
- 进入到 Networking → NodeNetworkConfigurationPolicy。
- 在 NodeNetworkConfigurationPolicy 页面中,点您要编辑的策略的 Name 列下的策略名称。
- 点 YAML 选项卡,并编辑 YAML。
- 点击 Save。
1.7.3. 删除策略 复制链接链接已复制到粘贴板!
流程
- 进入到 Networking → NodeNetworkConfigurationPolicy。
-
在 NodeNetworkConfigurationPolicy 页面中,点击您要删除的策略旁的
图标,然后点 Delete。
- 在弹出窗口中,输入策略名称以确认删除,然后点 Delete。
1.8. 使用 CLI 管理策略 复制链接链接已复制到粘贴板!
1.8.1. 在节点上创建接口 复制链接链接已复制到粘贴板!
通过将一个 NodeNetworkConfigurationPolicy
(NNCP)清单应用到集群来在集群的节点上创建一个接口。清单详细列出了请求的接口配置。
默认情况下,清单会应用到集群中的所有节点。要将接口只添加到特定的节点,在节点选择器上添加 spec: nodeSelector
参数和适当的 <key>:<value>
。
您可以同时配置多个支持 nmstate 节点。该配置适用于并行节点的 50%。如果网络连接失败,此策略可防止整个集群不可用。要将策略配置并行应用到集群的特定部分,请使用 NodeNetworkConfigurationPolicy
清单配置文件中的 maxUnavailable
参数。
如果您有两个节点,并且应用将 maxUnavailable
参数设置为 50%
的 NNCP 清单,则一次一个节点会接收 NNCP 配置。如果您引入一个额外的 NNCP 清单文件,其 maxUnavailable
参数设置为 50%,
则这个 NCCP 独立于初始 NNCP。这意味着,如果 NNCP 清单对节点应用错误配置,则您无法保证集群有一半的功能。
先决条件
-
已安装 OpenShift CLI(
oc
)。
流程
创建
NodeNetworkConfigurationPolicy
清单。以下示例在所有 worker 节点上配置了一个 Linux 桥接并配置 DNS 解析器:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建节点网络策略:
oc apply -f br1-eth1-policy.yaml
$ oc apply -f br1-eth1-policy.yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 节点网络配置策略清单的文件名。
1.10. 不同接口的策略配置示例 复制链接链接已复制到粘贴板!
在读取不同示例 NodeNetworkConfigurationPolicy
(NNCP) 清单配置前,当您将策略应用到节点时请考虑以下因素,以便集群在其最佳性能条件下运行:
- 如果要将多个 NNCP CR 应用到节点,您必须按照策略名称字母排序的逻辑顺序创建 NNCP。Kubernetes NMState Operator 持续检查新创建的 NNCP CR,以便 Operator 可立即将 CR 应用到节点。
-
当您需要将策略应用到多个节点时,但只想为所有目标节点创建一个 NNCP,Kubernetes NMState Operator 会按顺序将策略应用到每个节点。您可以使用集群配置中的
maxUnavailable
参数为目标节点设置策略应用程序的速度和覆盖范围。通过为参数设置一个较低的百分比值,您可以在中断只会影响接收策略应用程序的一小部分节点时,降低出现集群范围中断的风险。 -
如果您在两个 NNCP 清单中将
maxUnavailable
参数设置为 50%,策略配置覆盖会应用到集群中的 100% 节点。 - 当节点重启时,Kubernetes NMState Operator 无法控制它将策略应用到节点的顺序。Kubernetes NMState Operator 可能会按顺序应用相互独立的策略,这会导致网络对象降级。
- 考虑在单个策略中指定所有相关网络配置。
1.10.1. 示例:以太网接口节点网络配置策略 复制链接链接已复制到粘贴板!
通过将 NodeNetworkConfigurationPolicy
清单应用到集群,在集群的节点上配置以太网接口。
以下 YAML 文件是一个以太接口的清单示例。它包含了示例值,需要使用自己的信息替换。
1.10.2. 示例: Linux bridge interface 节点网络配置策略 复制链接链接已复制到粘贴板!
通过将一个 NodeNetworkConfigurationPolicy
清单应用到集群来在集群的节点上创建一个 Linux 网桥接口。
以下 YAML 文件是 Linux 网桥界面的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。
1.10.3. 示例:VLAN 接口节点网络配置策略 复制链接链接已复制到粘贴板!
通过将一个 NodeNetworkConfigurationPolicy
清单应用到集群来在集群的节点上创建一个 VLAN 接口。
在单个 NodeNetworkConfigurationPolicy
清单中为节点的 VLAN 接口定义所有相关配置。例如,在同一 NodeNetworkConfigurationPolicy
清单中为节点定义 VLAN 接口和相关路由。
当节点重启时,Kubernetes NMState Operator 无法控制应用策略的顺序。因此,如果您将单独的策略用于相关的网络配置,Kubernetes NMState Operator 可能会按顺序应用这些策略,从而导致网络对象降级。
以下 YAML 文件是 VLAN 接口的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。
1.10.4. 示例:绑定接口节点网络配置策略 复制链接链接已复制到粘贴板!
通过将一个 NodeNetworkConfigurationPolicy
清单应用到集群来在集群的节点上创建一个绑定接口。
OpenShift Container Platform 只支持以下绑定模式:
-
active-backup
-
balance-xor
-
802.3ad
不支持其他绑定模式。
balance-xor
和 802.3ad
绑定模式需要切换配置来建立"EtherChannel"或类似的端口分组。这两个模式还需要额外的负载均衡配置,具体取决于通过接口传递的流量的来源和目的地。active-backup
绑定模式不需要任何交换机配置。不支持其他绑定模式。
以下 YAML 文件是绑定接口的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。
- 1
- 策略的名称。
- 2
- 可选: 如果没有包括
nodeSelector
参数,策略会应用到集群中的所有节点。 - 3
- 这个示例使用
hostname
节点选择器。 - 4
- 接口的名称。
- 5
- 可选:接口人类可读的接口描述。
- 6
- 接口的类型。这个示例创建了一个绑定。
- 7
- 创建后接口的请求状态。
- 8
- 可选:如果您不使用
dhcp
,可以设置静态 IP,或让接口没有 IP 地址。 - 9
- 在这个示例中启用
ipv4
。 - 10
- Bond 的驱动模式。这个示例使用
活跃的备份
。 - 11
- 可选:本例使用 miimon 检查每 140ms 的绑定链接。
- 12
- 绑定中的下级节点 NIC。
- 13
- 可选:绑定的最大传输单元(MTU)。如果没有指定,其默认值为
1500
。
1.10.5. 示例:同一节点网络配置策略中的多个接口 复制链接链接已复制到粘贴板!
您可以在相同的节点网络配置策略中创建多个接口。这些接口可以相互引用,允许您使用单个策略清单来构建和部署网络配置。
以下示例 YAML 文件在两个 NIC 和 VLAN 之间创建一个名为 bond10
的绑定,名为 bond10.103
,它连接到绑定。
1.10.6. 示例:虚拟功能的节点网络配置策略 复制链接链接已复制到粘贴板!
通过应用 NodeNetworkConfigurationPolicy
清单,更新现有集群中的单根 I/O 虚拟化 (SR-IOV) 网络功能 (VF) 的主机网络设置。
您可以将 NodeNetworkConfigurationPolicy
清单应用到现有集群,以完成以下任务:
- 为 VF 配置 QoS 主机网络设置以优化性能。
- 为网络接口添加、删除或更新 VF。
- 管理 VF 绑定配置。
要在也通过 SR-IOV Network Operator 管理的物理功能上使用 NMState 更新 SR-IOV VF 的主机网络设置,您必须将相关 SriovNetworkNodePolicy
资源中的 externallyManaged
参数设置为 true
。如需更多信息,请参阅附加资源部分。
以下 YAML 文件是一个清单示例,它为 VF 定义 QoS 策略。此 YAML 包含示例值,您必须替换为您自己的信息。
以下 YAML 文件是为网络接口添加 VF 的清单示例。
在这一示例配置中,ens1f1v0
VF 在 ens1f1
物理接口创建,此 VF 被添加到绑定网络接口 bond0
中。该绑定使用 active-backup
模式来实现冗余。在本例中,VF 被配置为使用硬件卸载来直接在物理接口上管理 VLAN。
- 1
- 策略的名称。
- 2
- 可选: 如果没有包括
nodeSelector
参数,策略会应用到集群中的所有节点。 - 3
- 这个示例适用于具有
worker
角色的所有节点。 - 4
- VF 网络接口的名称。
- 5
- 要创建的 VF 数量。
- 6
- 设置以允许活跃和备份 VF 之间的故障转移绑定。
- 7
- VLAN 的 ID。这个示例使用硬卸载在 VF 上直接定义 VLAN。
- 8
- 绑定网络接口的名称。
- 9
- 可选:接口人类可读的接口描述。
- 10
- 接口的类型。
- 11
- 配置后接口的请求状态。
- 12
- 绑定的绑定策略。
- 13
- 主附加绑定端口。
- 14
- 绑定网络接口的端口。
- 15
- 在本例中,VLAN 网络接口作为额外接口添加到绑定网络接口。
1.10.7. 示例:带有 VRF 实例网络配置策略的网络接口 复制链接链接已复制到粘贴板!
通过应用 NodeNetworkConfigurationPolicy
自定义资源(CR)将虚拟路由和转发(VRF)实例与网络接口关联。
通过将 VRF 实例与网络接口关联,您可以支持流量隔离、独立路由决策和网络资源的逻辑分离。
在配置 Virtual Route Forwarding (VRF)时,您必须将 VRF 值改为小于 1000
的表 ID,因为 OpenShift Container Platform 保留大于 1000
的值。
在裸机环境中,您可以使用 MetalLB 通过属于 VRF 实例的接口宣布负载均衡器服务。如需更多信息,请参阅附加资源部分。
以下 YAML 文件是一个将 VRF 实例与网络接口关联的示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。
1.11. 在节点上通过 InfiniBand 接口创建 IP 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform web 控制台中,您可以安装红帽认证的第三方 Operator,如 NVIDIA Network Operator,它支持 InfiniBand (IPoIB) 模式。通常,您可以将第三方 Operator 与其他供应商基础架构搭配使用,以管理 OpenShift Container Platform 集群中的资源。要在集群中的节点上创建 IPoIB 接口,您必须在 NodeNetworkConfigurationPolicy
(NNCP) 清单文件中定义 InfiniBand (IPoIB) 接口。
OpenShift Container Platform 文档只描述了在 NodeNetworkConfigurationPolicy
(NNCP) 清单文件中定义 IPoIB 接口配置。对于大多数配置步骤,您必须参考 NVIDIA 和其他第三方供应商文档。红帽支持不会覆盖 NNCP 配置以外的任何内容。
如需有关 NVIDIA Operator 的更多信息,请参阅 Red Hat OpenShift (NVIDIA Docs Hub)入门。
先决条件
- 已安装支持 IPoIB 接口的红帽认证的第三方 Operator。
-
已安装 OpenShift CLI(
oc
)。
流程
创建或编辑
NodeNetworkConfigurationPolicy
(NNCP)清单文件,然后在文件中指定 IPoIB 接口。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
datagram
是 IPoIB 接口的默认模式,这个模式改进了性能和延迟。connected
模式是一个受支持的模式,但只在需要调整最大传输单元(MTU)值时考虑使用这个模式,以提高与周围的网络设备的节点连接。- 2
- 支持字符串或整数值。参数定义保护密钥或 P-key,用于身份验证和与第三方供应商(如 NVIDIA)的加密通信。值
None
和0xffff
代表 InfiniBand 系统中基本接口的保护密钥。 - 3
- 支持的值包括
name
、默认值和mac-address
。name
值将配置应用到包含指定接口名称的接口。 - 4
- 保存接口的 MAC 地址。对于 IP-over-InfiniBand (IPoIB)接口,地址为 20 字节字符串。
- 5
- 将接口类型设置为
infiniband
。
运行以下命令,将 NNCP 配置应用到集群中的每个节点。然后,Kubernetes NMState Operator 可以在每个节点上创建一个 IPoIB 接口。
$ oc apply -f <nncp_file_name>
$ oc apply -f <nncp_file_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<nncp_file_name>
替换为 NNCP 文件的名称。
1.12. 使用动态匹配和模板的策略配置示例 复制链接链接已复制到粘贴板!
以下示例配置片段显示使用动态匹配和模板的节点网络策略。
应用使用动态匹配和模板的节点网络配置策略只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
1.12.1. 示例:Linux 网桥接口节点网络配置策略,用于从附加到网桥的 NIC 中继承静态 IP 地址 复制链接链接已复制到粘贴板!
在集群的节点上创建一个 Linux 网桥接口,并通过将单个 NodeNetworkConfigurationPolicy
清单应用到集群来将 NIC 的静态 IP 配置传输到桥接。
以下 YAML 文件是 Linux 网桥界面的清单示例。它包含了示例值,需要使用自己的信息替换。
1.12.2. 示例:启用 LLDP 报告的节点网络配置策略 复制链接链接已复制到粘贴板!
以下 YAML 文件是一个 NodeNetworkConfigurationPolicy
清单示例,它为 OpenShift Container Platform 集群中的所有以太网端口启用 Link Layer Discovery Protocol (LLDP)监听程序。本地区域网络上的设备可以使用 LLDP 来公告其身份、功能和邻居信息。
1.13. 示例:IP 管理 复制链接链接已复制到粘贴板!
以下配置片段示例演示了不同的 IP 管理方法。
这些示例使用 ethernet
接口类型来简化示例,同时显示 Policy 配置中相关的上下文。这些 IP 管理示例可与其他接口类型一起使用。
1.13.1. Static 复制链接链接已复制到粘贴板!
以下片段在以太网接口中静态配置 IP 地址:
- 1
- 使用接口的静态 IP 地址替换这个值。
1.13.2. 没有 IP 地址 复制链接链接已复制到粘贴板!
以下片段确保接口没有 IP 地址:
当您将 ipv4.enabled
和 ipv6.enabled
参数设置为 false
时,始终将 state
参数设置为 up
,以禁用接口。如果使用此配置设置了 state: down
,接口会因为自动 DHCP 分配而接收 DHCP IP 地址。
1.13.3. 动态主机配置 复制链接链接已复制到粘贴板!
以下片段配置了一个以太网接口,它使用动态 IP 地址、网关地址和 DNS:
以下片段配置了一个以太网接口,它使用动态 IP 地址,但不使用动态网关地址或 DNS:
1.13.4. 介质访问控制(MAC)地址 复制链接链接已复制到粘贴板!
您可以使用 MAC 地址来识别网络接口,而不使用网络接口的名称。网络接口名称可能会因为各种原因而改变,如操作系统配置更改。但是,每个网络接口都有一个不更改的唯一 MAC 地址。这意味着,使用 MAC 地址是更永久地识别特定网络接口的方法。
identifier
参数支持的值包括默认值 和
mac-address
值。name
值将配置应用到包含指定接口名称的接口。
将 mac-address
值用于 标识符
参数表示 MAC 地址是网络接口的标识符。如果将 标识符
值设置为 mac-address
,则必须在以下 mac-address
参数字段中输入特定的 MAC 地址。
您仍然可以为 name
参数指定一个值,但设置 identifier: mac-address
值表示 MAC 地址用作网络接口的主标识符。如果您指定了不正确的 MAC 地址,nmstate
会报告无效的参数错误。
以下片段将 MAC 地址指定为名为 eth1
的以太网设备的主标识符,其 MAC 地址为 8A:8C:92:1A:F6:98
:
1.13.5. DNS 复制链接链接已复制到粘贴板!
默认情况下,nmstate
API 会在全局范围内存储 DNS 值,而不是将其存储在网络接口中。在某些情况下,您必须配置网络接口来存储 DNS 值。
设置一个 DNS 配置与修改 /etc/resolv.conf
文件相当。
要为网络接口定义 DNS 配置,您必须首先在网络接口 YAML 配置文件中指定 dns-resolver
部分。要将 NNCP 配置应用到您的网络接口,您需要运行 oc apply -f <nncp_file_name>
命令。
以下示例显示了全局存储 DNS 值的默认情况:
配置没有网络接口的静态 DNS。请注意,当更新主机节点上的
/etc/resolv.conf
文件时,您不需要在NodeNetworkConfigurationPolicy
(NNCP)清单中指定一个接口 (IPv4 或 IPv6)。全局存储 DNS 值的网络接口的 DNS 配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要您可以在 NNCP 文件的
dns-resolver.config
部分下指定 DNS 选项,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要从网络接口中删除 DNS 选项,请将以下配置应用到 NNCP,然后运行
oc apply -f <nncp_file_name>
命令:... ...
# ... dns-resolver: config: {} interfaces: [] # ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
以下示例显示,配置一个网络接口来存储 DNS 值:
如果要将静态 DNS 名称服务器排名在动态 DNS 名称服务器上,请在网络接口 YAML 配置文件中定义运行动态主机配置协议(DHCP)或 IPv6 自动配置(
autoconf
)机制的接口。将
192.0.2.1
添加到从 DHCPv4 网络协议检索的 DNS 名称服务器中的示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您需要配置网络接口来存储 DNS 值,而不是使用默认方法(使用
nmstate
API 在全局范围内存储 DNS 值),您可以在网络接口 YAML 文件中设置静态 DNS 值和静态 IP 地址。重要在网络接口级别上存储 DNS 值可能会导致名称解析问题,如 Open vSwitch (OVS) 网桥、Linux 网桥或绑定。
在接口级别存储 DNS 值的配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要为您的网络接口设置静态 DNS 搜索域和静态 DNS 名称服务器,请在网络接口 YAML 配置文件中定义运行动态主机配置协议(DHCP)或 IPv6 自动配置(
autoconf
)机制的静态接口。重要在网络接口 YAML 文件中指定以下
dns-resolver
配置可能会导致重启出现竞争条件,以防止NodeNetworkConfigurationPolicy
(NNCP)应用到集群中运行的 pod:- 为您的网络接口设置静态 DNS 搜索域和动态 DNS 名称服务器。
-
为搜索参数指定域后缀,而不为
server
参数设置 IP 地址。
设置
example.com
和example.org
静态 DNS 搜索域以及静态 DNS 名称服务器设置的示例配置Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.13.6. 静态路由 复制链接链接已复制到粘贴板!
以下片段在接口 eth1
中配置静态路由和静态 IP。
在配置静态路由时,您无法使用 OVN-Kubernetes br-ex
网桥作为下一个跃点接口,除非您手动配置自定义的 br-ex
网桥。
如需更多信息,请参阅在裸机中部署安装程序置备的集群文档或在裸机中安装用户置备的集群 文档中的"创建包括自定义 br-ex 网桥的清单对象"。
第 2 章 对节点网络配置进行故障排除 复制链接链接已复制到粘贴板!
如果节点网络配置遇到问题,则策略会自动回滚,且报告失败。这包括如下问题:
- 配置没有在主机上应用。
- 主机丢失了到默认网关的连接。
- 断开了与 API 服务器的连接。
2.1. 对不正确的节点网络配置策略配置进行故障排除 复制链接链接已复制到粘贴板!
您可以通过应用节点网络配置策略,对整个集群中的节点网络配置应用更改。
如果应用了不正确的配置,您可以使用以下示例进行故障排除并修正失败的节点网络策略。这个示例尝试将 Linux 网桥策略应用到具有三个 control plane 节点和三个计算节点的集群。策略不会被应用,因为策略会引用错误的接口。
要查找错误,您需要调查可用的 NMState 资源。然后您可以使用正确配置来更新策略。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您确保 Linux 系统上不存在
ens01
接口。
流程
在集群中创建策略。以下示例创建了一个简单的网桥
br1
,它具有ens01
作为其成员:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将策略应用到您的网络接口:
oc apply -f ens01-bridge-testfail.yaml
$ oc apply -f ens01-bridge-testfail.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
nodenetworkconfigurationpolicy.nmstate.io/ens01-bridge-testfail created
nodenetworkconfigurationpolicy.nmstate.io/ens01-bridge-testfail created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证策略的状态:
oc get nncp
$ oc get nncp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示策略失败:
输出示例
NAME STATUS ens01-bridge-testfail FailedToConfigure
NAME STATUS ens01-bridge-testfail FailedToConfigure
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仅有策略状态并不表示它在所有节点或某个节点子集中是否失败。
列出节点网络配置以查看策略在任意节点上是否成功。如果策略只在一组节点中失败,输出表示问题在于特定的节点配置。如果策略在所有节点上都失败,输出会认为问题在于策略。
oc get nnce
$ oc get nnce
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示策略在所有节点上都失败:
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看失败的原因之一。以下命令使用输出工具
jsonpath
来过滤输出结果:oc get nnce compute-1.ens01-bridge-testfail -o jsonpath='{.status.conditions[?(@.type=="Failing")].message}'
$ oc get nnce compute-1.ens01-bridge-testfail -o jsonpath='{.status.conditions[?(@.type=="Failing")].message}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
[2024-10-10T08:40:46Z INFO nmstatectl] Nmstate version: 2.2.37 NmstateError: InvalidArgument: Controller interface br1 is holding unknown port ens01
[2024-10-10T08:40:46Z INFO nmstatectl] Nmstate version: 2.2.37 NmstateError: InvalidArgument: Controller interface br1 is holding unknown port ens01
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上例显示
InvalidArgument
错误的输出,这表示ens01
是一个未知端口。在本例中,您可能需要更改策略配置文件中的端口配置。要确保正确配置了策略,请求
NodeNetworkState
来查看一个或多个节点的网络配置。以下命令返回control-plane-1
节点的网络配置:oc get nns control-plane-1 -o yaml
$ oc get nns control-plane-1 -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示节点上的接口名称为
ens1
,但失败的策略使用了ens01
:输出示例
- ipv4: # ... name: ens1 state: up type: ethernet
- ipv4: # ... name: ens1 state: up type: ethernet
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过编辑现有策略修正错误:
oc edit nncp ens01-bridge-testfail
$ oc edit nncp ens01-bridge-testfail
Copy to Clipboard Copied! Toggle word wrap Toggle overflow # ... port: - name: ens1
# ... port: - name: ens1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保存策略以应用更正。
检查策略的状态,以确保它被成功更新:
oc get nncp
$ oc get nncp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME STATUS ens01-bridge-testfail SuccessfullyConfigured
NAME STATUS ens01-bridge-testfail SuccessfullyConfigured
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在集群中的所有节点上都成功配置了更新的策略。
2.2. 在断开连接的环境中的 DNS 连接问题故障排除 复制链接链接已复制到粘贴板!
如果您在断开连接的环境中配置 nmstate
时遇到健康检查探测问题,您可以将 DNS 服务器配置为解析自定义域名,而不是默认的 root-servers.net
域。
确保 DNS 服务器包含 root-servers.net
区域的名称服务器(NS)条目。DNS 服务器不需要将查询转发到上游解析器,但服务器必须为 NS 查询返回正确的回答。
2.2.1. 配置名为 server 的 bind9 DNS 复制链接链接已复制到粘贴板!
对于配置为查询 bind9
DNS 服务器的集群,您可以将 root-servers.net
区域添加到至少一个 DNS 记录的配置文件。例如,您可以使用 /var/named/named.localhost
作为已匹配此条件的区域文件。
流程
运行以下命令,在
/etc/named.conf
配置文件末尾添加root-servers.net
区域:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令重启
named
服务:systemctl restart named
$ systemctl restart named
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令确认
root-servers.net
区已存在:journalctl -u named|grep root-servers.net
$ journalctl -u named|grep root-servers.net
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Jul 03 15:16:26 rhel-8-10 bash[xxxx]: zone root-servers.net/IN: loaded serial 0 Jul 03 15:16:26 rhel-8-10 named[xxxx]: zone root-servers.net/IN: loaded serial 0
Jul 03 15:16:26 rhel-8-10 bash[xxxx]: zone root-servers.net/IN: loaded serial 0 Jul 03 15:16:26 rhel-8-10 named[xxxx]: zone root-servers.net/IN: loaded serial 0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证 DNS 服务器是否可以解析
root-servers.net
域的 NS 记录:host -t NS root-servers.net. 127.0.0.1
$ host -t NS root-servers.net. 127.0.0.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Using domain server: Name: 127.0.0.1 Address: 127.0.0.53 Aliases: root-servers.net name server root-servers.net.
Using domain server: Name: 127.0.0.1 Address: 127.0.0.53 Aliases: root-servers.net name server root-servers.net.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.2.2. 配置 dnsmasq DNS 服务器 复制链接链接已复制到粘贴板!
如果您使用 dnsmasq
作为 DNS 服务器,您可以将 root-servers.net
域的解析委派给另一个 DNS 服务器,例如,使用您指定的 DNS 服务器创建新配置文件来解析 root-servers.net
。
运行以下命令,创建一个将域
root-servers.net
委派给另一个 DNS 服务器的配置文件:echo 'server=/root-servers.net/<DNS_server_IP>'> /etc/dnsmasq.d/delegate-root-servers.net.conf
$ echo 'server=/root-servers.net/<DNS_server_IP>'> /etc/dnsmasq.d/delegate-root-servers.net.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令重启
dnsmasq
服务:systemctl restart dnsmasq
$ systemctl restart dnsmasq
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令确认
root-servers.net
域已被委派给另一个 DNS 服务器:journalctl -u dnsmasq|grep root-servers.net
$ journalctl -u dnsmasq|grep root-servers.net
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Jul 03 15:31:25 rhel-8-10 dnsmasq[1342]: using nameserver 192.168.1.1#53 for domain root-servers.net
Jul 03 15:31:25 rhel-8-10 dnsmasq[1342]: using nameserver 192.168.1.1#53 for domain root-servers.net
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证 DNS 服务器是否可以解析
root-servers.net
域的 NS 记录:host -t NS root-servers.net. 127.0.0.1
$ host -t NS root-servers.net. 127.0.0.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: root-servers.net name server root-servers.net.
Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: root-servers.net name server root-servers.net.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.2.3. 创建自定义 DNS 主机名以解决 DNS 连接问题 复制链接链接已复制到粘贴板!
在无法访问外部 DNS 服务器的断开连接的环境中,您可以通过在 NMState 自定义资源定义(CRD)中指定自定义 DNS 主机名来解决 Kubernetes NMState
Operator 健康探测问题。
流程
将 DNS 主机名配置添加到集群的
NMState
CRD 中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将 DNS 主机名配置应用到集群网络。确保将 <
;filename&
gt; 替换为 CRD 文件的名称。$ oc apply -f <filename>.yaml
$ oc apply -f <filename>.yaml
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.