Ceph 存储运维完全指南 / 02 - 安装与部署
02 - 安装与部署
2.1 部署方式概览
| 部署方式 | 适用场景 | 复杂度 | 推荐度 |
|---|---|---|---|
| cephadm | 裸机/虚拟机部署(官方推荐) | 中 | ⭐⭐⭐⭐⭐ |
| 手动部署 | 学习原理、定制需求 | 高 | ⭐⭐⭐ |
| ROOK | Kubernetes 环境 | 中 | ⭐⭐⭐⭐ |
| Ansible (cephadm) | 批量自动化部署 | 中 | ⭐⭐⭐⭐ |
2.2 环境准备(所有部署方式通用)
硬件规划
| 节点角色 | 最低数量 | 配置建议 |
|---|---|---|
| Monitor + Manager | 3(奇数) | 4C/8G/SSD 50G |
| OSD 节点 | 3 | 8C/32G/OSD 盘 N 块 |
| RGW / MDS | 2 | 4C/16G/SSD 50G |
操作系统准备
# 以 Ubuntu 22.04 / Rocky Linux 9 为例
# === 所有节点执行 ===
# 1. 设置主机名
sudo hostnamectl set-hostname node1 # node1, node2, node3 ...
# 2. 配置 hosts 解析
cat <<EOF | sudo tee -a /etc/hosts
192.168.1.10 node1
192.168.1.11 node2
192.168.1.12 node3
192.168.1.13 node4
192.168.1.14 node5
EOF
# 3. 关闭防火墙(生产环境按需开放端口)
sudo systemctl disable --now firewalld # CentOS
# sudo ufw disable # Ubuntu
# 4. 关闭 SELinux(或配置策略)
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# 5. 配置 NTP 时间同步
sudo apt install -y chrony # Ubuntu
# sudo dnf install -y chrony # Rocky
sudo systemctl enable --now chronyd
# 6. 配置 SSH 免密登录(从部署节点到所有节点)
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
for host in node1 node2 node3; do
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@$host
done
# 7. 安装容器运行时(cephadm 依赖)
sudo apt install -y podman # 推荐 podman
# sudo apt install -y docker.io # 或 docker
磁盘准备
# 查看可用磁盘
lsblk -d -o NAME,SIZE,TYPE,ROTA,MODEL
# 清除磁盘上的旧数据(谨慎操作!)
for disk in /dev/sd{b..f}; do
sudo wipefs --all $disk
sudo sgdisk --zap-all $disk
done
# 确认磁盘无分区和文件系统
sudo lsblk -f
注意事项:
- OSD 盘不要分区,直接使用裸盘
- 系统盘和 OSD 盘必须分开
- NVMe SSD 用于 BlueStore WAL/DB 可显著提升性能
2.3 使用 cephadm 部署(官方推荐)
cephadm 是 Ceph 官方推荐的部署和管理工具,基于容器化运行 Ceph 守护进程。
2.3.1 Bootstrap 初始化
# === 在 node1(部署节点)执行 ===
# 1. 安装 cephadm
# 方法一:通过包管理器
sudo apt install -y cephadm # Ubuntu 22.04+
# 方法二:通过 curl(兼容更多系统)
CEPH_RELEASE=reef # 或 quincy / squid
curl --silent --remote-name --location https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm
chmod +x cephadm
sudo mv cephadm /usr/local/bin/
# 2. Bootstrap 第一个 Monitor + Manager
sudo cephadm bootstrap \
--mon-ip 192.168.1.10 \
--cluster-network 10.10.10.0/24 \
--initial-dashboard-user admin \
--initial-dashboard-password MySecureP@ss \
--dashboard-password-noupdate \
--allow-fqdn-hostname
# 输出关键信息:
# Ceph Dashboard is now available at: https://node1:8443
# Enabling client.admin keyring and conf on hosts with "cephadm" label
# You can access the Ceph CLI with:
# sudo cephadm shell --fsid <cluster-id> -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
2.3.2 添加节点和 OSD
# 3. 安装 cephadm 到其他节点并添加
ssh root@node2 "apt install -y cephadm"
ssh root@node3 "apt install -y cephadm"
# 添加节点到集群
ceph orch host add node2 192.168.1.12 --labels _admin
ceph orch host add node3 192.168.1.13 --labels _admin
# 查看已添加的主机
ceph orch host ls
# 4. 添加 OSD
# 方法一:自动发现所有可用磁盘
ceph orch apply osd --all-available-devices
# 方法二:指定节点和磁盘
ceph orch daemon add osd node2:/dev/sdb
ceph orch daemon add osd node2:/dev/sdc
ceph orch daemon add osd node3:/dev/sdb
# 方法三:使用设备过滤器(推荐生产环境)
ceph orch apply osd --all-available-devices --data-devices rotational=1
ceph orch apply osd --all-available-devices --data-devices 'nvme[0-9]+n[0-9]+' --wal-devices '/dev/nvme0n1'
2.3.3 部署其他服务
# 5. 部署 RGW(对象存储网关)
ceph orch apply rgw myrgw --port=80 --placement="3 node1 node2 node3"
# 6. 部署 MDS(CephFS 文件存储)
ceph fs volume create myfs --placement="3 node1 node2 node3"
# 7. 部署 NFS(可选)
ceph orch apply nfs mynfs myfs --placement="2 node1 node2"
# 8. 查看所有服务
ceph orch ps
ceph orch ls
2.3.4 使用 ceph 命令
# cephadm 环境下使用 ceph 命令的方式
# 方式一:通过 cephadm shell
sudo cephadm shell
ceph -s
# 方式二:安装 ceph-common 包
sudo cephadm install ceph-common
ceph -s
# 方式三:使用 cephadm 前缀
sudo cephadm shell -- ceph -s
2.4 手动部署(学习原理)
手动部署仅建议用于学习和调试,生产环境请使用 cephadm。
2.4.1 安装 Ceph 包
# === 所有节点执行 ===
# 添加 Ceph 仓库(以 Reef 为例)
# Ubuntu
wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
echo "deb https://download.ceph.com/debian-reef/ jammy main" | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt update
sudo apt install -y ceph ceph-mon ceph-osd ceph-mgr ceph-mds ceph-common
2.4.2 部署 Monitor
# === 在 node1 执行 ===
# 1. 创建配置文件
cat > /etc/ceph/ceph.conf <<EOF
[global]
fsid = $(uuidgen)
mon_initial_members = node1, node2, node3
mon_host = 192.168.1.10,192.168.1.11,192.168.1.12
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public_network = 192.168.1.0/24
cluster_network = 10.10.10.0/24
osd_pool_default_size = 3
osd_pool_default_min_size = 2
EOF
# 2. 创建 Monitor 密钥环
sudo ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
# 3. 创建管理员密钥环
sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring \
--gen-key -n client.admin \
--cap mon 'allow *' \
--cap osd 'allow *' \
--cap mds 'allow *' \
--cap mgr 'allow *'
# 4. 生成引导 OSD 和 MGR 的密钥
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring \
--gen-key -n client.bootstrap-osd \
--cap mon 'profile bootstrap-osd' \
--cap mgr 'allow r'
# 5. 将密钥加入 mon.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
# 6. 生成 Monitor Map
monmaptool --create --add node1 192.168.1.10 \
--add node2 192.168.1.11 \
--add node3 192.168.1.12 \
--fsid $(grep fsid /etc/ceph/ceph.conf | awk '{print $3}') \
/tmp/monmap
# 7. 创建 Monitor 数据目录
sudo mkdir -p /var/lib/ceph/mon/ceph-node1
sudo ceph-mon --mkfs -i node1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
# 8. 启动 Monitor
sudo systemctl enable --now ceph-mon@node1
# 9. 在 node2、node3 重复以上步骤(修改节点名和 IP)
2.4.3 部署 Manager
# 在 node1 和 node2 上
sudo mkdir -p /var/lib/ceph/mgr/ceph-node1
ceph auth get-or-create mgr.node1 \
mon 'allow profile mgr' \
osd 'allow *' \
mds 'allow *' > /var/lib/ceph/mgr/ceph-node1/keyring
sudo ceph-mgr -i node1
sudo systemctl enable --now ceph-mgr@node1
2.4.4 部署 OSD
# 在每个 OSD 节点执行
# 使用 ceph-volume 创建 OSD(推荐,与 BlueStore 配合)
sudo ceph-volume lvm create --data /dev/sdb
# 或者使用 ceph-volume 批量准备
sudo ceph-volume lvm batch /dev/sdb /dev/sdc /dev/sdd
# 检查 OSD 状态
ceph osd tree
2.5 使用 ROOK 部署(Kubernetes)
ROOK 是 Ceph 在 Kubernetes 环境中的标准部署方式。
2.5.1 前置条件
# K8s 集群要求
# - Kubernetes 1.21+
# - 至少 3 个工作节点
# - 每个节点有未使用的裸磁盘
# - 已安装 Helm 3
# 安装 ROOK
helm repo add rook-release https://charts.rook.io/release
helm repo update
2.5.2 部署 ROOK Operator
# 创建命名空间
kubectl create namespace rook-ceph
# 安装 CRDs
kubectl create -f https://raw.githubusercontent.com/rook/rook/master/deploy/examples/crds.yaml
# 安装 ROOK Operator
helm install rook-ceph rook-release/rook-ceph \
--namespace rook-ceph \
--set csi.enableCephfsDriver=true \
--set csi.enableRBDDriver=true
# 等待 Operator 就绪
kubectl -n rook-ceph wait --for=condition=ready pod -l app=rook-ceph-operator --timeout=300s
2.5.3 创建 Ceph 集群
# cluster.yaml
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
dataDirHostPath: /var/lib/rook
cephVersion:
image: quay.io/ceph/ceph:v18.2.2
mon:
count: 3
allowMultiplePerNode: false
mgr:
count: 2
modules:
- name: rook
enabled: true
storage:
useAllNodes: true
useAllDevices: true
config:
osdsPerDevice: "1"
network:
provider: host
dashboard:
enabled: true
ssl: true
resources:
mon:
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "500m"
memory: "2Gi"
osd:
limits:
cpu: "4"
memory: "8Gi"
requests:
cpu: "1"
memory: "4Gi"
kubectl apply -f cluster.yaml
# 监控部署进度
watch kubectl -n rook-ceph get pods
# 验证集群健康
kubectl -n rook-ceph exec deploy/rook-ceph-tools -- ceph -s
2.5.4 创建存储类
# storageclass-rbd.yaml
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool
namespace: rook-ceph
spec:
failureDomain: host
replicated:
size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: replicapool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
allowVolumeExpansion: true
2.6 初始配置
2.6.1 创建存储池
# 创建默认的副本池
ceph osd pool create mypool 32 32 replicated
ceph osd pool set mypool size 3
# 创建 EC 池(纠删码)
ceph osd erasure-code-profile set myecprofile k=4 m=2 crush-failure-domain=host
ceph osd pool create ecpool 32 32 erasure myecprofile
# 应用最少副本设置
ceph osd pool set mypool min_size 2
2.6.2 配置 Dashboard
# cephadm 方式已自动启用 Dashboard
# 获取访问地址
ceph mgr services
# 创建自签名证书(可选)
ceph dashboard create-self-signed-cert
# 设置登录凭据
ceph dashboard set-login-credentials admin MySecureP@ss
# 访问:https://<mgr-ip>:8443
2.6.3 配置 Prometheus 监控
# 启用 Prometheus 模块
ceph mgr module enable prometheus
# 验证端点
curl http://<mgr-ip>:9287/metrics
# Prometheus 配置(prometheus.yml)
# - job_name: 'ceph'
# static_configs:
# - targets: ['mgr-node:9287']
2.7 部署验证检查清单
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 集群状态 | ceph -s | health: HEALTH_OK |
| Monitor 法定人数 | ceph mon stat | 3 mons, quorum 0,1,2 |
| OSD 状态 | ceph osd stat | 所有 OSD up/in |
| OSD 树 | ceph osd tree | 无 down/out 状态 |
| 存储池 | ceph osd pool ls detail | 池状态 active+clean |
| Dashboard | 浏览器访问 8443 | 可正常登录 |
| 读写测试 | rados bench | 无错误 |
# 快速写入测试
echo "Hello Ceph" > /tmp/test.txt
rados put testobj /tmp/test.txt --pool=mypool
rados get testobj /tmp/retrieved.txt --pool=mypool
cat /tmp/retrieved.txt
# 输出: Hello Ceph
# 性能基准测试
rados bench -p mypool 10 write --no-cleanup
rados bench -p mypool 10 seq
rados bench -p mypool 10 rand
扩展阅读
下一章:03 - 核心架构 — 深入理解 CRUSH 算法、OSD、MON、MGR、MDS、PG 的工作原理。