openEuler aarch64 环境下 cephadm 离线部署 Ceph Reef:私有镜像仓库构建与全栈容器镜像预置指南
1. 为什么需要离线部署Ceph Reef在arm64架构的生产环境中部署Ceph集群时我们经常会遇到一个棘手的问题官方镜像仓库中aarch64架构的容器镜像严重不足。我去年在金融行业的一个项目中就深有体会当时客户的数据中心是完全隔离的内网环境而我们需要部署的Ceph Reef版本恰好缺乏arm64架构的官方镜像支持。这种情况其实非常普遍特别是在一些对安全性要求严格的行业比如金融、政务等领域。这些场景通常会有以下几个典型特征服务器集群完全隔离无法访问外部网络使用国产化硬件平台如鲲鹏、飞腾等arm64架构需要符合等保要求禁止随意拉取外部镜像针对这些限制我们摸索出了一套完整的解决方案。核心思路是先在一台可以临时联网的跳板机上准备好所有必需的容器镜像然后通过私有镜像仓库将这些资源导入到隔离环境中。这种方法不仅解决了架构兼容性问题还能确保整个部署过程符合安全规范。2. 环境准备与基础配置2.1 硬件与操作系统要求在开始之前我们需要确保所有节点都满足以下条件至少3台arm64架构的服务器测试环境可以是虚拟机每台机器配备4核CPU、16GB内存、100GB系统盘额外的空白磁盘用于OSD建议每节点至少2块操作系统为openEuler 20.03 LTS SP2或更高版本我曾经在一个项目中因为忽略了系统版本要求结果在部署时遇到了glibc兼容性问题。所以特别提醒大家一定要先检查系统版本cat /etc/openEuler-release2.2 Podman基础配置在openEuler上我们使用Podman替代Docker作为容器运行时。首先需要在所有节点上安装Podmanyum install -y podman podman-docker配置镜像源是容易被忽视但极其重要的一步。很多同学反映拉取不到aarch64镜像问题往往出在这里。我们需要编辑/etc/containers/registries.conf文件确保包含以下内容unqualified-search-registries [docker.io] [[registry]] location docker.io这个配置告诉Podman在拉取镜像时默认去docker.io查找。配置完成后不需要重启服务立即生效。3. 构建私有镜像仓库3.1 Registry镜像获取与部署在离线环境中我们需要先搭建一个本地镜像仓库。这里选择官方registry镜像但要注意arm64架构的获取方式podman pull registry:2 podman save -o registry-2.tar registry:2将导出的tar包拷贝到内网环境后就可以部署私有仓库了podman load -i registry-2.tar mkdir -p /var/lib/registry podman run --privileged -d --name registry -p 5000:5000 \ -v /var/lib/registry:/var/lib/registry \ --restartalways registry:2记得开放防火墙端口firewall-cmd --permanent --add-port5000/tcp firewall-cmd --reload3.2 安全配置调整由于是内网私有仓库我们需要将其标记为不安全仓库。修改/etc/containers/registries.conf[registries.insecure] registries [10.2.1.176:5000] # 替换为你的实际IP这个配置非常重要否则在推送镜像时会遇到TLS证书验证失败的问题。4. Ceph Reef镜像准备4.1 核心镜像获取Ceph Reef的核心组件包括多个容器镜像我们需要逐个获取。这里有个小技巧先启动一个临时容器从中提取cephadm工具podman pull quay.io/ceph/ceph:v18.2.0 podman run -it quay.io/ceph/ceph:v18.2.0 /bin/bash # 在容器内执行 cp /usr/sbin/cephadm /host/usr/local/sbin/cephadm为什么要这么做因为cephadm脚本中包含了所有依赖镜像的准确版本信息。直接使用容器内的cephadm可以避免版本不匹配的问题。4.2 全量依赖镜像准备根据cephadm脚本中的定义我们需要准备以下镜像podman pull quay.io/prometheus/prometheus:v2.43.0 podman pull docker.io/grafana/loki:2.4.0 podman pull quay.io/prometheus/node-exporter:v1.5.0 # 其他镜像同理...将这些镜像导出为离线包podman save -o ceph-v18.2.0.tar quay.io/ceph/ceph:v18.2.0 podman save -o prometheus-v2.43.0.tar quay.io/prometheus/prometheus:v2.43.0 # 其他镜像同理...5. 镜像导入私有仓库5.1 镜像标记与推送将准备好的镜像导入私有仓库需要两个步骤重新标记和推送。这里有个坑要注意——必须使用IP地址而不是主机名podman tag quay.io/ceph/ceph:v18.2.0 10.2.1.176:5000/quay.io/ceph/ceph:v18.2.0 podman push 10.2.1.176:5000/quay.io/ceph/ceph:v18.2.0我曾经因为使用主机名导致推送卡住半小时后来发现是DNS解析问题。使用IP地址可以避免这类网络问题。5.2 多节点同步配置将registry配置同步到集群其他节点scp /etc/containers/registries.conf node2:/etc/containers/ scp /etc/containers/registries.conf node3:/etc/containers/在其他节点上测试镜像拉取podman pull 10.2.1.176:5000/quay.io/ceph/ceph:v18.2.06. 部署Ceph集群6.1 初始化bootstrap节点使用私有仓库中的镜像初始化第一个节点cephadm bootstrap --mon-ip 10.2.1.176 \ --registry-url 10.2.1.176:5000 \ --registry-username admin --registry-password admin这个命令会自动完成以下工作部署Ceph Monitor和Manager服务生成初始配置和密钥配置所有服务使用私有镜像仓库6.2 添加集群节点将其他节点加入集群cephadm add-host --hostname node2 --ip 10.2.1.191 cephadm add-host --hostname node3 --ip 10.2.1.219添加OSD存储设备ceph orch device zap node1 /dev/sdb --force ceph orch daemon add osd node1:/dev/sdb7. 监控组件部署Ceph Reef的监控栈包括多个组件我们可以通过cephadm统一部署ceph orch apply prometheus --placement3 ceph orch apply grafana --placement3 ceph orch apply alertmanager --placement3部署完成后可以通过以下命令检查服务状态ceph orch ls ceph -s在部署监控组件时我发现一个常见问题是资源不足。建议至少为每个监控服务分配2GB内存否则可能会出现容器不断重启的情况。8. 常见问题排查8.1 镜像拉取失败如果遇到镜像拉取问题首先检查私有仓库是否正常运行防火墙规则是否允许5000端口/etc/containers/registries.conf配置是否正确可以尝试手动拉取测试podman pull 10.2.1.176:5000/quay.io/ceph/ceph:v18.2.08.2 服务启动超时当服务启动超过预期时间时可以查看容器日志podman logs container_id ceph logs service_name我曾经遇到一个案例因为NTP时间不同步导致证书验证失败。所以务必确保所有节点时间同步。8.3 存储设备识别问题如果cephadm无法识别存储设备尝试ceph orch device ls ceph-volume inventory有时候需要先清理磁盘上的残留信息ceph-volume zap /dev/sdb --destroy

相关新闻

最新新闻

日新闻

周新闻

月新闻