«

使用 cephadm 部署 Ceph 集群并配置 NFS 存储

myluzh 发布于 阅读:16 Kubernetes


0x00 环境说明

这篇记录一下使用 cephadm 部署 Ceph 集群的过程,后面顺手把 CephFS 和 NFS 也配置好,方便给其他业务挂载使用。

我这里的环境是 5 台节点,每台节点 4 块 500G 数据盘:

主机名 IP 角色
ceph1 192.168.2.101 bootstrap / mon / mgr / osd
ceph2 192.168.2.102 mon / mgr / osd
ceph3 192.168.2.103 mon / mgr / osd
ceph4 192.168.2.104 mon / mgr / osd
ceph5 192.168.2.105 mon / mgr / osd

版本和规划:

Ceph 默认是三副本机制,不是说集群里有 10T 磁盘就能给业务用 10T。生产上要提前把副本、故障域、磁盘数量都算清楚,不然后面扩容会比较被动。

下面命令默认使用 root 执行,管理节点默认是 ceph1

关于容量公式计算

1、Bennet Gallein Ceph Calculator
https://bennetgallein.de/tools/ceph-calculator

手动算也很快,公式就是:
可用容量 = (节点数 × 每节点盘数 × 单盘容量) / 副本数
举例 3 台 × 4 块 × 500G / 3 副本 = 2T 可用

0x01 Ceph 组件简单说明

先把几个常见组件过一下,后面看命令会比较清楚。

组件 说明
MON Monitor,维护集群 map、选举、仲裁,保证集群状态一致
MGR Manager,负责 Dashboard、Prometheus、orchestrator 等管理能力
OSD Object Storage Daemon,真正负责数据读写、复制、恢复、平衡
MDS Metadata Server,CephFS 元数据服务,只有用 CephFS 时才需要
RADOS Ceph 底层对象存储系统,块、文件、对象最终都落到 RADOS
RGW Rados Gateway,提供 S3 / Swift 这种对象存储接口
CephFS Ceph 文件系统,可以像普通文件系统一样挂载使用
cephadm 官方部署和运维工具,基于容器管理 Ceph daemon

这篇主要用到 MONMGROSDCephFSNFS 这几块。

0x02 所有节点初始化

配置 hosts

所有节点写同一份 hosts,主机名和解析一定要对齐。

cat >>/etc/hosts <<'EOF'
192.168.2.101 ceph1
192.168.2.102 ceph2
192.168.2.103 ceph3
192.168.2.104 ceph4
192.168.2.105 ceph5
EOF

如果 hostname 还没固定,可以顺手改掉:

hostnamectl set-hostname ceph1
# hostnamectl set-hostname ceph2
# hostnamectl set-hostname ceph3
# hostnamectl set-hostname ceph4
# hostnamectl set-hostname ceph5

安装基础依赖

所有节点安装基础工具、时间同步和 LVM。

apt-get update
apt-get install -y curl chrony lvm2

systemctl enable --now chrony
systemctl status chrony --no-pager

Ceph 对时间比较敏感,尤其是 MON,如果时间漂移太大,后面会出现各种奇怪的健康告警。

安装 docker

所有节点安装 docker,我这里直接用自己的安装脚本。

# 海外机器
curl -s https://oss.zywjjj.vip/docker-install.sh | bash -

# 国内机器
curl -s https://oss.zywjjj.vip/docker-install.sh | bash -s -- --mirror Aliyun

安装完检查一下:

docker version
systemctl enable --now docker

0x03 安装 cephadm

这里只需要在管理节点 ceph1 执行。

CEPH_RELEASE=17.2.7

curl --silent --remote-name --location \
  https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm

chmod +x cephadm
mv cephadm /usr/sbin/cephadm

cephadm version

如果下载比较慢,可以提前把 ceph 镜像拉下来:

docker pull quay.io/ceph/ceph:v17.2.7

0x04 bootstrap 初始化集群

后面的集群初始化操作都在 ceph1 执行。

cephadm bootstrap --mon-ip 192.168.2.101

正常会看到类似输出:

Creating directory /etc/ceph for ceph.conf
Verifying podman|docker is present...
Verifying lvm2 is present...
Verifying time synchronization is in place...
Host looks OK
Cluster fsid: 44982f32-6c23-11ef-8e35-f1d0f3adcf6f
Creating initial keys...
Creating mon...
Creating mgr...
Enabling cephadm module...
Setting orchestrator backend to cephadm...
Generating ssh key...
Adding host ceph1...
Deploying mon service with default placement...
Deploying mgr service with default placement...
Deploying prometheus service with default placement...
Deploying grafana service with default placement...
Deploying alertmanager service with default placement...
Enabling the dashboard module...
Ceph Dashboard is now available at:

             URL: https://ceph1:8443/
            User: admin
        Password: <bootstrap 输出的随机密码>

Bootstrap complete.

这里会生成几类关键文件:

ceph.client.admin.keyring 是管理员 key,不要贴到公网文章或者聊天群里。

Dashboard 地址:

https://ceph1:8443/

Ceph Dashboard

验证集群状态:

# 进入 cephadm shell
cephadm shell

# 查看集群状态
ceph -s

也可以直接这样执行:

cephadm shell -- ceph -s
cephadm shell -- ceph orch ps

查看容器:

docker ps | grep ceph

0x05 添加 OSD

查看可用磁盘

先看哪些盘可以作为 OSD。

cephadm shell -- ceph orch device ls --wide --refresh

如果磁盘干净,Available 一般会显示 Yes。如果已经有分区、文件系统、LVM 信息,通常会显示 No

OSD device list

我这里集群已经搭完,磁盘已经被 OSD 占用了,所以后面会看到 AvailableNo

OSD device used

给当前节点添加 OSD

比如 ceph1 上的数据盘是 /dev/sdb/dev/sdc/dev/sdd

ceph orch daemon add osd ceph1:/dev/sdb
ceph orch daemon add osd ceph1:/dev/sdc
ceph orch daemon add osd ceph1:/dev/sdd

也可以直接循环:

for i in {b..d}; do
  ceph orch daemon add osd ceph1:/dev/sd${i}
done

创建完成后检查:

ceph osd tree
ceph -s

删除 OSD

删除 OSD 会影响数据,生产环境不要直接复制执行,先确认副本恢复、集群健康和 OSD ID。

# 查看 OSD ID
ceph osd tree

# 删除 OSD
ceph orch osd rm <osd_id>

# 擦除指定磁盘上的 Ceph/LVM 信息
ceph orch device zap <hostname> <device-path> --force

例子:

ceph orch osd rm 2
ceph orch device zap ceph1 /dev/sdd --force

如果只是实验环境要重新做一遍,建议把盘上的分区、LVM、文件系统签名都清干净:

wipefs -a /dev/sdd
sgdisk --zap-all /dev/sdd

0x06 添加其他主机

bootstrap 的时候 cephadm 会生成一把集群管理用的 SSH 公钥:

ls -l /etc/ceph/ceph.pub

把这把公钥导入到其他节点:

for i in {2..5}; do
  ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph${i}
done

把节点加入集群:

for i in {2..5}; do
  ceph orch host add ceph${i} 192.168.2.10${i}
done

查看主机:

ceph orch host ls

Ceph hosts

如果想让其他节点也能直接执行管理命令,可以给节点加 _admin 标签。

ceph orch host label add ceph2 _admin

_admin 标签的节点会同步 /etc/ceph/ceph.conf/etc/ceph/ceph.client.admin.keyring

0x07 给所有节点添加 OSD

如果 ceph2ceph5 也都是 /dev/sdb/dev/sdc/dev/sdd 作为数据盘,可以直接循环添加:

for h in {2..5}; do
  for i in {b..d}; do
    ceph orch daemon add osd ceph${h}:/dev/sd${i}
  done
done

观察 OSD 创建过程:

ceph -s
ceph osd tree
ceph orch ps --daemon_type osd

如果某台机器迟迟不创建 OSD,先看设备为什么不可用:

ceph orch device ls --hostname ceph2 --wide --refresh

常见原因:

0x08 管理 Ceph daemon

查看所有服务:

ceph orch ps

正常情况下会看到这些服务:

如果 mgrmon 数量不符合预期,可以重新 apply。

# 先 dry-run 看看会怎么调整
ceph orch apply mgr --placement="ceph1 ceph2 ceph3 ceph4 ceph5" --dry-run

# 确认没问题再执行
ceph orch apply mgr --placement="ceph1 ceph2 ceph3 ceph4 ceph5"

删除主机前要先迁移或者删除上面的 daemon,尤其是 OSD。

# 示例,按实际 daemon 名称替换
ceph orch daemon rm mon.ceph5
ceph orch daemon rm mgr.ceph5

# 确认节点上没有 daemon 后再移除主机
ceph orch host rm ceph5

生产环境下移除 OSD 要先看数据恢复状态:

ceph -s
ceph health detail
ceph osd df tree

0x09 创建 CephFS

先确认 MDS 服务。

ceph fs volume ls

创建一个 CephFS:

ceph fs volume create cephfs

再次查看:

ceph fs volume ls

正常输出类似:

[
    {
        "name": "cephfs"
    }
]

查看 MDS:

ceph orch ps --daemon_type mds
ceph fs status cephfs

0x0A 配置 NFS-Ganesha

开启 NFS 模块

先看 nfs 模块有没有启用:

ceph mgr module ls | grep nfs

如果没有返回,就手动启用:

ceph mgr module enable nfs

创建 NFS 集群

先查看已有的 NFS 集群:

ceph nfs cluster ls

没有的话创建一个:

ceph nfs cluster create nfs-ceph "ceph1 ceph2"

这里的意思是创建一个 nfs-ceph 集群,NFS 服务放在 ceph1ceph2 上。

查看详情:

ceph nfs cluster info nfs-ceph
ceph orch ps --daemon_type nfs

创建 NFS 导出

把上面创建的 cephfs 通过 NFS 导出:

ceph nfs export create cephfs \
  --cluster-id nfs-ceph \
  --pseudo-path /data \
  --fsname cephfs \
  --path=/

查看导出:

ceph nfs export ls nfs-ceph
ceph nfs export get nfs-ceph /data

客户端挂载测试:

mkdir -p /mnt/ceph-nfs
mount -t nfs -o nfsvers=4.1,proto=tcp 192.168.2.101:/data /mnt/ceph-nfs

df -Th | grep ceph-nfs

0x0B 创建高可用 NFS VIP

如果要用 VIP 方式对外提供 NFS,可以创建带 ingress 的 NFS 集群。

ceph nfs cluster create nfs-ha "ceph1 ceph2 ceph3 ceph4" \
  --port 6666 \
  --ingress \
  --virtual-ip 192.168.2.200

这里:

查看:

ceph nfs cluster info nfs-ha
ceph orch ps | grep nfs
ceph orch ps | grep ingress

使用 VIP 挂载:

mkdir -p /mnt/ceph-nfs-ha
mount -t nfs -o port=6666,nfsvers=4.1,proto=tcp \
  192.168.2.200:/data /mnt/ceph-nfs-ha

如果业务侧不想感知后端 NFS 节点变化,用 VIP 会方便很多。

0x0C 直接挂载 CephFS

除了 NFS,也可以直接用 Ceph 客户端挂载 CephFS。

客户端先安装 ceph-common

apt-get update
apt-get install -y ceph-common

在管理节点创建一个只访问 cephfs 的 key:

ceph fs authorize cephfs client.cephfs / rw -o ceph.client.cephfs.keyring

查看 keyring:

cat ceph.client.cephfs.keyring

内容类似:

[client.cephfs]
        key = <client.cephfs 的 key>

挂载时不要把 key 写死到文章里,可以用变量或者 secretfile。

CEPH_KEY=$(awk '/key =/{print $3}' ceph.client.cephfs.keyring)

mkdir -p /mnt/cephfs
mount -t ceph 192.168.2.101:6789:/ /mnt/cephfs \
  -o name=cephfs,secret="${CEPH_KEY}"

也可以使用 secretfile

awk '/key =/{print $3}' ceph.client.cephfs.keyring > /etc/ceph/cephfs.secret
chmod 600 /etc/ceph/cephfs.secret

mount -t ceph 192.168.2.101:6789:/ /mnt/cephfs \
  -o name=cephfs,secretfile=/etc/ceph/cephfs.secret

验证:

df -Th | grep cephfs
touch /mnt/cephfs/test.txt
ls -l /mnt/cephfs/

0x0D 常用排错命令

集群状态:

ceph -s
ceph health detail
ceph osd status
ceph osd tree
ceph osd df tree

编排状态:

ceph orch host ls
ceph orch ps
ceph orch device ls --wide --refresh
ceph orch ls

查看某个 daemon 日志:

cephadm logs --name mon.ceph1
cephadm logs --name mgr.ceph1
cephadm logs --name osd.0

检查容器:

docker ps | grep ceph
docker logs <container_id>

设备清理:

lsblk -f
pvs
vgs
lvs
wipefs -n /dev/sdb

wipefs -n 只是查看签名,不会清除;真正清除是 wipefs -a,生产环境一定确认盘符。

0x0E 总结

cephadm 比以前手动装 Ceph 省事很多,主要流程就是:

  1. 所有节点准备 hosts、时间同步、docker、lvm2
  2. ceph1 安装 cephadm
  3. bootstrap 初始化 MON/MGR/Dashboard
  4. 导入 /etc/ceph/ceph.pub 到其他节点
  5. ceph orch host add 加节点
  6. ceph orch daemon add osd 加数据盘
  7. 按需创建 CephFS、NFS 或 RGW

真正容易踩坑的地方不在命令本身,而是磁盘不干净、主机名解析不一致、时间不同步、镜像拉不下来。先把这些基础项处理好,Ceph 集群基本就能顺利起来。

k8s kubernetes 存储 nfs ceph


正文到此结束
版权声明:若无特殊注明,本文皆为 Myluzh Blog 原创,转载请保留文章出处。
文章内容:https://itho.cn/k8s/606.html
文章标题:《使用 cephadm 部署 Ceph 集群并配置 NFS 存储