29.2. 观察和更新节点网络状态和配置


29.2.1. 查看节点的网络状态

节点网络状态是集群中所有节点的网络配置。一个 NodeNetworkState 对象存在于集群中的每个节点上。此对象定期更新,并捕获该节点的网络状态。

流程

  1. 列出集群中的所有 NodeNetworkState 对象:

    $ oc get nns
  2. 检查 NodeNetworkState 对象以查看该节点上的网络。为了清楚,这个示例中的输出已被重新编辑:

    $ oc get nns node01 -o yaml

    输出示例

    apiVersion: nmstate.io/v1
    kind: NodeNetworkState
    metadata:
      name: node01 1
    status:
      currentState: 2
        dns-resolver:
    # ...
        interfaces:
    # ...
        route-rules:
    # ...
        routes:
    # ...
      lastSuccessfulUpdateTime: "2020-01-31T12:14:00Z" 3

    1
    NodeNetworkState 对象的名称从节点获取。
    2
    currentState 包含节点的完整网络配置,包括 DNS 、接口和路由。
    3
    最新成功更新的时间戳。只要节点可以被访问,这个时间戳就会定期更新,它可以用来指示报告的新旧程度。

29.2.2. 使用 CLI 管理策略

29.2.2.1. 在节点上创建接口

通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个接口。清单详细列出了请求的接口配置。

默认情况下,清单会应用到集群中的所有节点。要将接口只添加到特定的节点,在节点选择器上添加 spec: nodeSelector 参数和适当的 <key>:<value>

您可以同时配置多个支持 nmstate 节点。该配置适用于并行节点的 50%。如果网络连接失败,此策略可防止整个集群不可用。要将策略配置并行应用到集群的特定部分,请使用 maxUnavailable 字段。

流程

  1. 创建 NodeNetworkConfigurationPolicy 清单。以下示例在所有 worker 节点上配置了一个 Linux 桥接并配置 DNS 解析器:

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: br1-eth1-policy 1
    spec:
      nodeSelector: 2
        node-role.kubernetes.io/worker: "" 3
      maxUnavailable: 3 4
      desiredState:
        interfaces:
          - name: br1
            description: Linux bridge with eth1 as a port 5
            type: linux-bridge
            state: up
            ipv4:
              dhcp: true
              enabled: true
              auto-dns: false
            bridge:
              options:
                stp:
                  enabled: false
              port:
                - name: eth1
        dns-resolver: 6
          config:
            search:
            - example.com
            - example.org
            server:
            - 8.8.8.8
    1
    策略的名称。
    2
    可选: 如果没有包括 nodeSelector 参数,策略会应用到集群中的所有节点。
    3
    本例使用 node-role.kubernetes.io/worker:"" 节点选择器来选择集群中的所有 worker 节点。
    4
    可选:指定策略配置可同时应用到的最大 nmstate 节点数。这个参数可以设置为百分比值(字符串),如 "10%",也可以是绝对值(数字),如 3
    5
    可选:接口人类可读的描述。
    6
    可选:指定 DNS 服务器的搜索和服务器设置。
  2. 创建节点网络策略:

    $ oc apply -f br1-eth1-policy.yaml 1
    1
    节点网络配置策略清单的文件名。

其他资源

29.2.3. 确认节点上的节点网络策略更新

NodeNetworkConfigurationPolicy 清单描述了您为集群中的节点请求的网络配置。节点网络策略包括您请求的网络配置以及整个集群中的策略执行状态。

当您应用节点网络策略时,会为集群中的每个节点创建一个 NodeNetworkConfigurationEnactment 对象。节点网络配置是一个只读对象,代表在该节点上执行策略的状态。如果策略在节点上应用失败,则该节点会包括 traceback 用于故障排除。

流程

  1. 要确认策略已应用到集群,请列出策略及其状态:

    $ oc get nncp
  2. 可选:如果策略配置成功的时间比预期的要长,您可以检查特定策略请求的状态和状态条件:

    $ oc get nncp <policy> -o yaml
  3. 可选:如果策略在所有节点上配置成功的时间比预期的要长,您可以列出集群中的 Enactments 的状态:

    $ oc get nnce
  4. 可选:要查看特定的 Enactment 的配置,包括对失败配置进行任何错误报告:

    $ oc get nnce <node>.<policy> -o yaml

29.2.4. 从节点中删除接口

您可以通过编辑 NodeNetworkConfigurationPolicy 对象从集群中的一个或多个节点中删除接口,并将接口的状态设置为 absent

从节点中删除接口不会自动将节点网络配置恢复到以前的状态。如果要恢复之前的状态,则需要在策略中定义节点网络配置。

如果删除了网桥或绑定接口,以前附加到该网桥或绑定接口的任何节点 NIC 都会处于 down 状态并变得不可访问。为了避免连接丢失,在相同策略中配置节点 NIC,使其具有 up 状态,以及使用 DHCP 或一个静态 IP 地址。

注意

删除添加接口的节点网络策略不会更改节点上的策略配置。虽然 NodeNetworkConfigurationPolicy 是集群中的一个对象,但它只代表请求的配置。
同样,删除接口不会删除策略。

流程

  1. 更新用来创建接口的 NodeNetworkConfigurationPolicy 清单。以下示例删除了 Linux 网桥,并使用 DHCP 配置 eth1 NIC 以避免断开连接:

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: <br1-eth1-policy> 1
    spec:
      nodeSelector: 2
        node-role.kubernetes.io/worker: "" 3
      desiredState:
        interfaces:
        - name: br1
          type: linux-bridge
          state: absent 4
        - name: eth1 5
          type: ethernet 6
          state: up 7
          ipv4:
            dhcp: true 8
            enabled: true 9
    1
    策略的名称。
    2
    可选: 如果没有包括 nodeSelector 参数,策略会应用到集群中的所有节点。
    3
    本例使用 node-role.kubernetes.io/worker:"" 节点选择器来选择集群中的所有 worker 节点。
    4
    将状态改为 absent 会删除接口。
    5
    要从网桥接口中取消附加的接口名称。
    6
    接口的类型。这个示例创建了以太网网络接口。
    7
    接口的请求状态。
    8
    可选:如果您不使用 dhcp,可以设置静态 IP,或让接口没有 IP 地址。
    9
    在这个示例中启用 ipv4
  2. 更新节点上的策略并删除接口:

    $ oc apply -f <br1-eth1-policy.yaml> 1
    1
    策略清单的文件名。

29.2.5. 不同接口的策略配置示例

在读取不同示例 NodeNetworkConfigurationPolicy (NNCP)清单配置前,请在应用策略时请考虑以下因素,以便集群在其最佳性能条件下运行:

  • 当您需要将策略应用到多个节点时,为每个目标节点创建一个 NodeNetworkConfigurationPolicy 清单。Kubernetes NMState Operator 以未指定顺序将策略应用到每个节点。使用此方法限制策略会缩短策略应用程序的时长,但如果集群的配置中出现错误,则可能会有在集群范围内出现运行中断的风险。为了避免这种类型的错误,首先将 NNCP 应用到某些节点,并在确认它们是否已正确配置后,继续执行将策略应用到剩余的节点。
  • 当您需要将策略应用到多个节点时,但只想为所有目标节点创建一个 NNCP,Kubernetes NMState Operator 会按顺序将策略应用到每个节点。您可以使用集群配置中的 maxUnavailable 参数为目标节点设置策略应用程序的速度和覆盖范围。通过为参数设置一个较低的百分比值,您可以在中断只会影响接收策略应用程序的一小部分节点时,降低出现集群范围中断的风险。
  • 考虑在单个策略中指定所有相关网络配置。
  • 当节点重启时,Kubernetes NMState Operator 无法控制它将策略应用到节点的顺序。Kubernetes NMState Operator 可能会按顺序应用相互独立的策略,这会导致网络对象降级。

29.2.5.1. 示例: Linux bridge interface 节点网络配置策略

通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个 Linux 网桥接口。

以下 YAML 文件是 Linux 网桥界面的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: br1-eth1-policy 1
spec:
  nodeSelector: 2
    kubernetes.io/hostname: <node01> 3
  desiredState:
    interfaces:
      - name: br1 4
        description: Linux bridge with eth1 as a port 5
        type: linux-bridge 6
        state: up 7
        ipv4:
          dhcp: true 8
          enabled: true 9
        bridge:
          options:
            stp:
              enabled: false 10
          port:
            - name: eth1 11
1
策略的名称。
2
可选: 如果没有包括 nodeSelector 参数,策略会应用到集群中的所有节点。
3
这个示例使用 hostname 节点选择器。
4
接口的名称。
5
可选:接口人类可读的接口描述。
6
接口的类型。这个示例会创建一个桥接。
7
创建后接口的请求状态。
8
可选:如果您不使用 dhcp,可以设置静态 IP,或让接口没有 IP 地址。
9
在这个示例中启用 ipv4
10
在这个示例中禁用 stp
11
网桥附加到的节点 NIC。

29.2.5.2. 示例:VLAN 接口节点网络配置策略

通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个 VLAN 接口。

注意

在单个 NodeNetworkConfigurationPolicy 清单中为节点的 VLAN 接口定义所有相关配置。例如,在同一 NodeNetworkConfigurationPolicy 清单中为节点定义 VLAN 接口和相关路由。

当节点重启时,Kubernetes NMState Operator 无法控制应用策略的顺序。因此,如果您将单独的策略用于相关的网络配置,Kubernetes NMState Operator 可能会按顺序应用这些策略,从而导致网络对象降级。

以下 YAML 文件是 VLAN 接口的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: vlan-eth1-policy 1
spec:
  nodeSelector: 2
    kubernetes.io/hostname: <node01> 3
  desiredState:
    interfaces:
    - name: eth1.102 4
      description: VLAN using eth1 5
      type: vlan 6
      state: up 7
      vlan:
        base-iface: eth1 8
        id: 102 9
1
策略的名称。
2
可选: 如果没有包括 nodeSelector 参数,策略会应用到集群中的所有节点。
3
这个示例使用 hostname 节点选择器。
4
接口的名称。当在裸机上部署时,只支持 <interface_name>.<vlan_number> VLAN 格式。
5
可选:接口人类可读的接口描述。
6
接口的类型。这个示例创建了一个 VLAN。
7
创建后接口的请求状态。
8
附加 VLAN 的节点 NIC。
9
VLAN 标签。

29.2.5.3. 示例:绑定接口节点网络配置策略

通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个绑定接口。

注意

OpenShift Container Platform 只支持以下绑定模式:

  • mode=1 active-backup
  • mode=2 balance-xor
  • mode=4 802.3ad

不支持其他绑定模式。

以下 YAML 文件是绑定接口的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: bond0-eth1-eth2-policy 1
spec:
  nodeSelector: 2
    kubernetes.io/hostname: <node01> 3
  desiredState:
    interfaces:
    - name: bond0 4
      description: Bond with ports eth1 and eth2 5
      type: bond 6
      state: up 7
      ipv4:
        dhcp: true 8
        enabled: true 9
      link-aggregation:
        mode: active-backup 10
        options:
          miimon: '140' 11
        port: 12
        - eth1
        - eth2
      mtu: 1450 13
1
策略的名称。
2
可选: 如果没有包括 nodeSelector 参数,策略会应用到集群中的所有节点。
3
这个示例使用 hostname 节点选择器。
4
接口的名称。
5
可选:接口人类可读的接口描述。
6
接口的类型。这个示例创建了一个绑定。
7
创建后接口的请求状态。
8
可选:如果您不使用 dhcp,可以设置静态 IP,或让接口没有 IP 地址。
9
在这个示例中启用 ipv4
10
Bond 的驱动模式。这个示例使用 active 备份模式。
11
可选:本例使用 miimon 检查每 140ms 的绑定链接。
12
绑定中的下级节点 NIC。
13
可选:绑定的最大传输单元(MTU)。如果没有指定,其默认值为 1500

29.2.5.4. 示例:以太网接口节点网络配置策略

通过将 NodeNetworkConfigurationPolicy 清单应用到集群,在集群的节点上配置以太网接口。

以下 YAML 文件是一个以太接口的清单示例。它包含了示例值,需要使用自己的信息替换。

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: eth1-policy 1
spec:
  nodeSelector: 2
    kubernetes.io/hostname: <node01> 3
  desiredState:
    interfaces:
    - name: eth1 4
      description: Configuring eth1 on node01 5
      type: ethernet 6
      state: up 7
      ipv4:
        dhcp: true 8
        enabled: true 9
1
策略的名称。
2
可选: 如果没有包括 nodeSelector 参数,策略会应用到集群中的所有节点。
3
这个示例使用 hostname 节点选择器。
4
接口的名称。
5
可选:接口人类可读的接口描述。
6
接口的类型。这个示例创建了以太网网络接口。
7
创建后接口的请求状态。
8
可选:如果您不使用 dhcp,可以设置静态 IP,或让接口没有 IP 地址。
9
在这个示例中启用 ipv4

29.2.5.5. 示例:同一节点网络配置策略中的多个接口

您可以在相同的节点网络配置策略中创建多个接口。这些接口可以相互引用,允许您使用单个策略清单来构建和部署网络配置。

以下示例 YAML 文件在两个 NIC 和 VLAN 之间创建一个名为 bond10 的绑定,名为 bond10.103,它连接到绑定。

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: bond-vlan 1
spec:
  nodeSelector: 2
    kubernetes.io/hostname: <node01> 3
  desiredState:
    interfaces:
    - name: bond10 4
      description: Bonding eth2 and eth3 5
      type: bond 6
      state: up 7
      link-aggregation:
        mode: balance-xor 8
        options:
          miimon: '140' 9
        port: 10
        - eth2
        - eth3
    - name: bond10.103 11
      description: vlan using bond10 12
      type: vlan 13
      state: up 14
      vlan:
         base-iface: bond10 15
         id: 103 16
      ipv4:
        dhcp: true 17
        enabled: true 18
1
策略的名称。
2
可选: 如果没有包括 nodeSelector 参数,策略会应用到集群中的所有节点。
3
这个示例使用 hostname 节点选择器。
4 11
接口的名称。
5 12
可选:接口人类可读的接口描述。
6 13
接口的类型。
7 14
创建后接口的请求状态。
8
Bond 的驱动模式。
9
可选:本例使用 miimon 检查每 140ms 的绑定链接。
10
绑定中的下级节点 NIC。
15
附加 VLAN 的节点 NIC。
16
VLAN 标签。
17
可选:如果您不使用 dhcp,可以设置静态 IP,或者让接口没有 IP 地址。
18
在这个示例中启用 ipv4。

29.2.6. 捕获附加到网桥的 NIC 的静态 IP

重要

捕获 NIC 的静态 IP 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

29.2.6.1. 示例:Linux 网桥接口节点网络配置策略,用于从附加到网桥的 NIC 中继承静态 IP 地址

在集群的节点上创建一个 Linux 网桥接口,并通过将单个 NodeNetworkConfigurationPolicy 清单应用到集群来将 NIC 的静态 IP 配置传输到桥接。

以下 YAML 文件是 Linux 网桥界面的清单示例。它包含了示例值,需要使用自己的信息替换。

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: br1-eth1-copy-ipv4-policy 1
spec:
  nodeSelector: 2
    node-role.kubernetes.io/worker: ""
  capture:
    eth1-nic: interfaces.name=="eth1" 3
    eth1-routes: routes.running.next-hop-interface=="eth1"
    br1-routes: capture.eth1-routes | routes.running.next-hop-interface := "br1"
  desiredState:
    interfaces:
      - name: br1
        description: Linux bridge with eth1 as a port
        type: linux-bridge 4
        state: up
        ipv4: "{{ capture.eth1-nic.interfaces.0.ipv4 }}" 5
        bridge:
          options:
            stp:
              enabled: false
          port:
            - name: eth1 6
     routes:
        config: "{{ capture.br1-routes.routes.running }}"
1
策略的名称。
2
可选: 如果没有包括 nodeSelector 参数,策略会应用到集群中的所有节点。本例使用 node-role.kubernetes.io/worker:"" 节点选择器来选择集群中的所有 worker 节点。
3
对网桥附加的节点 NIC 的引用。
4
接口的类型。这个示例会创建一个桥接。
5
网桥接口的 IP 地址。这个值与 spec.capture.eth1-nic 条目引用的 NIC 的 IP 地址匹配。
6
网桥附加到的节点 NIC。

29.2.7. 示例:IP 管理

以下配置片段示例演示了不同的 IP 管理方法。

这些示例使用 ethernet 接口类型来简化示例,同时显示 Policy 配置中相关的上下文。这些 IP 管理示例可与其他接口类型一起使用。

29.2.7.1. Static

以下片段在以太网接口中静态配置 IP 地址:

# ...
    interfaces:
    - name: eth1
      description: static IP on eth1
      type: ethernet
      state: up
      ipv4:
        dhcp: false
        address:
        - ip: 192.168.122.250 1
          prefix-length: 24
        enabled: true
# ...
1
使用接口的静态 IP 地址替换这个值。

29.2.7.2. 没有 IP 地址

以下片段确保接口没有 IP 地址:

# ...
    interfaces:
    - name: eth1
      description: No IP on eth1
      type: ethernet
      state: up
      ipv4:
        enabled: false
# ...

29.2.7.3. 动态主机配置

以下片段配置了一个以太网接口,它使用动态 IP 地址、网关地址和 DNS:

# ...
    interfaces:
    - name: eth1
      description: DHCP on eth1
      type: ethernet
      state: up
      ipv4:
        dhcp: true
        enabled: true
# ...

以下片段配置了一个以太网接口,它使用动态 IP 地址,但不使用动态网关地址或 DNS:

# ...
    interfaces:
    - name: eth1
      description: DHCP without gateway or DNS on eth1
      type: ethernet
      state: up
      ipv4:
        dhcp: true
        auto-gateway: false
        auto-dns: false
        enabled: true
# ...

29.2.7.4. DNS

默认情况下,nmstate API 会在全局范围内存储 DNS 值,而不是将其存储在网络接口中。在某些情况下,您必须配置网络接口来存储 DNS 值。要为网络接口定义 DNS 配置,您必须首先在网络接口 YAML 配置文件中指定 dns-resolver 部分。

提示

设置一个 DNS 配置与修改 /etc/resolv.conf 文件相当。

重要

在配置 DNS 解析器时,您不能使用 br-ex 网桥(一个 OVNKubernetes 管理的 Open vSwitch 网桥)作为接口。

以下示例显示了全局存储 DNS 值的默认情况:

  • 配置没有网络接口的静态 DNS。请注意,当更新主机节点上的 /etc/resolv.conf 文件时,您不需要在 NodeNetworkConfigurationPolicy (NNCP)清单中指定一个接口 (IPv4 或 IPv6)。

    全局存储 DNS 值的网络接口的 DNS 配置示例

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
     name: worker-0-dns-testing
    spec:
      nodeSelector:
        kubernetes.io/hostname: <target_node>
      desiredState:
        dns-resolver:
          config:
            search:
            - example.com
            - example.org
            server:
            - 2001:db8:f::1
            - 192.0.2.251
    # ...

以下示例显示,配置一个网络接口来存储 DNS 值:

  • 如果要将静态 DNS 名称服务器排名在动态 DNS 名称服务器上,请在网络接口 YAML 配置文件中定义运行动态主机配置协议(DHCP)或 IPv6 自动配置(autoconf)机制的接口。

    192.0.2.1 添加到从 DHCPv4 网络协议检索的 DNS 名称服务器中的示例

    # ...
    dns-resolver:
      config:
        server:
        - 192.0.2.1
    interfaces:
      - name: eth1
        type: ethernet
        state: up
        ipv4:
          enabled: true
          dhcp: true
          auto-dns: true
    # ...

  • 如果您需要配置网络接口来存储 DNS 值,而不是使用默认方法(使用 nmstate API 在全局范围内存储 DNS 值),您可以在网络接口 YAML 文件中设置静态 DNS 值和静态 IP 地址。

    重要

    在网络接口级别上存储 DNS 值可能会导致名称解析问题,如 Open vSwitch (OVS) 网桥、Linux 网桥或绑定。

    在接口级别存储 DNS 值的配置示例

    # ...
    dns-resolver:
      config:
        search:
        - example.com
        - example.org
        server:
        - 2001:db8:1::d1
        - 2001:db8:1::d2
        - 192.0.2.1
    interfaces:
      - name: eth1
        type: ethernet
        state: up
        ipv4:
          address:
          - ip: 192.0.2.251
            prefix-length: 24
          dhcp: false
          enabled: true
        ipv6:
          address:
          - ip: 2001:db8:1::1
            prefix-length: 64
          dhcp: false
          enabled: true
          autoconf: false
    # ...

  • 如果要为您的网络接口设置静态 DNS 搜索域和动态 DNS 名称服务器,请在网络接口 YAML 配置文件中定义运行动态主机配置协议(DHCP)或 IPv6 自动配置(autoconf)机制的动态接口。

    设置 example.comexample.org 静态 DNS 搜索域以及动态 DNS 名称服务器设置的示例配置

    # ...
    dns-resolver:
      config:
        search:
        - example.com
        - example.org
        server: []
    interfaces:
      - name: eth1
        type: ethernet
        state: up
        ipv4:
          enabled: true
          dhcp: true
          auto-dns: true
        ipv6:
          enabled: true
          dhcp: true
          autoconf: true
          auto-dns: true
    # ...

29.2.7.5. 静态路由

以下片段在接口 eth1 中配置静态路由和静态 IP。

dns-resolver:
  config:
# ...
interfaces:
  - name: eth1
    description: Static routing on eth1
    type: ethernet
    state: up
    ipv4:
      dhcp: false
      enabled: true
      address:
      - ip: 192.0.2.251 1
        prefix-length: 24
routes:
  config:
  - destination: 198.51.100.0/24
    metric: 150
    next-hop-address: 192.0.2.1 2
    next-hop-interface: eth1
    table-id: 254
# ...
1
以太网接口的静态 IP 地址。
2
节点流量的下一跳地址。这必须与为以太接口设定的 IP 地址位于同一个子网中。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.