Menu Close

11.3. 对节点网络配置进行故障排除

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

  • 配置没有在主机上应用。
  • 主机丢失了到默认网关的连接。
  • 断开了与 API 服务器的连接。

11.3.1. 对不正确的 NodeNetworkConfigurationPolicy 配置进行故障排除

您可以通过应用 NodeNetworkConfigurationPolicy,对整个集群中的节点网络配置应用更改。如果您应用了不正确的配置,您可以使用参照示例进行故障排除并修正失败的网络策略。

在本例中,一个 Linux 桥接策略应用到一个有 3 个 master 节点和 3 个 worker 节点的实例集群。策略无法应用,因为它会引用了一个不正确的接口。要查找错误,请调查可用的 nmstate 资源。然后您可以使用正确配置来更新 Policy。

流程

  1. 创建 Policy 并将其应用到集群。以下示例在 ens01 接口上创建了一个简单桥接:

    apiVersion: nmstate.io/v1alpha1
    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
    $ oc apply -f ens01-bridge-testfail.yaml

    输出示例

    nodenetworkconfigurationpolicy.nmstate.io/ens01-bridge-testfail created

  2. 运行以下命令,检查 Policy 的状态:

    $ oc get nncp

    输出显示策略失败:

    输出示例

    NAME                    STATUS
    ens01-bridge-testfail   FailedToConfigure

    但是,仅有 Policy 状态并不表示它在所有节点或某个节点子集中是否失败。

  3. 列出 Enactments 以决定所有节点上的策略是否成功。如果策略仅仅因为某个子集而失败,这意味着问题在于特定的节点配置; 如果策略在所有节点中都失败,则表明问题在 Policy 中。

    $ oc get nnce

    输出显示 Policy 在所有节点上都失败:

    输出示例

    NAME                                   STATUS
    master-1.ens01-bridge-testfail         FailedToConfigure
    master-2.ens01-bridge-testfail         FailedToConfigure
    master-3.ens01-bridge-testfail         FailedToConfigure
    worker-1.ens01-bridge-testfail         FailedToConfigure
    worker-2.ens01-bridge-testfail         FailedToConfigure
    worker-3.ens01-bridge-testfail         FailedToConfigure

  4. 查看失败的 Enactments 并检查回溯信息。以下命令使用输出工具 jsonpath 来过滤输出结果:

    $ oc get nnce worker-1.ens01-bridge-testfail -o jsonpath='{.status.conditions[?(@.type=="Failing")].message}'

    这个命令会返回一个大的回溯信息,它被编辑为 brevity:

    输出示例

    error reconciling NodeNetworkConfigurationPolicy at desired state apply: , failed to execute nmstatectl set --no-commit --timeout 480: 'exit status 1' ''
    ...
    libnmstate.error.NmstateVerificationError:
    desired
    =======
    ---
    name: br1
    type: linux-bridge
    state: up
    bridge:
      options:
        group-forward-mask: 0
        mac-ageing-time: 300
        multicast-snooping: true
        stp:
          enabled: false
          forward-delay: 15
          hello-time: 2
          max-age: 20
          priority: 32768
      port:
      - name: ens01
    description: Linux bridge with the wrong port
    ipv4:
      address: []
      auto-dns: true
      auto-gateway: true
      auto-routes: true
      dhcp: true
      enabled: true
    ipv6:
      enabled: false
    mac-address: 01-23-45-67-89-AB
    mtu: 1500
    
    current
    =======
    ---
    name: br1
    type: linux-bridge
    state: up
    bridge:
      options:
        group-forward-mask: 0
        mac-ageing-time: 300
        multicast-snooping: true
        stp:
          enabled: false
          forward-delay: 15
          hello-time: 2
          max-age: 20
          priority: 32768
      port: []
    description: Linux bridge with the wrong port
    ipv4:
      address: []
      auto-dns: true
      auto-gateway: true
      auto-routes: true
      dhcp: true
      enabled: true
    ipv6:
      enabled: false
    mac-address: 01-23-45-67-89-AB
    mtu: 1500
    
    difference
    ==========
    --- desired
    +++ current
    @@ -13,8 +13,7 @@
           hello-time: 2
           max-age: 20
           priority: 32768
    -  port:
    -  - name: ens01
    +  port: []
     description: Linux bridge with the wrong port
     ipv4:
       address: []
      line 651, in _assert_interfaces_equal\n    current_state.interfaces[ifname],\nlibnmstate.error.NmstateVerificationError:

    NmstateVerificationError 列出了 desired(期望的) Policy 配置,Policy 在节点上的current(当前的) 配置,并高亮标识了不匹配参数间的difference(不同)。在本示例中,此 port 包含在 difference部分,这表示 Policy 中的端口配置问题。

  5. 要确保正确配置了策略,请求 NodeNetworkState 来查看一个或多个节点的网络配置。以下命令会返回 master-1 节点的网络配置:

    $ oc get nns master-1 -o yaml

    输出显示节点上的接口名称为 ens1,但失败的 Policy 使用了 ens01:

    输出示例

       - ipv4:
     ...
          name: ens1
          state: up
          type: ethernet

  6. 通过编辑现有策略修正此错误:

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

    保存 Policy 以应用更正。

  7. 检查 Policy 的状态,以确保它被成功更新:

    $ oc get nncp

    输出示例

    NAME                    STATUS
    ens01-bridge-testfail   SuccessfullyConfigured

更新的 Policy 可在集群中的所有节点上成功配置。