7.5. 网络问题故障排除

7.5.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.2.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

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)。

流程

  1. 为节点启动 debug pod:

    $ oc debug node/<node_name>
  2. /host 设置为 debug shell 中的根目录。debug pod 从 pod 中的 /host 中的主机挂载 root 文件系统。将根目录改为 /host,您可以从主机文件系统中运行二进制文件:

    # chroot /host
  3. 查看 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
    ...

  4. 指定 /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> 设置为 offemererrwarninfodbgoff 日志级别会过滤掉所有日志消息。

  5. 重启服务:

    # systemctl daemon-reload
    # systemctl restart ovs-vswitchd

7.5.2.2. 永久配置 Open vSwitch 日志级别

对于对 Open vSwitch (OVS) 日志级别的长期更改,您可以永久更改日志级别。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 使用类似以下示例的 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
    1
    执行此步骤以配置 control plane 节点后,重复这个过程,并将角色设置为 worker 以配置 worker 节点。
    2
    设置 syslog:<log_level> 值。日志级别为 offemererrwarninfodbg。将值设置为 off 会过滤掉所有日志消息。
  2. 应用机器配置:

    $ 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> 命令。