×

如果节点网络配置遇到问题,策略将自动回滚,并且执行报告失败。这包括以下问题:

  • 配置无法应用于主机。

  • 主机失去与默认网关的连接。

  • 主机失去与 API 服务器的连接。

排查不正确的节点网络配置策略配置

您可以通过应用节点网络配置策略来在整个集群中应用对节点网络配置的更改。

如果您应用了不正确的配置,可以使用以下示例来排查和更正失败的节点网络策略。此示例尝试将 Linux 桥接策略应用于具有三个控制平面节点和三个计算节点的集群。由于策略引用了错误的接口,因此未应用该策略。

要查找错误,您需要调查可用的 NMState 资源。然后,您可以使用正确的配置更新策略。

先决条件
  • 您确保您的 Linux 系统上不存在ens01接口。

步骤
  1. 在集群上创建策略。以下示例创建一个简单的桥接br1,其成员为ens01

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: ens01-bridge-testfail
    spec:
      desiredState:
        interfaces:
          - name: br1
            description: Linux bridge with the wrong port
            type: linux-bridge
            state: up
            ipv4:
              dhcp: true
              enabled: true
            bridge:
              options:
                stp:
                  enabled: false
              port:
                - name: ens01
    # ...
  2. 将策略应用于您的网络接口

    $ oc apply -f ens01-bridge-testfail.yaml
    示例输出
    nodenetworkconfigurationpolicy.nmstate.io/ens01-bridge-testfail created
  3. 通过运行以下命令验证策略的状态

    $ oc get nncp

    输出显示策略失败

    示例输出
    NAME                    STATUS
    ens01-bridge-testfail   FailedToConfigure

    仅策略状态不能指示它是在所有节点上失败还是在部分节点上失败。

  4. 列出节点网络配置执行情况,以查看策略在任何节点上是否成功。如果策略仅对部分节点失败,则输出表明问题在于特定节点配置。如果策略在所有节点上都失败,则输出表明问题在于策略。

    $ oc get nnce

    输出显示策略在所有节点上都失败

    示例输出
    NAME                                         STATUS
    control-plane-1.ens01-bridge-testfail        FailedToConfigure
    control-plane-2.ens01-bridge-testfail        FailedToConfigure
    control-plane-3.ens01-bridge-testfail        FailedToConfigure
    compute-1.ens01-bridge-testfail              FailedToConfigure
    compute-2.ens01-bridge-testfail              FailedToConfigure
    compute-3.ens01-bridge-testfail              FailedToConfigure
  5. 查看其中一个失败的执行。以下命令使用输出工具jsonpath过滤输出

    $ oc get nnce compute-1.ens01-bridge-testfail -o jsonpath='{.status.conditions[?(@.type=="Failing")].message}'
    示例输出
    [2024-10-10T08:40:46Z INFO  nmstatectl] Nmstate version: 2.2.37
    NmstateError: InvalidArgument: Controller interface br1 is holding unknown port ens01

    前面的示例显示了InvalidArgument错误的输出,该错误表明ens01是一个未知端口。对于此示例,您可能需要更改策略配置文件中的端口配置。

  6. 要确保策略配置正确,请通过请求NodeNetworkState对象查看一个或所有节点的网络配置。以下命令返回control-plane-1节点的网络配置

    $ oc get nns control-plane-1 -o yaml

    输出显示节点上的接口名称为ens1,但失败的策略错误地使用了ens01

    示例输出
       - ipv4:
    # ...
          name: ens1
          state: up
          type: ethernet
  7. 通过编辑现有策略来更正错误

    $ oc edit nncp ens01-bridge-testfail
    # ...
              port:
                - name: ens1

    保存策略以应用更正。

  8. 检查策略的状态以确保它已成功更新

    $ oc get nncp
    示例输出
    NAME                    STATUS
    ens01-bridge-testfail   SuccessfullyConfigured

    更新后的策略已成功配置在集群中的所有节点上。

排查断开连接环境中的 DNS 连接问题

如果在断开连接的环境中配置nmstate时遇到 DNS 连接问题,您可以将 DNS 服务器配置为解析域root-servers.net的名称服务器列表。

确保 DNS 服务器包含root-servers.net区域的名称服务器 (NS) 条目。DNS 服务器不需要将查询转发到上游解析器,但服务器必须返回root-servers.net区域的NS记录的正确答案。

配置 bind9 DNS 命名服务器

对于配置为查询bind9 DNS 服务器的集群,您可以将root-servers.net区域添加到包含至少一条 NS 记录的配置文件中。例如,您可以使用/var/named/named.localhost作为已符合此条件的区域文件。

步骤
  1. 通过运行以下命令,在/etc/named.conf配置文件的末尾添加root-servers.net区域

    $ cat >> /etc/named.conf <<EOF
    zone "root-servers.net" IN {
        	type master;
        	file "named.localhost";
    };
    EOF
  2. 通过运行以下命令重新启动named服务

    $ systemctl restart named
  3. 通过运行以下命令确认root-servers.net区域是否存在

    $ journalctl -u named|grep root-servers.net
    示例输出
    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
  4. 通过运行以下命令验证 DNS 服务器是否可以解析root-servers.net域的 NS 记录

    $ host -t NS root-servers.net. 127.0.0.1
    示例输出
    Using domain server:
    Name: 127.0.0.1
    Address: 127.0.0.53
    Aliases:
    root-servers.net name server root-servers.net.

配置 dnsmasq DNS 服务器

如果您使用的是dnsmasq作为DNS服务器,您可以将root-servers.net域的解析委托给另一个DNS服务器,例如,创建一个新的配置文件,使用您指定的DNS服务器来解析root-servers.net

  1. 通过运行以下命令创建将root-servers.net域委托给另一个DNS服务器的配置文件

    $ echo 'server=/root-servers.net/<DNS_server_IP>'> /etc/dnsmasq.d/delegate-root-servers.net.conf
  2. 通过运行以下命令重启dnsmasq服务

    $ systemctl restart dnsmasq
  3. 通过运行以下命令确认root-servers.net域已委托给另一个DNS服务器

    $ journalctl -u dnsmasq|grep 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
  4. 通过运行以下命令验证 DNS 服务器是否可以解析root-servers.net域的 NS 记录

    $ host -t NS root-servers.net. 127.0.0.1
    示例输出
    Using domain server:
    Name: 127.0.0.1
    Address: 127.0.0.1#53
    Aliases:
    root-servers.net name server root-servers.net.