7.5. 网络问题故障排除
7.5.1. 如何选择网络接口
对于在裸机上安装,或在具有多个网络接口控制器(NIC)的虚拟机中安装时,OpenShift Container Platform 用于与 Kubernetes API 服务器通信的 NIC 由节点引导时 systemd 运行的 nodeip-configuration.service
服务单元决定。nodeip-configuration.service
从与默认路由关联的接口中选择 IP。
在 nodeip-configuration.service
服务确定正确的 NIC 后,该服务会创建 /etc/systemd/system/kubelet.service.d/20-nodenet.conf
文件。20-nodenet.conf
文件将 KUBELET_NODE_IP
环境变量设置为服务所选的 IP 地址。
当 kubelet 服务启动时,它会从 20-nodenet.conf
文件中读取环境变量的值,并将 IP 地址设置为 --node-ip
kubelet 命令行参数。因此,kubelet 服务使用所选 IP 地址作为节点 IP 地址。
如果在安装后重新配置了硬件或网络,或者有节点 IP 不应来自默认路由接口的网络布局,则 nodeip-configuration.service
服务可能会在重启后选择不同的 NIC。在某些情况下,oc get nodes -o wide
命令的输出中的 INTERNAL-IP
列中可能会看到选择了一个不同的 NIC。
如果因为选择了不同的 NIC 而导致网络通信中断或错误配置,您可能会收到以下错误: EtcdCertSignerControllerDegraded
。您可以创建一个提示文件,其中包含 NODEIP_HINT
变量来覆盖默认的 IP 选择逻辑。如需更多信息,请参阅 可选:覆盖默认节点 IP 选择逻辑。
7.5.1.1. 可选:覆盖默认节点 IP 选择逻辑
要覆盖默认 IP 选择逻辑,您可以创建一个包含 NODEIP_HINT
变量的提示文件来覆盖默认的 IP 选择逻辑。通过创建 hint 文件,您可以从 NODEIP_HINT
变量中指定的 IP 地址子网中的接口选择特定的节点 IP 地址。
例如,如果某个节点有两个接口,eth0
地址为 10.0.0.10/24
,而 eth1
地址为 192.0.2.5/24
,并且默认路由指向 eth0
(10.0.0.10
),则节点 IP 地址通常使用 10.0.0.10
IP 地址。
用户可以将 NODEIP_HINT
变量配置为指向子网中已知 IP,例如 192.0.2.1
的子网网关,以便选择其他子网 192.0.2.0/24
。因此,eth1
上的 192.0.2.5
IP 地址用于节点。
以下流程演示了如何覆盖默认节点 IP 选择逻辑。
流程
在您的
/etc/default/nodeip-configuration
文件中添加提示文件,例如:NODEIP_HINT=192.0.2.1
重要-
不要使用节点的确切 IP 地址作为 hint,例如
192.0.2.5
。使用节点的确切 IP 地址会导致节点使用 hint IP 地址无法正确配置。 - hint 文件中的 IP 地址仅用于确定正确的子网。它不会因为提示文件中出现的结果而接收流量。
-
不要使用节点的确切 IP 地址作为 hint,例如
运行以下命令生成
base-64
编码内容:$ echo -n 'NODEIP_HINT=192.0.2.1' | base64 -w0
输出示例
Tk9ERUlQX0hJTlQ9MTkyLjAuMCxxxx==
在部署集群前,为
master
和worker
角色创建机器配置清单来激活提示:99-nodeip-hint-master.yaml
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 99-nodeip-hint-master spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,<encoded_content> 1 mode: 0644 overwrite: true path: /etc/default/nodeip-configuration
- 1
- 将
<encoded_contents>
替换为/etc/default/nodeip-configuration
文件的 base64 编码内容,例如Tk9ERUlQX0hJTlQ9MTkyLjAuMCxxxx==
。请注意,在逗号后和编码的内容之前不能有空格。
99-nodeip-hint-worker.yaml
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 99-nodeip-hint-worker spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,<encoded_content> 1 mode: 0644 overwrite: true path: /etc/default/nodeip-configuration
- 1
- 将
<encoded_contents>
替换为/etc/default/nodeip-configuration
文件的 base64 编码内容,例如Tk9ERUlQX0hJTlQ9MTkyLjAuMCxxxx==
。请注意,在逗号后和编码的内容之前不能有空格。
-
将清单保存到保存集群配置的目录中,如
~/clusterconfigs
。 - 部署集群。
7.5.2. Open vSwitch 问题故障排除
若要对一些 Open vSwitch (OVS) 问题进行故障排除,您可能需要配置日志级别以包含更多信息。
如果临时修改节点上的日志级别,请注意您可以像以下示例一样从节点上的机器配置守护进程接收日志消息:
E0514 12:47:17.998892 2281 daemon.go:1350] content mismatch for file /etc/systemd/system/ovs-vswitchd.service: [Unit]
为避免与不匹配相关的日志消息,请在完成故障排除后恢复日志级别更改。
7.5.2.1. 临时配置 Open vSwitch 日志级别
对于短期故障排除,您可以临时配置 Open vSwitch (OVS) 日志级别。以下流程不需要重启该节点。另外,每当您重新引导节点时,配置更改都不会保留。
执行此步骤更改日志级别后,您可以接收来自机器配置守护进程的日志消息,该守护进程指出 ovs-vswitchd.service
的内容不匹配。要避免日志消息,请重复此步骤,并将日志级别设置为原始值。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
已安装 OpenShift CLI(
oc
)。
流程
为节点启动 debug pod:
$ oc debug node/<node_name>
将
/host
设置为 debug shell 中的根目录。debug pod 从 pod 中的/host
中的主机挂载 root 文件系统。将根目录改为/host
,您可以从主机文件系统中运行二进制文件:# chroot /host
查看 OVS 模块的当前 syslog 级别:
# ovs-appctl vlog/list
以下示例输出显示了 syslog 设置为
info
的日志级别。输出示例
console syslog file ------- ------ ------ backtrace OFF INFO INFO bfd OFF INFO INFO bond OFF INFO INFO bridge OFF INFO INFO bundle OFF INFO INFO bundles OFF INFO INFO cfm OFF INFO INFO collectors OFF INFO INFO command_line OFF INFO INFO connmgr OFF INFO INFO conntrack OFF INFO INFO conntrack_tp OFF INFO INFO coverage OFF INFO INFO ct_dpif OFF INFO INFO daemon OFF INFO INFO daemon_unix OFF INFO INFO dns_resolve OFF INFO INFO dpdk OFF INFO INFO ...
指定
/etc/systemd/system/ovs-vswitchd.service.d/10-ovs-vswitchd-restart.conf
文件中的日志级别:Restart=always ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /var/lib/openvswitch' ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /etc/openvswitch' ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /run/openvswitch' ExecStartPost=-/usr/bin/ovs-appctl vlog/set syslog:dbg ExecReload=-/usr/bin/ovs-appctl vlog/set syslog:dbg
在前面的示例中,日志级别设置为
dbg
。修改最后两行,将syslog:<log_level>
设置为off
、emer
、err
、warn
、info
或dbg
。off
日志级别会过滤掉所有日志消息。重启服务:
# systemctl daemon-reload
# systemctl restart ovs-vswitchd
7.5.2.2. 永久配置 Open vSwitch 日志级别
对于对 Open vSwitch (OVS) 日志级别的长期更改,您可以永久更改日志级别。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
已安装 OpenShift CLI(
oc
)。
流程
使用类似以下示例的
MachineConfig
对象创建一个文件,如99-change-ovs-loglevel.yaml
:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master 1 name: 99-change-ovs-loglevel spec: config: ignition: version: 3.2.0 systemd: units: - dropins: - contents: | [Service] ExecStartPost=-/usr/bin/ovs-appctl vlog/set syslog:dbg 2 ExecReload=-/usr/bin/ovs-appctl vlog/set syslog:dbg name: 20-ovs-vswitchd-restart.conf name: ovs-vswitchd.service
应用机器配置:
$ oc apply -f 99-change-ovs-loglevel.yaml
7.5.2.3. 显示 Open vSwitch 日志
使用以下步骤显示 Open vSwitch (OVS) 日志。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
已安装 OpenShift CLI(
oc
)。
流程
运行以下任一命令:
使用来自集群外的
oc
命令显示日志:$ oc adm node-logs <node_name> -u ovs-vswitchd
登录到集群中的节点后显示日志:
# journalctl -b -f -u ovs-vswitchd.service
登录节点的一种方法是使用
oc debug node/<node_name>
命令。