Skip to main content

计算节点 Host 服务问题排查

Host服务可能因为各种原因启动失败,现象为Host服务重启之后,在云平台宿主机列表,宿主机的状态一直为离线。

本文介绍一般的排查问题的思路。

Host服务对应容器Pod介绍

首先,我们需要了解Host服务对应的Pod。

Host服务由k8s的onecloud命名空间下的Daemonset default-host定义,在每个节点上都会运行一个名为 default-host-xxxxx 的容器,其中 xxxxx 为随机的字符串。

default-host pod中有三个容器:

容器名称功能
hostHost服务的主服务进程,实现和控制器的通信,控制qemu虚拟机进程,管理存储和网络
ovn-controllerovn在每个节点的控制进程,从ovn-northd维护的数据库同步节点配置信息,并下发到ovs
sdnagent实现经典网络的安全组和流控,VPC网络辅助ovn-controller实现VPC网络功能

定位宿主机的host容器

通过如下命里找到在指定宿主机上运行的Host容器

kubectl -n onecloud get pods -o wide | grep <ip_of_host>

例如:

# kubectl -n onecloud get pods -o wide | grep office-03-host01
default-host-xc2t5 3/3 Running 0 4h7m 192.168.222.3 office-03-host01 <none> <none>
default-host-deployer-zv6tk 1/1 Running 0 5d15h 10.40.33.249 office-03-host01 <none> <none>
default-host-image-cql69 1/1 Running 132 128d 192.168.222.3 office-03-host01 <none> <none>
default-telegraf-q8fl9 2/2 Running 40 128d 192.168.222.3 office-03-host01 <none> <none>

这几个Pod的功能解释如下:

Pod说明
default-host-xxxxxDaemonSet default-host 的pod
default-host-deployer-xxxxxDaemonSet default-host-deployer 的pod,实现虚拟机磁盘的初始化和识别
default-host-image-xxxxxDaemonSet default-host-image 的pod,实现本地虚拟机磁盘的读取
default-telegraf-xxxxxDaemonSet default-telegraf 的pod,实现宿主机的监控数据采集

重启Host服务

有时候,重启就能解决问题,重启host服务只需要删除对应的pod,k8s会立即重建对应pod,实现host服务的重启.

kubectl -n onecloud delete pods default-host-xxxxx

查看Host服务的日志

采用如下命令查看Host服务的日志。由于host pod中有三个容器,因此需要用 -c 参数指定容器(-c host)。

# 查看 host 服务本次启动所有的日志
$ kubectl -n onecloud logs default-host-xxxxx -c host

# 查看从过去10分钟开始(--since 10m)的host容器的日志,并且不退出(-f),持续输出日志到控制台
$ kubectl -n onecloud logs default-host-xxxxx -c host --since 10m -f

Host服务在启动时会执行如下检查:

  • 设置和优化内核参数,例如io调度器参数
  • 检查关键软件,例如qemu,内核nbd模块,openvswitch等
  • 初始化并配置网络
  • 初始化并配置存储
  • ...

在每一步都可能出错,此时可以通过查看输出日志,定位原因。

常见问题

宿主机安装Host服务完成后,默认处于禁用状态,需要启用后使用。宿主机启用方法如下:

  • 在云管平台的宿主机列表中启用该宿主机;

  • 在控制节点使用climc命令启用该宿主机;

    $ climc host-enable id

Host服务为什么会变成离线?

region的HostPingDetectionTask将超过3分钟未收到ping的host服务置为offline,并将宿主机上的虚拟机状态设置为unknown。

宿主机的Host服务启动失败,且报错“Fail to get network info:no networks”,该怎么解决?

该问题一般是没有为宿主机网卡的IP地址注册IP子网,云平台根据此信息判断宿主机对接的二层网络信息。为解决这个问题,需要在云管平台为宿主机创建一个包含宿主机IP地址的IP子网或使用climc命令在控制节点创建一个网络。

$ climc network-create bcast0 host02  10.168.222.226  10.168.222.226 24 --gateway 10.168.222.1

宿主机MAC改变会导致Host服务离线,需要更改宿主机在平台注册的MAC地址,具体步骤如下

  • 例如,宿主机IP地址为100.91.1.22,其MAC从18:9b:a5:81:4f:17变为18:9b:a5:81:4f:16

    # 092231af-eebc-456f-8a21-3ab7c944f20c为宿主机id,97e29a73-6615-4d5b-8b67-96bb13b80b90为宿主机所在二层网络的id
    $ climc host-remove-netif 092231af-eebc-456f-8a21-3ab7c944f20c 18:9b:a5:81:4f:17
    $ climc host-add-netif --ip 100.91.1.22 092231af-eebc-456f-8a21-3ab7c944f20c 97e29a73-6615-4d5b-8b67-96bb13b80b90 18:9b:a5:81:4f:16 0

宿主机网卡刚开始没有做bonding,做了bonding之后,如何不重启宿主机变更配置?

假设刚开始宿主机用物理网卡 eth0 作为管理网网卡接入云平台,其IP地址为192.168.201.20。对应/etc/yunion/host.conf配置为:

networks:
- eth0/br0/192.168.201.20

云平台部署完成后,管理员将 eth0 和 eth1 绑定设置为 bond0,IP地址仍然是 192.168.201.20,则需要修改 /etc/yunion/host.conf 配置为:

networks:
- bond0/br0/192.168.201.20

由于openvswitch会记忆配置在ovsdb中,此时,网桥br0已经将eth0加入,如果不做配置,则br0依然还会将eth0加入网桥。因此需要手动将eth0从br0删除:

ovs-vsctl del-port br0 eth0

此时,为了让配置生效,比较简便的方法是重启宿主机。

如果宿主机不方便重启,则需要手动执行以下操作:

1、拉起bond0

首先确保bond0的配置(/etc/sysconfig/network-scripts/ifcfg-bond0,ifcfg-eth0,ifcfg-eth1)已经正确配置。重启网络:

systemctl restart network

2、清除bond0上的IP地址

重启网络后,IP地址配置在bond0上,同时br0上也有同样的IP地址。则需要清除bond0的IP:

ifconfig bond0 0

3、将eth0从br0移除,并将bond0加入br0

ovs-vsctl del-port br0 eth0
ovs-vsctl add-port br0 bond0

存储介质识别不准,例如机械盘识别成固态

例如用户使用SSD 做lvmcache 等情况,可能造成宿主机本地存储介质识别不准,可自行前往对应宿主机->存储->对应存储介质 修改属性,选择介质类型修改即可。

禁用 dhcp 服务

如果你看到了这样的提示:dhcp: dhcp client is enabled before host agent start, please disable it.

说明你的机器之前启用过dhcp client.

如何禁用 dhcp client:

# 一般 centos7 的 dhcp client 都是由 NetworkManager 启动的
$ systemctl disable NetworkManager --now

# 我们会检查 /var/run/dhclient-<nic>.pid 下是否有dhclient的pid文件来决定是否要输出 warning
# 所以同时你需要清除 /var/run 下的 dhclient-<nic>.pid 文件, nic 需要替换成自己的网卡名,如 eth0
$ rm -f /var/run/dhclient-<nic>.pid