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