7.4. 网络问题故障排除
7.4.1. 如何选择网络接口
对于在裸机上安装,或在具有多个网络接口控制器(NIC)的虚拟机中安装时,OpenShift Container Platform 用于与 Kubernetes API 服务器通信的 NIC 由节点引导时 systemd 运行的 nodeip-configuration.service
服务单元决定。该服务会逐个检查节点上的每个网络接口,当第一个配置了可以用于 API 服务器的 IP 地址的子网的网络接口被选择用来进行 OpenShift Container Platform 通讯。
在 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 地址。
如果在安装后重新配置了硬件或网络,nodeip-configuration.service
服务可能会在重启后选择不同的 NIC。在某些情况下,oc get nodes -o wide
命令的输出中的 INTERNAL-IP
列中可能会看到选择了一个不同的 NIC。
如果因为选择了一个不同的 NIC 而导致网络通信中断或配置错误,使用一个策略来覆盖选择的过程以明确设置正确的 IP 地址。以下列表确定了高级步骤和注意事项:
-
创建一个 shell 脚本,以确定用于 OpenShift Container Platform 通信的 IP 地址。让脚本创建一个自定义单元文件,如
/etc/systemd/system/kubelet.service.d/98-nodenet-override.conf
。使用自定义单元文件98-nodenet-override.conf
,将KUBELET_NODE_IP
环境变量设置为 IP 地址。 -
不要覆盖
/etc/systemd/system/kubelet.service.d/20-nodenet.conf
文件。指定同一目录路径中的数值较高的文件名,如98-nodenet-override.conf
。这样做的目标是使自定义单元文件在20-nodenet.conf
之后运行,并覆盖环境变量的值。 -
使用 shell 脚本创建一个机器配置对象,作为 base64 编码字符串,并使用 Machine Config Operator 将脚本部署到文件系统路径(如
/usr/local/bin/override-node-ip.sh
)的节点。 -
确保
systemctl daemon-reload
在 shell 脚本运行后运行。最简单的方法是在机器配置中指定ExecStart=systemctl daemon-reload
,如下例所示。
用于覆盖 kubelet 网络接口的机器配置示例
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 98-nodenet-override spec: config: ignition: version: 3.1.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,<encoded_script> mode: 0755 overwrite: true path: /usr/local/bin/override-node-ip.sh systemd: units: - contents: | [Unit] Description=Override node IP detection Wants=network-online.target Before=kubelet.service After=network-online.target [Service] Type=oneshot ExecStart=/usr/local/bin/override-node-ip.sh ExecStart=systemctl daemon-reload [Install] WantedBy=multi-user.target enabled: true name: nodenet-override.service