Blog

独立 Ceph 集群(cephadm + RBD)

Ubuntu 24 · cephadm · 默认发行版 Tentacle(20.2) · 三副本 RBD 池 kubernetes


1. 架构

ceph1 (bootstrap / MON / MGR / OSD)
ceph2 (MON / OSD)
ceph3 (MON / OSD)
        │  OTLP 不走这里;RBD 走 MON:6789 + OSD 6800-7300
        ▼
业务 K8s Worker  ── Ceph CSI RBD ──► PVC / Postgres
组件 作用
MON 法定人数,生产最好 6 个,本次测试 3 个
MGR Dashboard / 编排
OSD 数据盘,每台至少 1 块独立空盘
RBD 块设备;CSI 供给 PVC

不要把 OSD 打在 K8s 控制面或系统盘上。


2. 目录

文件 说明
ceph-nodes.conf 版本、RBD 池、节点 IP / 密码 / OSD 盘
install-ceph.sh 安装与运维
csi/storageclass-rbd.yaml 业务集群 StorageClass
csi/secret.yaml.example CSI 模板;monitors 从 ceph-nodes.conf 生成csi-example / export-rbd
csi/generated/ export-rbd 写出的真实密钥(已 gitignore)

3. 硬件与网络

  • 节点:≥ 3 台,建议同规格;与 K8s 节点 IP 分段或至少别混角色
  • 磁盘:第 6 列填写的设备必须是空盘(lsblk 确认无分区、无系统)。脚本会交给 cephadm 做成 OSD,数据会清空
  • 端口(节点之间 + 业务 Worker → Ceph):330067896800-7300、Dashboard 8443
  • 时间:prepare 会开 chrony;时钟差大会导致 MON 异常

示例 ceph-nodes.conf(改成真实 IP / 密码 / 盘符):

CEPH_RELEASE=tentacle
RBD_POOL=kubernetes

172.16.10.131|ceph1|bootstrap|root|你的密码|/dev/sdb
172.16.10.132|ceph2|node|root|你的密码|/dev/sdb
172.16.10.133|ceph3|node|root|你的密码|/dev/sdb

bootstrap 只能有一行,且 bootstrap / add-hosts / osd / pool / export-rbd 都在这台执行

国内拉 apt 包(cephadm):

CEPH_APT_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-tentacle

国内拉 Docker 镜像(与业务 K8s 一致,不要写进 CEPH_APT_MIRROR):

IMAGE_MIRROR=registry.cn-global.starbucket.com.cn/starbucket

bash install-ceph.sh images 会变成:

registry.cn-global.starbucket.com.cn/starbucket/quay.io/ceph/ceph:v20
...

CEPH_APT_MIRROR 只影响 apt install cephadm不会改镜像列表。


4. 安装顺序

bootstrap 节点(ceph1)上操作;先把本目录拷过去或从 git 拉取。

改 conf → 全员 prepare → ssh-keys → hosts-all
→ bootstrap → add-hosts → osd → pool → status

prepare / prepare-all / bootstrap 开始时会打印本部署要拉的镜像;也可单独查看:

bash install-ceph.sh images

默认(tentacle)包括 quay.io/ceph/ceph:v20 以及 cephadm 监控栈(Prometheus / Grafana 等)。已有业务监控时在 conf 设 SKIP_MONITORING_STACK=1

已用 Reef/Squid 装好的集群不能只改 conf,需按官方 ceph orch upgrade 升级或重装。

chmod +x install-ceph.sh
chmod 600 ceph-nodes.conf
sudo bash install-ceph.sh ssh-keys

《一键部署高可用Ceph可视化集群》文章正文配图 — STARBUCKET BLOG

sudo bash install-ceph.sh hosts-all

《一键部署高可用Ceph可视化集群》文章正文配图(配图 2)— STARBUCKET BLOG

sudo bash install-ceph.sh prepare-all

《一键部署高可用Ceph可视化集群》文章正文配图(配图 3)— STARBUCKET BLOG

sudo bash install-ceph.sh bootstrap

《一键部署高可用Ceph可视化集群》文章正文配图(配图 4)— STARBUCKET BLOG 《一键部署高可用Ceph可视化集群》文章正文配图(配图 5)— STARBUCKET BLOG

sudo bash install-ceph.sh add-hosts

《一键部署高可用Ceph可视化集群》文章正文配图(配图 6)— STARBUCKET BLOG

sudo bash install-ceph.sh osd

《一键部署高可用Ceph可视化集群》文章正文配图(配图 7)— STARBUCKET BLOG

sudo bash install-ceph.sh pool

《一键部署高可用Ceph可视化集群》文章正文配图(配图 8)— STARBUCKET BLOG

sudo bash install-ceph.sh status

《一键部署高可用Ceph可视化集群》文章正文配图(配图 9)— STARBUCKET BLOG

Dashboard:https://<IP>:8443 ,用户 admin

设置密码

printf '%s' '你的新密码' > /root/dash.pw
chmod 600 /root/dash.pw
ceph dashboard ac-user-set-password admin -i /root/dash.pw

《一键部署高可用Ceph可视化集群》文章正文配图(配图 10)— STARBUCKET BLOG 《一键部署高可用Ceph可视化集群》文章正文配图(配图 11)— STARBUCKET BLOG 《一键部署高可用Ceph可视化集群》文章正文配图(配图 12)— STARBUCKET BLOG 《一键部署高可用Ceph可视化集群》文章正文配图(配图 13)— STARBUCKET BLOG


5. OSD 注意

  • 默认只使用 conf 第 6 列,例如 /dev/sdb/dev/sdb,/dev/sdc
  • 不要对系统盘、有数据的盘执行 osd
  • 若确有多块空闲盘要全部交给 Ceph:conf 设 OSD_ALLOW_ALL=1,再:
sudo bash install-ceph.sh osd --all-available-devices

6. 扩容与缩容

扩缩:加盘/加机会触发数据再平衡;缩容必须先把 OSD 上的数据迁走。

所有命令默认在 ceph1(bootstrap) 上执行。 OSD 只能用独立空盘lsblk 无挂载),禁止系统盘(vda / sda 上的 /)。

6.1 扩容:只加盘(同一台已有节点)

lsblk -o NAME,SIZE,TYPE,MOUNTPOINT   # 确认新盘如 /dev/vdb,无 MOUNTPOINT

改 conf 配置节点信息

172.16.10.136|ceph1|bootstrap|root|你的密码|/dev/vdb,/dev/vdc
sudo bash install-ceph.sh osd
ceph -s          # 等到 HEALTH_OK,无 recovery / backfill 再视为完成
ceph osd tree

6.2 扩容:加一台存储机

  1. 在 conf 新增节点信息
172.16.10.134|ceph4|node|root|你的密码|/dev/vdb

盘符以新机lsblk 为准(虚拟机常见 /dev/vdb,不是 /dev/sdb)。

  1. 在 ceph1 上:
sudo bash install-ceph.sh ssh-keys
sudo bash install-ceph.sh hosts-all
sudo bash install-ceph.sh prepare-all
sudo bash install-ceph.sh add-hosts
sudo bash install-ceph.sh osd
sudo bash install-ceph.sh status

add-hosts 把 conf 里尚未加入的主机 ceph orch host addosd 按第 6 列建 OSD。集群会自动把部分 PG 迁到新 OSD。

  1. 确认完成:
ceph -s              # HEALTH_OK,无 recovery / backfill
ceph orch host ls
ceph osd tree        # 新主机上有 OSD 且 up

MON 保持 奇数。三台够用就不要加 MON;若要 5 个 MON:

ceph orch apply mon --placement="ceph1,ceph2,ceph3,ceph4,ceph5"

容量不够时:先加盘,再加人。 不要按 ceph df 水位自动删节点。

6.3 缩容:下线一台(须手工,脚本无 remove-host)

三节点集群不要缩到 2 台(MON 不够票会停写;size=3 也无法放三副本)。最小生产规模就是 3 台。

假设去掉 ceph4,OSD id 以 ceph osd tree 为准:

ceph osd tree
# 可选:先把权重打到 0,搬数据更温和
# ceph osd crush reweight osd.<id> 0

ceph orch osd rm <id> --zap          # 可对多个 id 各执行一次
ceph -s                              # 等到无 recovery,该 OSD 从 tree 消失

ceph orch host drain ceph4
ceph orch host rm ceph4              # 确认该机已无 OSD 后再删
# 节点已关机且确认无数据:ceph orch host rm ceph4 --offline

然后从 ceph-nodes.conf 删除对应行,并 sudo bash install-ceph.sh hosts-all 刷新 hosts。

6.4 不要自动做的事

做法 说明
按 CPU/磁盘使用率自动加虚拟机 rebalance 会打满网络和 OSD,容易拖垮现网
按水位自动 host rm 缩容期间副本减少,再挂一台可能丢数据
osd --all-available-devices 当自动扩容 仅当 conf OSD_ALLOW_ALL=1 且插入的是空盘;插错系统盘会清空系统

半自动加盘(谨慎):conf 设 OSD_ALLOW_ALL=1 后:

sudo bash install-ceph.sh osd --all-available-devices

7. 接到业务 Kubernetes(RBD CSI)

Ceph bootstrap 节点

ceph-nodes.conf 节点后先刷新模板(MON 地址从 conf 读取,不要手改 YAML 里的 IP):

bash install-ceph.sh csi-example

导出带真实密钥的清单(同时会按 conf 重写 example 和 csi/generated/secret.yaml):

sudo bash install-ceph.sh export-rbd
# 生成 csi/generated/secret.yaml(含 client.kubernetes 密钥;monitors 来自 conf)

K8s 控制面(Helm 安装 ceph-csi 的 RBD 图表,命名空间 ceph-csi)后:

kubectl create namespace ceph-csi
kubectl apply -f csi/generated/secret.yaml
kubectl apply -f csi/storageclass-rbd.yaml

PVC 使用 storageClassName: ceph-rbd。业务 Worker 必须能访问 MON 6789 和 OSD 网段。

Helm 的 csiConfig 须与 Secret 里 clusterID: ceph 一致;具体 values 随 ceph-csi 版本变化,以官方 chart 为准。


8. 常用检查

ceph -s
ceph orch host ls
ceph osd tree
ceph osd pool ls
ceph auth get client.kubernetes

bash install-ceph.sh --help
bash install-ceph.sh help osd(任意命令:help <命令><命令> --help

虚拟机 virtio 盘没有 SMART。Dashboard「设备健康 / smartctl -22」时在 ceph1 执行:

sudo bash install-ceph.sh device-health off

conf 默认 DEVICE_HEALTH_MONITORING=0;物理 SATA/NVMe 再改为 1device-health on

卸载并重装

先改主机名(三台都不要再叫 k8s-n1,否则 Grafana 仍会找旧名):

# 在 133/134/135 上分别:
hostnamectl set-hostname ceph1   # / ceph2 / ceph3

在 ceph1(把最新 install-ceph.sh 拷到 /opt/install-ceph/):

# 卸三台 + wipe /dev/vdb(数据全没)
sudo bash install-ceph.sh destroy --all --yes

https://resource.starbucket.cn/website/image/posts/one-click-deployment-of-highly-available-ceph-visualization-cluster/1013aecb87c24306add430a3bd4d9ae8.png

# 确认主机名与 hosts
hostname   # ceph1
sudo bash install-ceph.sh ssh-keys
sudo bash install-ceph.sh prepare-all
sudo bash install-ceph.sh hosts-all
sudo bash install-ceph.sh bootstrap
# 推送 /etc/ceph/ceph.pub 到 134/135 后:
sudo bash install-ceph.sh add-hosts
sudo bash install-ceph.sh osd
sudo bash install-ceph.sh pool
sudo bash install-ceph.sh device-health off

Comments & discussion

The first comment in each thread opens a topic. Signed-in readers can keep the conversation going under that topic.

No comments yet. Sign in to start a topic.

Start a new topic

Sign in to start a topic or join the discussion.