独立 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):
3300、6789、6800-7300、Dashboard8443 - 时间: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

sudo bash install-ceph.sh hosts-all

sudo bash install-ceph.sh prepare-all

sudo bash install-ceph.sh bootstrap

sudo bash install-ceph.sh add-hosts

sudo bash install-ceph.sh osd

sudo bash install-ceph.sh pool

sudo bash install-ceph.sh status

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

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 扩容:加一台存储机
- 在 conf 新增节点信息
172.16.10.134|ceph4|node|root|你的密码|/dev/vdb
盘符以新机上 lsblk 为准(虚拟机常见 /dev/vdb,不是 /dev/sdb)。
- 在 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 add;osd 按第 6 列建 OSD。集群会自动把部分 PG 迁到新 OSD。
- 确认完成:
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 --helpbash 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 再改为 1 并 device-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.