27.3. 对节点网络配置进行故障排除
如果节点网络配置遇到问题,则策略会自动回滚,且报告失败。这包括如下问题:
- 配置没有在主机上应用。
- 主机丢失了到默认网关的连接。
- 断开了与 API 服务器的连接。
27.3.1. 对不正确的节点网络配置策略配置进行故障排除
您可以通过应用节点网络配置策略,对整个集群中的节点网络配置应用更改。如果应用了不正确的配置,您可以使用以下示例进行故障排除并修正失败的节点网络策略。
在本例中,一个 Linux 桥接策略应用到一个具有三个 control plane 节点和三个计算节点的示例集群。策略无法应用,因为它会引用了一个不正确的接口。要查找错误,调查可用的 NMState 资源。然后您可以使用正确配置来更新策略。
流程
创建策略并将其应用到集群。以下示例在
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
$ oc apply -f ens01-bridge-testfail.yaml
输出示例
nodenetworkconfigurationpolicy.nmstate.io/ens01-bridge-testfail created
运行以下命令,验证策略的状态:
$ oc get nncp
输出显示策略失败:
输出示例
NAME STATUS ens01-bridge-testfail FailedToConfigure
但是,仅有策略状态并不表示它在所有节点或某个节点子集中是否失败。
列出节点网络配置以查看策略在任意节点上是否成功。如果策略只针对某个节点子集失败,这表示问题在于特定的节点配置。如果策略在所有节点上都失败,这表示问题在于策略。
$ 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
查看失败的原因之一并查看回溯信息。以下命令使用输出工具
jsonpath
来过滤输出结果:$ oc get nnce compute-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(期望的)
策略配置,策略在节点上的current(当前的)
配置,并高亮标识了不匹配参数间的difference(不同)
。在本例中,端口
包含在difference
中,这表示策略中的端口配置问题。要确保正确配置了策略,请求
NodeNetworkState
来查看一个或多个节点的网络配置。以下命令返回control-plane-1
节点的网络配置:$ oc get nns control-plane-1 -o yaml
输出显示节点上的接口名称为
ens1
,但失败的策略使用了ens01
:输出示例
- ipv4: ... name: ens1 state: up type: ethernet
通过编辑现有策略修正错误:
$ oc edit nncp ens01-bridge-testfail
... port: - name: ens1
保存策略以应用更正。
检查策略的状态,以确保它被成功更新:
$ oc get nncp
输出示例
NAME STATUS ens01-bridge-testfail SuccessfullyConfigured
在集群中的所有节点上都成功配置了更新的策略。
27.3.2. 在断开连接的环境中的 DNS 连接问题故障排除
如果您在断开连接的环境中配置 nmstate
时遇到 DNS 连接问题,您可以配置 DNS 服务器来解析域 root-servers.net
的名称服务器列表。
确保 DNS 服务器包含 root-servers.net
区域的名称服务器(NS)条目。DNS 服务器不需要将查询转发到上游解析器,但服务器必须为 NS 查询返回正确的回答。
27.3.2.1. 配置名为 server 的 bind9 DNS
对于配置为查询 bind9
DNS 服务器的集群,您可以将 root-servers.net
区域添加到至少一个 NS 记录的配置文件。例如,您可以使用 /var/named/named.localhost
作为已匹配此条件的区域文件。
流程
运行以下命令,在
/etc/named.conf
配置文件末尾添加root-servers.net
区域:$ cat >> /etc/named.conf <<EOF zone "root-servers.net" IN { type master; file "named.localhost"; }; EOF
运行以下命令重启
named
服务:$ systemctl restart named
运行以下命令确认
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
运行以下命令,验证 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.
27.3.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
运行以下命令重启
dnsmasq
服务:$ systemctl restart dnsmasq
运行以下命令确认
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
运行以下命令,验证 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.