强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Ceph 存储运维完全指南 / 02 - 安装与部署

02 - 安装与部署

2.1 部署方式概览

部署方式适用场景复杂度推荐度
cephadm裸机/虚拟机部署(官方推荐)⭐⭐⭐⭐⭐
手动部署学习原理、定制需求⭐⭐⭐
ROOKKubernetes 环境⭐⭐⭐⭐
Ansible (cephadm)批量自动化部署⭐⭐⭐⭐

2.2 环境准备(所有部署方式通用)

硬件规划

节点角色最低数量配置建议
Monitor + Manager3(奇数)4C/8G/SSD 50G
OSD 节点38C/32G/OSD 盘 N 块
RGW / MDS24C/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 -shealth: HEALTH_OK
Monitor 法定人数ceph mon stat3 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

扩展阅读

  1. cephadm 官方文档
  2. ROOK 官方文档
  3. Ceph 手动部署指南
  4. Ceph 版本发布说明

下一章03 - 核心架构 — 深入理解 CRUSH 算法、OSD、MON、MGR、MDS、PG 的工作原理。