Cephadm 故障排除
您可能需要调查 cephadm 命令失败的原因或某个服务不再正常运行的原因。
Cephadm 将守护进程部署为容器。这意味着对那些容器化的守护进程进行故障排除的工作方式可能与您预期的不同(如果您希望此故障排除的工作方式与所涉及的守护程序未容器化时的故障排除方式相同,那肯定是正确的)。
这里有一些工具和命令可帮助您对 Ceph 环境进行故障排除。
暂停或禁用 CEPHADM
如果出现问题并且 cephadm 表现不佳,您可以通过运行以下命令暂停大部分 Ceph 集群的后台活动:
ceph orch pause
这会停止 Ceph 集群中的所有更改,但 cephadm 仍会定期检查主机以刷新其守护进程和设备清单。您可以通过运行以下命令完全禁用 cephadm:
ceph orch set backend ''
ceph mgr module disable cephadm
这些命令禁用所有CLI 命令。所有先前部署的守护程序容器将继续存在,并将像运行这些ceph orch ...命令之前那样启动。
有关禁用单个服务的信息,请参阅禁用守护程序的自动部署。
每个服务和每个守护进程事件
为了帮助调试失败的守护进程部署,cephadm 存储每个服务和每个守护进程的事件。这些事件通常包含与 Ceph 集群故障排除相关的信息。
列出服务事件
要查看与某个服务关联的事件,请运行以下形式的命令:
ceph orch ls --service_name= --format yaml
这将返回以下形式的内容:
service_type: alertmanager
service_name: alertmanager
placement:
hosts:
- unknown_host
status:
...
running: 1
size: 1
events:
- 2021-02-01T08:58:02.741162 service:alertmanager [INFO] "service was created"
- '2021-02-01T12:09:25.264584 service:alertmanager [ERROR] "Failed to apply: Cannot
place on unknown_host: Unknown hosts"'
列出守护进程事件
要查看与某个守护进程关联的事件,请运行以下形式的命令:
ceph orch ps --service-name --daemon-id --format yaml
这将返回以下形式的内容:
daemon_type: mds
daemon_id: cephfs.hostname.ppdhsz
hostname: hostname
status_desc: running
...
events:
- 2021-02-01T08:59:43.845866 daemon:mds.cephfs.hostname.ppdhsz [INFO] "Reconfigured
mds.cephfs.hostname.ppdhsz on host 'hostname'"
检查 CEPHADM 日志
要了解如何在生成 cephadm 日志时对其进行监控,请阅读Watching cephadm log messages。
如果您的 Ceph 集群已配置为将事件记录到ceph.cephadm.log文件中,则会在所有监控主机上 调用一个 cephadm 日志文件(有关此内容的更完整说明,请参见Ceph 守护程序日志)。
收集日志文件
使用 journalctl 收集所有守护进程的日志文件:
笔记: 默认情况下,cephadm 现在将日志存储在 journald 中。这意味着您将无法在/var/log/ceph/找到守护进程输出日志。
要读取一个特定守护程序的日志文件,请运行:
cephadm logs --name
注意:这仅在运行守护程序的同一主机上运行时有效。要获取在不同主机上运行的守护程序的日志,请提供以下--fsid选项:
cephadm logs --fsid --name
其中
要获取给定主机上所有守护进程的所有日志文件,请运行:
for name in $(cephadm ls | jq -r '.[].name') ; do
cephadm logs --fsid --name "$name" > $name;
done
收集系统状态
要打印 systemd 单元的状态,请运行:
systemctl status "ceph-$(cephadm shell ceph fsid)@.service";
要获取给定主机的所有守护程序的所有状态,请运行:
fsid="$(cephadm shell ceph fsid)"
for name in $(cephadm ls | jq -r '.[].name') ; do
systemctl status "ceph-$fsid@$name.service" > $name;
done
列出所有下载的容器镜像
列出主机上下载的所有容器镜像:
笔记: Image也可以称为ImageID
podman ps -a --format json | jq '.[].Image'
"docker.io/library/centos:8"
"registry.opensuse.org/opensuse/leap:15.2"
手动运行容器
Cephadm 编写运行容器的小型包装器。容器执行命令参考 /var/lib/ceph/
SSH 错误
错误信息:
execnet.gateway_bootstrap.HostNotFound: -F /tmp/cephadm-conf-73z09u6g -i /tmp/cephadm-identity-ky7ahp_5 root@10.10.1.2
...
raise OrchestratorError(msg) from e
orchestrator._interface.OrchestratorError: Failed to connect to 10.10.1.2 (10.10.1.2).
Please make sure that the host is reachable and accepts connections using the cephadm SSH key
...
用户可以做的事情:
1.确保 cephadm 具有 SSH 身份密钥:
[root@mon1~]# cephadm shell -- ceph config-key get mgr/cephadm/ssh_identity_key > ~/cephadm_private_key
INFO:cephadm:Inferring fsid f8edc08a-7f17-11ea-8707-000c2915dd98
INFO:cephadm:Using recent ceph image docker.io/ceph/ceph:v15 obtained 'mgr/cephadm/ssh_identity_key'
[root@mon1 ~] # chmod 0600 ~/cephadm_private_key
如果失败,则 cephadm 没有密钥。通过运行以下命令修复此问题:
[root@mon1 ~]# cephadm shell -- ceph cephadm generate-ssh-key
要么:
[root@mon1 ~]# cat ~/cephadm_private_key | cephadm shell -- ceph cephadm set-ssk-key -i -
2.确保 ssh 配置正确:
[root@mon1 ~]# cephadm shell -- ceph cephadm get-ssh-config > config
3.验证我们是否可以连接到主机:
[root@mon1 ~]# ssh -F config -i ~/cephadm_private_key root@mon1
验证公钥是否列在 AUTHORIZED_KEYS 文件中
要验证公钥是否在 authorized_keys 文件中,请运行以下命令:
[root@mon1 ~]# cephadm shell -- ceph cephadm get-pub-key > ~/ceph.pub
[root@mon1 ~]# grep "`cat ~/ceph.pub`" /root/.ssh/authorized_keys
无法推断 CIDR 网络错误
如果您看到此错误:
ERROR: Failed to infer CIDR network for mon ip ***; pass --skip-mon-network to configure it later
或者这个错误:
Must set public_network config option or specify a CIDR network, ceph addrvec, or plain IP
这意味着您必须运行以下形式的命令:
ceph config set mon public_network
有关此类操作的更多详细信息,请参阅部署其他监视器
访问管理套接字
每个 Ceph 守护进程都提供了一个绕过 MON 的管理套接字(请参阅使用管理套接字)。
要访问管理套接字,首先进入主机上的守护进程容器:
[root@mon1 ~]# cephadm enter --name
[ceph: root@mon1 /]# ceph --admin-daemon /var/run/ceph/ceph-.asok config show
调用各种 CEPH 工具
要调用诸如 ceph-objectstore-toolor 之类的杂项 ceph-monstore-tool,您可以通过如下调用 cephadm shell --name
root@myhostname # cephadm unit --name mon.myhostname stop
root@myhostname # cephadm shell --name mon.myhostname
[ceph: root@myhostname /]# ceph-monstore-tool /var/lib/ceph/mon/ceph-myhostname get monmap > monmap
[ceph: root@myhostname /]# monmaptool --print monmap
monmaptool: monmap file monmap
epoch 1
fsid 28596f44-3b56-11ec-9034-482ae35a5fbb
last_changed 2021-11-01T20:57:19.755111+0000
created 2021-11-01T20:57:19.755111+0000
min_mon_release 17 (quincy)
election_strategy: 1
0: [v2:127.0.0.1:3300/0,v1:127.0.0.1:6789/0] mon.myhostname
此命令以适合扩展守护程序维护和交互运行守护程序的方式设置环境。
恢复 MON 仲裁
如果 Ceph MON 无法形成仲裁,则 cephadm 无法管理集群,直到恢复仲裁。
为了恢复 MON quorum,请按照以下步骤从 monmap 中删除不健康的 MON:
1.停止所有 MON。对于每个 MON 主机:
ssh {mon-host}
cephadm unit --name mon.`hostname` stop
2.识别一个幸存的监视器并登录到该主机:
ssh {mon-host}
cephadm enter --name mon.`hostname`
3.按照从不健康的集群中删除监视器中的步骤进行操作: https://docs.ceph.com/en/pacific/rados/operations/add-or-rm-mons/#rados-mon-remove-from-unhealthy
手动部署 MGR 守护进程
cephadm 需要一个 MGR 守护进程来管理集群。如果集群的最后一个 MGR 被删除,请按照以下步骤在mgr.hostname.smfvfd集群的随机主机上手动部署 MGR。
禁用 cephadm 调度程序,以防止 cephadm 删除新的 MGR。请参阅启用 Ceph CLI:
ceph config-key set mgr/cephadm/pause true
然后为新的 MGR 获取或创建 auth 条目:
ceph auth get-or-create mgr.hostname.smfvfd mon "profile mgr" osd "allow *" mds "allow *"
获取 ceph.conf:
ceph config generate-minimal-conf
获取容器镜像:
ceph config get "mgr.hostname.smfvfd" container_image
创建一个config-json.json包含部署守护程序所需信息的文件:
{
"config": "# minimal ceph.conf for 8255263a-a97e-4934-822c-00bfe029b28f\n[global]\n\tfsid = 8255263a-a97e-4934-822c-00bfe029b28f\n\tmon_host = [v2:192.168.0.1:40483/0,v1:192.168.0.1:40484/0]\n",
"keyring": "[mgr.hostname.smfvfd]\n\tkey = V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4=\n"
}
部署守护进程:
cephadm --image deploy --fsid --name mgr.hostname.smfvfd --config-json config-json.json
分析核心转储
如果 Ceph 守护进程崩溃,cephadm 支持分析核心转储。要启用核心转储,请运行
ulimit -c unlimited
核心转储现在将被写入/var/lib/systemd/coredump.
笔记: 核心转储没有被内核命名空间,这意味着它们将被写入/var/lib/systemd/coredump容器主机上。
现在,等待崩溃再次发生。(要模拟守护进程的崩溃,请运行?? killall -3 ceph-mon )
通过进入 cephadm shell 安装调试包并安装ceph-debuginfo:
# cephadm shell --mount /var/lib/systemd/coredump
[ceph: root@host1 /]# dnf install ceph-debuginfo gdb zstd
[ceph: root@host1 /]# unzstd /mnt/coredump/core.ceph-*.zst
[ceph: root@host1 /]# gdb /usr/bin/ceph-mon /mnt/coredump/core.ceph-...
(gdb) bt
#0 0x00007fa9117383fc in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007fa910d7f8f0 in std::condition_variable::wait(std::unique_lock&) () from /lib64/libstdc++.so.6
#2 0x00007fa913d3f48f in AsyncMessenger::wait() () from /usr/lib64/ceph/libceph-common.so.2
#3 0x0000563085ca3d7e in main ()