8.5.8.3. 集群节点没有通过 DHCP 获得正确的主机名

在 IPv6 部署过程中,集群节点必须通过 DHCP 获得其主机名。有时 NetworkManager 不会立即分配主机名。Control Plane(master)节点可能会报告错误,例如:

Failed Units: 2
  NetworkManager-wait-online.service
  nodeip-configuration.service

这个错误表示集群节点可能在没有从 DHCP 服务器收到主机名的情况下引导,这会导致 kubelet 使用 localhost.localdomain 主机名引导。要解决这个问题,强制节点更新主机名。

流程

  1. 检索 主机名:

    [core@master-X ~]$ hostname

    如果主机名是 localhost,请执行以下步骤。

    注意

    其中 X 是 control plane 节点(也称为 master 节点)号。

  2. 强制集群节点续订 DHCP 租期:

    [core@master-X ~]$ sudo nmcli con up "<bare-metal-nic>"

    <bare-metal-nic> 替换为与 baremetal 网络对应的有线连接。

  3. 再次检查 主机名:

    [core@master-X ~]$ hostname
  4. 如果主机名仍然是 localhost.localdomain,重启 NetworkManager:

    [core@master-X ~]$ sudo systemctl restart NetworkManager
  5. 如果主机名仍然是 localhost.localdomain,请等待几分钟并再次检查。如果主机名还是 localhost.localdomain,重复前面的步骤。
  6. 重启 nodeip-configuration 服务:

    [core@master-X ~]$ sudo systemctl restart nodeip-configuration.service

    此服务将使用正确的主机名引用来重新配置 kubelet 服务。

  7. 因为 kubelet 在上一步中有所改变,所以重新加载单元文件定义:

    [core@master-X ~]$ sudo systemctl daemon-reload
  8. 重启 kubelet 服务:

    [core@master-X ~]$ sudo systemctl restart kubelet.service
  9. 确保 kubelet 使用正确的主机名引导:

    [core@master-X ~]$ sudo journalctl -fu kubelet.service

如果集群节点在启动并运行集群后没有通过 DHCP 获得正确的主机名(例如在重启过程中),集群将会有一个待处理的 csr不要批准 csr,否则可能会出现其他问题。

处理 csr

  1. 在集群上获取 CSR:

    $ oc get csr
  2. 验证待处理的 csr 是否包含 Subject Name: localhost.localdomain:

    $ oc get csr <pending_csr> -o jsonpath='{.spec.request}' | base64 --decode | openssl req -noout -text
  3. 删除包含 Subject Name: localhost.localdomain 的任何 csr:

    $ oc delete csr <wrong_csr>