尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

离线环境安装Ceph全流程:本地源构建与容器化部署实战

离线环境安装Ceph全流程:本地源构建与容器化部署实战 前阵子接手一个存储项目客户的服务器全部在内网和外网物理隔离。需求听起来很简单在这些机器上装一套Ceph分布式存储把几个节点的磁盘聚合成对象存储和块存储池。我一开始也没当回事直到ssh上去敲yum install ceph-common发现yum源根本解析不出来才意识到这件事的难点不在安装本身而在“怎么把软件和依赖完整地搬进一个封闭环境”。这篇文章就围绕这个场景展开讲清楚离线环境安装Ceph的全流程下载依赖、搭本地源、同步时间、容器化与RPM两条部署路线的实操以及我实际踩过的坑。适合两类人看一类是刚接触分布式存储、遇到内网环境无处下手的新手另一类是外网环境装过Ceph、第一次要处理离线部署的运维同学。1. 离线安装的难点与总体思路先想清楚“缺什么、去哪拿、怎么搬”1.1 离线环境真正卡住的不是安装而是依赖解析Ceph不是那种单二进制文件的服务它是一整个生态mon负责集群大脑mgr负责监控和编排osd负责数据落盘mds提供文件系统元数据服务radosgw对外提供对象存储接口。每个组件都是一组rpm包依赖互相纠缠比如librados是底层统一存储接口库librbd是块设备接口库python3-cephfs是文件系统客户端库装起来会牵扯几十个包。在外网环境yum或者dnf会在软件源里自动解析依赖闭包一条命令搞定。但离线环境里你面对的是先有鸡还是先有蛋的问题你没有源就没法装没装createrepo就没法建源。所以离线安装的第一步不是急着敲安装命令而是先想清楚三件事目标机的操作系统版本是什么、架构是什么、Ceph要用哪个发布版本。这三件事一旦定下来后面所有准备工作的策略就跟着定了。我个人的体会是离线安装的成败往往不取决于目标机上的操作而取决于联网机器上准备离线包的那几个小时。上网一搜“ceph离线安装”教程很多但大多只给了结论没讲清为什么这么做。如果你只是照着抄遇到一次报错就可能卡半天。1.2 三条主流搬运路径下载RPM、导出容器镜像、离线仓库离线部署Ceph现在基本是两条技术路线外加一条基础设施路线RPM路线老版本常用用repotrack把依赖全部下载下来做成本地yum源然后在目标机上通过yum安装。优点是直观可控性强适合不习惯容器环境的运维团队缺点是包多依赖解析麻烦而且ceph-deploy已经停止维护这条路线基本只能停留在Nautilus、Octopus这些老版本。容器路线新版官方推荐Ceph从Pacific开始大力推cephadm部署时通过容器镜像运行各组件。离线环境只需要把ceph/ceph镜像load进podman即可。优点是组件分发统一升级方便缺点是需要目标机支持容器镜像导入导出要一次到位。基础设施路线不管选哪条都建议先在离线网络内部搭一个基础软件源也就是系统ISO基础源加EPEL加Ceph仓库。这样既服务Ceph部署也服务后续其他软件的离线安装比如内网还要装docker、python3、nginx这些常见服务都可以复用同一个离线源体系。选哪条路线取决于你的Ceph版本和团队习惯。我的建议是如果是从零开始的新项目直接用cephadm加容器镜像如果是维护老环境那RPM线路必须会。后面我会把两条路线的实操都写出来。2. 在联网机器上准备离线安装包为什么一定是同版本同架构的机器2.1 用yumdownloader和repotrack把依赖“一网打尽”准备离线包这件事我踩过最大的坑是版本不一致。准备包用的机器最好和目标机操作系统完全一致包括大版本和小版本。比如目标机是Rocky Linux 8.6 x86_64我的下载机也要是Rocky Linux 8.6 x86_64不要跨大版本也不要跨架构。rpm包在制作时和glibc版本是挂钩的差一个小版本轻则多一个依赖找不到重则直接报Requires: libxxx.so.2(GLIB...这种让人抓狂的错误。先把下载工具装好yum install -y yum-utils createrepo_c dnf-plugins-core然后建目录用它来存放所有rpm。下载之前我建议先在下载机上临时配置Ceph官方源和EPEL源然后用repotrack把Ceph相关的组件包一次性都拉下来yum install -y epel-release cat /etc/yum.repos.d/ceph.repo EOF [ceph] nameceph baseurlhttps://download.ceph.com/rpm-17.2.6/el8/x86_64/ gpgcheck0 enabled1 EOF yum makecache mkdir -p /opt/offline/rpms cd /opt/offline/rpms repotrack ceph ceph-radosgw ceph-mds ceph-mon ceph-osd ceph-mgr ceph-commonrepotrack和yumdownloader的区别在于repotrack会递归解析所有依赖即使某些包当前系统已经装了它也会一并拉下来yumdownloader --resolve只解析当前系统需要的依赖关系。实际使用中repotrack拿到的包更全目录体积自然也会大不少。我第一次下载完一看目录足足有800多个rpm后来发现里面混了不少不同架构和不同版本的遗留文件所以在下载之前最好先yum clean all并确认repos里只启用需要的源。如果你只想装一个mon节点可能几十个包就够了。但考虑到Ceph集群往往还要装mds、radosgw建议一次性把主要组件都拉全省得后面二次补包。2.2 把下载目录做成本地YUM源包下完了下一步就是在内网里把这些rpm变成一个可用的yum源。最简单的操作是把整个目录拷到内网的一台机器上然后执行createrepocreaterepo /opt/offline/rpmscreaterepo会在目录下生成repodata文件夹这个文件夹里存储了所有rpm的元数据、依赖关系、校验和。yum在安装时解析依赖读的就是它。生成好之后写一个本地repo文件cat /etc/yum.repos.d/local.repo EOF [local-ceph] nameLocal Ceph Repository baseurlfile:///opt/offline/rpms enabled1 gpgcheck0 EOF yum clean all yum makecache yum repolist这里多说一句如果内网机器多别每台都拷贝几百MB的rpm。更好的做法是把/opt/offline/rpms放到一台内网源服务器上用Nginx或者HTTPD共享然后把各节点repo文件的baseurl改成http://repo-server/rpms。这样后续给节点加包、升级只需要在源服务器上更新目录其他节点执行yum update即可。多节点部署前先用rsync把包传到本地再用file://方式也是一种省事的做法但目录一多就不太好维护。注意如果Ceph依赖了EPEL中的包而离线准备时没有一并下载内网节点会报Unable to find a match或者No package xxx available。我习惯把EPEL源也单独repotrack一份放到另一个目录并在local.repo里同时启用两个本地目录这样一个repo文件就能覆盖系统基础包加EPEL加Ceph三块。2.3 容器离线方案的镜像导出与导入如果走cephadm容器路线依赖准备反而简单一些核心是把容器镜像搬进去。在联网机器上先安装podman然后拉取镜像、保存为tar文件yum install -y podman podman pull quay.io/ceph/ceph:v17.2.6 podman save -o ceph-v17.2.6.tar quay.io/ceph/ceph:v17.2.6把tar文件用scp传到内网节点上scp ceph-v17.2.6.tar root192.168.1.11:/root/然后在节点上loadpodman load -i ceph-v17.2.6.tar podman imagesload完之后要特别注意镜像的tag。cephadm在bootstrap时会尝试从registry拉镜像如果本地load的镜像tag和cephadm预期的默认tag不一致它会跳过本地镜像转而去外网拉取结果就是卡住或者超时。为了确保能被识别最好按官方规范保留完整的tag比如quay.io/ceph/ceph:v17.2.6也可以额外打一个tagpodman tag quay.io/ceph/ceph:v17.2.6 ceph/ceph:v17.2.6cephadm还支持直接从本地tar引导不预先load也行。但我建议还是先load因为后面添加新节点时cephadm会把镜像分发到其他节点如果没有本地镜像仓库多节点的镜像加载会非常麻烦。如果条件允许在内网额外起一个私有镜像仓库后续管理会更轻松。3. 内网环境预检DNS、hosts、时间同步、防火墙一个不能少3.1 主机名解析与Ceph集群通信的关系离线环境里最容易忽略的是集群内部的主机名解析。Ceph的mon服务会把每个组件的hostname写进CRUSH map和monmap很多内部通信是基于主机名而不是IP的。如果节点之间不能通过主机名互通典型现象就是能ping通IP但集群状态一直显示mon is down或者osd反复up/down。所以装Ceph之前先统一规划短主机名并把它们写进每台机器的/etc/hosts。比如三台部署机cat /etc/hosts EOF 192.168.1.11 ceph-mon01 192.168.1.12 ceph-osd01 192.168.1.13 ceph-osd02 EOF注意主机名不要带下划线也不建议直接用IP当主机名。很多人图省事直接用IP结果后期扩容或迁移时会遇到很多奇怪的问题。名称一旦定下来尽量不要改因为monmap里的地址信息在第一个mon初始化时就已经固定了后面改起来需要额外操作quorum非常麻烦。3.2 时间同步在分布式存储中的隐性作用第二个容易踩的点是时间同步。Ceph对时钟偏移特别敏感mon和osd之间如果时间偏差太大osd会被标记为down数据访问直接出问题。离线环境没有公网时间服务器很多人就跳过了chrony配置结果集群跑起来之后三天两头告警。我一般的处理方式是如果内网有一台机器能短暂访问外网那就在联网时刻同步好然后内网所有节点都以它为时间源。完全离线时可以指定一台稳定性较高的机器作为本地时间源配合local stratum 10让其他节点以它为基准。配置文件示例# 客户端节点 /etc/chrony.conf server 192.168.1.11 iburst driftfile /var/lib/chrony/drift makestep 1.0 3 local stratum 10服务端那台机器上还需要在chrony.conf里加上allow 192.168.1.0/24允许内网客户端访问。各个节点同步后执行systemctl enable --now chronyd chronyc sources -v看到时间源的状态是^*说明已经同步成功。我建议在Ceph部署之前把时间同步作为预检命令加进脚本提前规避集群状态里出现clock skew的报错。3.3 防火墙与SELinux的取舍第三个预检项是防火墙。Ceph各组件的端口比较多mon需要6789旧版和3300新版v2协议mgr需要8443dashboard和9283prometheus metricsosd数据端口通常是6800到7300的连续范围radosgw需要8080或者自定义端口。如果内网环境有安全要求不能直接关firewalld可以按网段放行firewall-cmd --permanent --add-source192.168.1.0/24 firewall-cmd --permanent --add-port6789/tcp firewall-cmd --permanent --add-port3300/tcp firewall-cmd --permanent --add-port6800-7300/tcp firewall-cmd --reloadSELinux这块我个人的做法是尽量保持permissive而不是直接disabled。因为disabled之后重启会恢复enforcing到时候osd因为SELinux策略起不来反而更难排查。如果你决定用enforcingCeph的目录、端口策略都要按官方建议配置工作量不小。离线环境里很多人为了顺利安装直接setenforce 0重启后又变成enforcing然后osd启动失败这种问题排查起来很消耗时间。4. 以cephadm为例的离线部署实操4.1 配置本地源并安装cephadm新版Ceph官方推荐的部署工具是cephadm它是一个独立的Python脚本发布在Ceph的rpm包里也可以单独下载。离线环境下我一般提前在联网机器上下载好cephadm脚本传到目标机wget https://download.ceph.com/rpm-17.2.6/el8/noarch/cephadm chmod x cephadm不过直接执行./cephadm add-repo会失败因为脚本会去访问公网源。离线环境有两个选择一是先配好本地yum源然后安装系统仓库里的cephadm和podmanyum install -y cephadm podman二是用脚本自带的本地模式安装。我自己更倾向于直接yum安装因为这样cephadm依赖的python3、podman这些基础组件都会被一起处理好。装完确认版本cephadm --version podman --versioncephadm运行起来后会通过ssh管理各个节点生成密钥并分发。所以节点最好有root权限并且能通过ssh免密登录后面加节点会省很多事。4.2 导入ceph容器镜像并引导集群镜像已经在2.3节导入了。现在在第一个节点上执行bootstrapcephadm bootstrap --mon-ip 192.168.1.11 --skip-pull--skip-pull的作用就是让cephadm不要主动从registry拉镜像直接用本地已有的quay.io/ceph/ceph镜像。bootstrap过程中cephadm会做这些事情生成集群ssh key、创建mon、启动mgr、打开dashboard、初始化pool和client.admin账号。整个过程大概两三分钟。执行完成后会打印类似这样的信息Ceph Dashboard is now available at: URL: https://192.168.1.11:8443/同时会在/etc/ceph目录下生成ceph.conf和ceph.client.admin.keyring。用root账号执行ceph -s应该能看到集群状态是HEALTH_OK或者HEALTH_WARN。如果只有一个mon或还没加osd有warn是正常的。如果提示镜像找不到按2.3节说的检查podman images里的tag并重新podman tag。4.3 添加OSD与验证集群状态bootstrap完成后当前节点承担mon和mgr角色。接下来把其余节点加入集群。cephadm使用ssh密钥管理远端节点所以先把公钥复制过去ssh-copy-id -f -i /etc/ceph/ceph.pub rootceph-osd01 ssh-copy-id -f -i /etc/ceph/ceph.pub rootceph-osd02然后在第一个节点上执行ceph orch host add ceph-osd01 192.168.1.12 ceph orch host add ceph-osd02 192.168.1.13添加完成后把新节点的osd也托管给cephadm。最省事的方式是直接接管所有可用磁盘ceph orch apply osd all这个命令会把节点上的未使用磁盘都做成osd。如果磁盘上有旧数据、旧分区需要先zapceph orch device zap ceph-osd01 /dev/sdb --force ceph orch daemon add osd ceph-osd01:/dev/sdb接完osd集群状态应该很快就变成HEALTH_OK。最后再验证一下存储服务ceph osd tree ceph df ceph status如果业务需要对象存储或者文件系统还需要额外启用。对象存储直接ceph orch apply rgw myrgw文件系统要先创建数据池和元数据池再创建fs并部署mdsceph osd pool create cephfs_data 128 ceph osd pool create cephfs_metadata 32 ceph fs new cephfs cephfs_metadata cephfs_data ceph orch apply mds cephfspool的pg数量要根据osd总数来定不是越大越好。经验值大致是每个osd的pg数控制在100以内总pg数接近2的幂比较好。pg设少了数据均衡慢设多了资源浪费还可能触发集群告警。5. 传统RPM方式部署Ceph的离线路线ceph-deploy5.1 安装ceph-deploy与所有节点的准备虽然新版推荐cephadm但前几年做离线项目时很多客户环境还是沿用老版本Ceph比如Nautilus、Octopus对应的部署工具是ceph-deploy。如果你要维护这些生产环境离线RPM路线还是需要掌握。离线准备阶段把ceph-deploy这个包也一起repotrack下来repotrack ceph-deploy然后在所有节点上配置本地yum源参考2.2节的方式。各节点都提前装好python3、chrony、openssh等基础包并确保ssh免密。ceph-deploy一般装在管理节点上yum install -y ceph-deploy在管理机上新建部署目录初始化集群配置mkdir /opt/ceph-deploy cd /opt/ceph-deploy ceph-deploy new ceph-mon01 ceph-osd01 ceph-osd02ceph-deploy new会在目录下生成ceph.conf和ceph.mon.keyring同时把节点hostname写入mon initial members。这时可以手动在ceph.conf里追加一些参数比如网络配置[global] public network 192.168.1.0/24 cluster network 192.168.1.0/24老集群建议显式指定cluster network。如果存储网络单独隔离可以避免数据流量挤占管理网络尤其是大容量集群这个配置很关键。5.2 mon、mgr、osd的创建流程节点准备好后开始安装Ceph包和创建mon。ceph-deploy在联网环境会先调整各节点的repo离线环境必须禁用这个行为ceph-deploy install --no-adjust-repos ceph-mon01 ceph-osd01 ceph-osd02--no-adjust-repos这步非常关键。如果不加ceph-deploy会尝试在各节点下载公网源配置全部失败不说可能还会覆盖掉我们辛苦配好的本地repo文件。接着初始化monceph-deploy mon create-initial这条命令会在各节点上创建mon进程并在当前目录生成几个keyring文件包括ceph.client.admin.keyring。然后用同样的方式创建mgrceph-deploy mgr create ceph-mon01最后给osd节点加盘ceph-deploy osd create ceph-osd01:/dev/sdb ceph-deploy osd create ceph-osd02:/dev/sdb老版本的ceph-deploy osd create在指定journal盘或db盘时需要额外加参数。如果你用nvme做wal或db参数会更复杂。全部完成后把配置文件分发到各节点ceph-deploy admin ceph-mon01 ceph-osd01 ceph-osd02 chmod r /etc/ceph/ceph.client.admin.keyring注意ceph-deploy admin生成的keyring默认权限是600其他节点上如果要用普通用户执行ceph命令需要把权限改为644或做用户认证配置否则ceph命令无法读取key。这个坑在旧文档里经常被忽略。ceph-deploy这个工具现在已经不怎么维护了新版本Ceph不建议用它部署。但了解RPM路线的逻辑对排查旧集群问题仍然有帮助。6. 我在离线部署中踩过的坑依赖版本、镜像tag、存储节点资源6.1 “下载了但装不上”的大部分原因先说说依赖版本的问题。有一次我把Ceph 15.2.16的包全部下载好拿到离线环境后在CentOS 8.5节点上安装结果最后提示缺少libpython3.6m.so.1.0怎么都找不到。查了半天才发现下载机上启用的epel源是8.4小版本的拉下来的python3-libs是3.6.8-15.el8_4而目标机是8.5系统自带的是python3-libs-3.6.8-17.el8_5。差一个微版本soname就不被识别。后来我把下载机和目标机小版本完全对齐重新拉包一次就过。还有一次是本地repo配置文件的gpgcheck没关。包是从官方源下载的本身带签名但我把gpgcheck设成1后没有导入对应的GPG keyyum直接拒绝安装所有包。报错信息只说Public key for xxx.rpm is not installed不熟悉的人容易被带到查密钥的坑里。所以离线源如果确认包来源可靠直接设成gpgcheck0是最省事的。另一个高频问题出在cephadm bootstrap时忘记加--skip-pull。我刚开始用cephadm时在离线环境执行bootstrap它默认会尝试从quay.io拉镜像等了两分钟直接超时。后来才发现cephadm支持本地镜像引导就是需要显式加skip-pull或者提前把镜像tag打到默认期望的格式。6.2 离线环境最容易忽略的时钟漂移时间同步这个坑我一度以为是Ceph的bug。现象是osd反复被标记down日志里报clock skew但检查网络、磁盘都没问题。后来才想起来部署时chrony没配好所有节点各自为政跑了一周之后时间差已经拉到了十几分钟。Ceph对mon和osd之间的时间差容忍度很低偏差一大osd就会被判定为失联。我现在的做法是把chrony配置统一写进初始化脚本里时间源指向内网一台稳定机器并设置local stratum 10。节点上线前强制校验一次chronyc tracking chronyc sources -v确认时间源状态是^*再继续装Ceph。如果机器上没有chrony至少也要用ntpdate手动同步一次别让时间差在安装时就存在。这是一个很小但影响很大的点很容易被忽略。6.3 给后续维护留的后手离线环境最大的问题是重复劳动。第一次下载包、配置源、导入镜像可能要花一整天。如果下次要扩容难道又要去联网机器上重新拉一遍所以我后来存了一套固定的离线材料库目录大概是这样/opt/offline/ ├── repos/ │ ├── base/ # 系统ISO自带基础包和update │ ├── epel/ # EPEL依赖 │ └── ceph/ # Ceph主仓库包 ├── images/ │ ├── ceph-v17.2.6.tar │ └── images-list.txt ├── scripts/ │ ├── make_repo.sh │ ├── sync_hosts.sh │ └── offline_precheck.sh └── docs/ └── 离线部署手册.md每个新节点上线先执行离线预检脚本检查yum源、hosts、chrony、防火墙再走Ceph安装流程。这套材料库对我后续维护帮助很大。另外我还会把当时下载的rpm包列表导出一份也就是rpm -qa的快照以后如果补包能快速知道缺什么不用大海捞针。就个人体感而言容器化方式的日常维护成本比RPM方式低不少但前提是离线材料要准备齐全。镜像tar、本地源、初始化脚本这三样东西一旦成型扩容一个新节点基本十分钟搞定甚至比公网环境装还快因为少了动态调试的等待时间。如果你问我下次再遇到离线环境会怎么选我大概率还是用cephadm加容器镜像这条路但一定会第一天就把离线材料库建好而不是等装到一半再去补包。先把源找对后面的路就走得顺。
返回列表