.. _debug_ceph_authenticate_time_out:
==========================================================
排查Ceph部署"monclient(hunting): authenticate timed out"
==========================================================
异常现象
=========
:ref:`install_mobile_cloud_ceph` 我遇到问题是虽然能启动第二和第三节点上的 ``ceph-mon`` ,但是
- 在 ``$HOST_1`` 完成 :ref:`mobile_cloud_ceph_mon` , :ref:`mobile_cloud_ceph_mgr` 和 :ref:`mobile_cloud_ceph_add_ceph_osds_lvm` 上执行 ``ceph -s`` 是正常的
- 但是在 ``$HOST_2`` 和 ``$HOST_3`` 上完成 :ref:`mobile_cloud_ceph_add_ceph_mons` 就发现 ``$HOST_1`` 上执行 ``ceph -s`` 没有响应,过了很久终端上显示::
2022-12-14T08:58:38.817+0800 ffffb4ede1a0 0 monclient(hunting): authenticate timed out after 300
2022-12-14T09:03:38.826+0800 ffffb4ede1a0 0 monclient(hunting): authenticate timed out after 300
...
而在 第二 ``a-b-data-2`` 和第三节点 ``a-b-data-3`` 执行 ``ceph -s`` 终端提示错误::
2022-12-12T11:40:04.309+0800 ffffa61ce1a0 -1 monclient(hunting): handle_auth_bad_method server allowed_methods [2] but i only support [2]
2022-12-12T11:40:10.319+0800 ffffa61ce1a0 -1 monclient(hunting): handle_auth_bad_method server allowed_methods [2] but i only support [2]
- 执行 ``systemctl status ceph-mon@$(hostname -s)``
在 ``$HOST_1`` 上显示正常::
Dec 14 00:54:48 a-b-data-1.dev.cloud-atlas.io systemd[1]: Started ceph-mon@a-b-data-1.service - Ceph cluster monitor daemon.
但是 ``$HOST_2`` 和 ``$HOST_3`` 则显示::
Dec 14 00:55:34 a-b-data-2.dev.cloud-atlas.io systemd[1]: Started ceph-mon@a-b-data-2.service - Ceph cluster monitor daemon.
Dec 14 00:55:34 a-b-data-2.dev.cloud-atlas.io ceph-mon[1506]: 2022-12-14T00:55:34.638+0800 ffff84a0b040 -1 WARNING: 'mon addr' config option v1:192.168.8.205:6789/0 does not match monmap file
Dec 14 00:55:34 a-b-data-2.dev.cloud-atlas.io ceph-mon[1506]: continuing with monmap configuration
尝试排查
===========
补全 ``ceph.con`` 配置中 ``mon host`` (无效)
-----------------------------------------------
- 最初我以为是忘记 "调整配置添加新增 ceph-mon 节点" ,所以修订每个服务器上的 ``/etc/ceph/ceph.conf`` 配置,将新增节点配置加入::
[global]
fsid = 598dc69c-5b43-4a3b-91b8-f36fc403bcc5
mon initial members = a-b-data-1,a-b-data-2,a-b-data-3
mon host = 192.168.8.204,192.168.8.205,192.168.8.206
...
然后重启 ``ceph-mon`` 服务。但是发现 ``ceph -s`` 依然卡住
回滚 ``auth_allow_insecure_global_id_reclaim`` 恢复 ``true`` (无效)
----------------------------------------------------------------------
参考 `Re: monclient(hunting): handle_auth_bad_method server allowed_methods [2] but i only support [2] `_ 提到:
ceph 升级到 14.2.20, 15.2.11 或者 16.2.1 版本,并且设置 ``auth_allow_insecure_global_id_reclaim`` 为 ``false`` 的时候,会出现上述报错。
我检查了我当前版本 ``ceph -v`` 显示为 ``17.2.5`` ,之前在 :ref:`zdata_ceph` 使用的版本是 ``17.2.0`` 。似乎不是这个原因,但是我也怀疑是当时完全部署好3个 ``ceph-mon`` 之后再做的开关切换所以没影响(这个推测是错误的)
尝试解决步骤:
- 我首先想暂时恢复 ``auth_allow_insecure_global_id_reclaim`` ,所以在节点1上执行::
sudo ceph config set mon auth_allow_insecure_global_id_reclaim true
但是很不幸,由于已经将节点2和3加入了 ``ceph-mon`` 的monmap,无法更新,一直卡住。怎么办呢?
参考 `After upgrade to 15.2.11 no access to cluster any more `_ 执行以下命令直接设置本机的ceph mon服务(需要在每个节点上分别执行)::
sudo ceph daemon mon.`hostname -s` config set auth_allow_insecure_global_id_reclaim true
上述命令不会去连接集群的其他节点,所以能够正确执行,返回信息::
{
"success": "auth_allow_insecure_global_id_reclaim = 'true' (not observed, change may require restart) "
}
然后重启每个节点服务::
sudo systemctl restart ceph-mon@`hostname -s`
没有解决
重新部署并排查
=====================
我重新部署了一遍,步骤中暂时去掉了 ``auth_allow_insecure_global_id_reclaim`` 配置调整,但是报错依旧。
发现 ``monmap`` 不一致
----------------------------
我发现存在一个蹊跷的地方(后来发现不是这个原因,这个只是因为没有启用 ``msgr2`` 导致)::
sudo ceph mon getmap -o /tmp/monmap
monmaptool --print /tmp/monmap
显示输出::
monmaptool: monmap file /tmp/monmap
epoch 1
fsid 598dc69c-5b43-4a3b-91b8-f36fc403bcc5
last_changed 2022-12-12T23:28:26.845735+0800
created 2022-12-12T23:28:26.845735+0800
min_mon_release 17 (quincy)
election_strategy: 1
0: v1:192.168.8.204:6789/0 mon.a-b-data-1
1: [v2:192.168.8.205:3300/0,v1:192.168.8.205:6789/0] mon.a-b-data-2
2: [v2:192.168.8.206:3300/0,v1:192.168.8.206:6789/0] mon.a-b-data-3
奇怪,为何第一个部署节点使用的是 ``v1`` mon,而第二个节点和第三个节点既有 ``v1`` 又有 ``v2``
我马上到我之前 :ref:`install_ceph_manual` 成功的集群上检查发现,正常集群的3个节点 ``monmap`` 是一样的::
monmaptool: monmap file /tmp/monmap
epoch 4
fsid 0e6c8b6f-0d32-4cdb-a45d-85f8c7997c17
last_changed 2022-11-07T23:40:25.922046+0800
created 2021-12-01T16:57:40.856830+0800
min_mon_release 17 (quincy)
election_strategy: 1
0: [v2:192.168.6.204:3300/0,v1:192.168.6.204:6789/0] mon.z-b-data-1
1: [v2:192.168.6.205:3300/0,v1:192.168.6.205:6789/0] mon.z-b-data-2
2: [v2:192.168.6.206:3300/0,v1:192.168.6.206:6789/0] mon.z-b-data-3
参考 `Troubleshooting Ceph Monitors and Ceph Managers `_ 提到对于 ``ceph -s`` 没有相应的话,可以到每个节点执行 ``ceph tell mon.ID mon_status`` ( ID 是 monitor的identifier ),例如,我在执行::
ceph tell mon.$(hostname -s) mon_status
不过,也卡住没有输出
尝试调整 ``ceph.conf`` 中 ``mon addr``
-----------------------------------------
我发现 ``systemctl status ceph-mon@$(hostname -s)`` 提示的是::
WARNING: 'mon addr' config option v1:192.168.8.205:6789/0 does not match monmap file
那么我的 ``$HOST_2`` 节点既然从 ``monmap`` 显示有 ``v2:192.168.8.205:3300/0`` ,是不是要改成 ``192.168.8.205:3300`` 配置呢?
我将 ``/etc/ceph/ceph.conf`` 配置调整成::
[mon.a-b-data-1]
host = a-b-data-1
mon addr = 192.168.8.204:6789
[mon.a-b-data-2]
host = a-b-data-2
mon addr = 192.168.8.205:3300
[mon.a-b-data-3]
host = a-b-data-3
mon addr = 192.168.8.206:3300
然后在 ``$HOST_2`` 重启 ``ceph-mon`` ,果然警告不一样了,显示::
Dec 14 09:59:30 a-b-data-2.dev.cloud-atlas.io ceph-mon[2456]: 2022-12-14T09:59:30.837+0800 ffffbc2bb040 -1 WARNING: 'mon addr' config option v2:192.168.8.205:3300/0 does not match monmap file
Dec 14 09:59:30 a-b-data-2.dev.cloud-atlas.io ceph-mon[2456]: continuing with monmap configuration
但是我尝试调整::
[mon.a-b-data-2]
host = a-b-data-2
mon addr = 192.168.8.205:3300,192.168.8.205:6789
提示信息显示语法错误::
Dec 14 10:05:35 a-b-data-2.dev.cloud-atlas.io ceph-mon[2615]: 2022-12-14T10:05:35.457+0800 ffff8813b040 -1 WARNING: invalid 'mon addr' config option
Dec 14 10:05:35 a-b-data-2.dev.cloud-atlas.io ceph-mon[2615]: continuing with monmap configuration
很惊讶,我回头去看我曾经部署成功的 :ref:`install_ceph_manual` ,我发现当时是移除了 ``[mon.z-b-data-2]`` 等配置的,也就是说,根本没有 ``[mon.$(hostname -s)]`` 配置段落,所以也不会有WARNING
我清理掉 ``/etc/ceph/ceph.conf`` 中 ``[mon.$(hostname -s)]`` 配置段落,果然 ``systemcto status ceph-mon@$(hostname -s)`` 没有WARNING了::
Dec 14 10:16:36 a-b-data-2.dev.cloud-atlas.io systemd[1]: Started ceph-mon@a-b-data-2.service - Ceph cluster monitor daemon.
不过 ``ceph -s`` 还没有解决卡住无输出的问题,继续探索
奇怪的DNS解析
================
我最初有点怀疑是三个节点的时钟不同步,不过 :ref:`mobile_cloud_ceph_mon_clock_sync` 配置过NTP,检查各个节点的时间也一致。
但是,我偶然在 ``$HOST_1`` 上查询::
host a-b-data-1
发现在第一条记录显示后,出现超时::
a-b-data-1 has address 192.168.8.204
;; communications error to 127.0.0.53#53: timed out
;; communications error to 127.0.0.53#53: timed out
;; no servers could be reached
不过,如果是完整域名::
host a-b-data-1.dev.cloud-atlas.io
则响应正常快速::
a-b-data-1.dev.cloud-atlas.io has address 192.168.8.204
如果在 ``a-b-data-1`` 上查询其他主机(短域名),返回记录不存在::
# host a-b-data-3
a-b-data-3 has address 192.168.8.206
Host a-b-data-3 not found: 3(NXDOMAIN)
这个问题在于,集群没有部署统一的DNS,而是依赖系统运行的 ``systemd-resolved`` 提供解析,实际上就是公网DNS解析。而我在每个服务器上 ``/etc/hosts`` 确实已经写好了每个主机的解析::
192.168.8.204 a-b-data-1 a-b-data-1.dev.cloud-atlas.io
192.168.8.205 a-b-data-2 a-b-data-2.dev.cloud-atlas.io
192.168.8.206 a-b-data-3 a-b-data-3.dev.cloud-atlas.io
所以 ``hosts`` 查询DNS解析时候,从 ``/etc/hosts`` 可以读到主机名解析
但是,通过 :ref:`systemd_resolved` 解析, ``systemd-resolved`` 服务会根据 ``/run/systemd/resolve/resolv.conf`` 查询上级DNS,也就是 :ref:`libvirt_nat_network` 网络提供的DNS。我检查发现服务器的 ``/run/systemd/resolve/resolv.conf`` 比较奇怪::
nameserver 192.168.8.1
search .
为何没有配置 ``search dev.cloud-atlas.io`` 域名? (这个配置是装机时候配置的,难道我漏设置了?)
我对比了正常 :ref:`install_ceph_manual` 中的服务器 ``/run/systemd/resolve/resolv.conf`` ,发现包含了域名::
nameserver 192.168.6.200
search staging.huatai.me
注意,这个 ``/run/systemd/resolve/resolv.conf`` 不能直接修改,如果直接修改重启 ``systemd-resolved`` 也会覆盖。
修订 ``systemd-resolved`` 的 ``search`` 配置是修改 ``/etc/systemd/resolved.conf`` 配置::
Domains=dev.cloud-atlas.io
然后重启 ``systemd-resolved`` ::
systemctl restart systemd-resolved
这样现在执行::
host a-b-data-1
就立即返回数据::
a-b-data-1.dev.cloud-atlas.io has address 192.168.8.204
毫无阻碍
.. note::
不过,此时还是没有解决 ``ceph -s`` 卡住问题
这个步骤至少解决了域名解析的问题(虽然没有针对解决这个问题)
**悲剧** ``低级错误`` firewalld防火墙阻塞
===========================================
偶然看到有人提到服务器重启以后 ``ceph`` 命令无响应,通过关闭 ``firewalld`` 解决的。我倒,我马上看了一下::
systemctl status firewalld
果然,是运行状态::
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
Active: active (running) since Wed 2022-12-14 17:09:32 CST; 30s ago
Docs: man:firewalld(1)
Main PID: 1628 (firewalld)
Tasks: 2 (limit: 6961)
Memory: 23.6M
CPU: 339ms
CGroup: /system.slice/firewalld.service
└─1628 /usr/bin/python3 -sP /usr/sbin/firewalld --nofork --nopid
Dec 14 17:09:32 a-b-data-2.dev.cloud-atlas.io systemd[1]: Starting firewalld.service - firewalld - dynamic firewall daemon...
Dec 14 17:09:32 a-b-data-2.dev.cloud-atlas.io systemd[1]: Started firewalld.service - firewalld - dynamic firewall daemon.
但是,
**firewalld不是iptables!!!**
**firewalld不是iptables!!!**
**firewalld不是iptables!!!**
其实我最初是检查过防火墙的,我的经验是 :ref:`iptables` ,所以我特意检查过::
iptables -L
显示输出系统没有配置 ``iptables`` ,这个链表都是空的::
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我大意了... 我没有想到 :ref:`fedora` 默认不启用 ``iptables`` (所以空表),而是使用了 :ref:`firewalld` 防火墙。该死的, ``firewalld`` 是取代 :ref:`iptables` ( ``netfilter`` ) 的 ``nftables`` 实现 ,所以导致我没有意识到端口默认屏蔽。(不过,我为什么不早点测试端口连通性呢?)
- 查看 ``firewalld`` 配置:
.. literalinclude:: ../../../linux/redhat_linux/admin/firewalld/firewall_cmd_list
:language: bash
:caption: 检查主机所有firewalld配置概要
输出显示默认防火墙之开启了 ``cockpit dhcpv6-client ssh`` 服务器访问:
.. literalinclude:: debug_ceph_authenticate_time_out/firewall_cmd_list_output
:language: bash
:caption: 检查firewalld配置输出
:emphasize-lines: 6
- 关闭 ``firewalld`` 防火墙,问题解决:
.. literalinclude:: ../../../linux/redhat_linux/admin/firewalld/stop_firewalld
:language: bash
:caption: 停止firewalld服务
参考
========
- `CEPH by hand `_