【云原生】Oracle Linux 9.6 离线(Air-Gapped)环境安装 Longhorn 及其底层依赖(iSCSI/NFS)避坑与实战指南
前言:在企业级生产环境中,Kubernetes 集群通常部署在完全隔离的离线(Air-Gapped)网络环境中。分布式云原生存储Longhorn作为 CNCF 的毕业项目,因其轻量和易用性备受青睐。但由于 Longhorn 强依赖于宿主机的
iSCSI和NFS客户端,在离线环境下安装往往会因为“依赖地狱”导致部署失败。本文将基于Oracle Linux 9.6(RHEL 9 系)系统,手把手教你如何安全、合规地离线下载所有开源免费的组件包,并分享如何精准避开引发系统崩溃的依赖冲突冲突陷阱,完成 Longhorn 存储系统的整套部署。
🛠️ 环境准备与组件说明
本次涉及的所有组件均为完全开源且商用免费的项目,无任何版权或授权限制:
- Oracle Linux 9.6:基于 RHEL 1:1 编译的企业级系统,源码与补丁完全免费。
- Longhorn:CNCF 毕业级开源存储项目(Apache 2.0 协议)。
- iscsi-initiator-utils:Linux 原生 iSCSI 客户端。
- nfs-utils:Linux 原生 NFS 客户端。
第一阶段:离线安装宿主机依赖(iSCSI & NFS)
Longhorn 的工作原理需要宿主机支持 iSCSI 协议(用于块设备挂载)和 NFS 协议(用于系统备份与部分组件调度)。我们必须在所有Worker 节点(建议 Master 也安装)上部署这些依赖。
1.1 在「有网环境」下载 RPM 及其完整依赖
找一台系统版本相同(Oracle Linux 9 / Rocky Linux 9 / RHEL 9)的联网电脑,利用dnf的本地下载功能分析并打包所有依赖:
# 创建临时目录mkdir-p/tmp/longhorn-deps&&cd/tmp/longhorn-deps# 仅下载不安装,自动解析并下载所有交叉依赖包sudodnf download--resolve--alldeps-yiscsi-initiator-utils nfs-utils# 打包文件夹tar-czvflonghorn-deps.tar.gz /tmp/longhorn-deps1.2 🔴【核心避坑】离线本地安装与冲突解决
🔥 常见错误陷阱
在离线机器上,如果我们直接运行sudo dnf localinstall -y *.rpm --disablerepo=*,大概率会触发以下极其危险的报错:
Error: Problem: The operation would result in removing the following protected packages: systemd, systemd-udev- 原因分析:这是因为 DNF 试图用联网机下载的更新版本的底层系统包(如
systemd-libs或pam)去覆盖离线机。这会触发系统的核心自我保护锁。千万不要听从提示添加--allowerasing,否则会导致系统核心组件被卸载、系统直接崩溃无法开机!
✅ 安全解决方案:绝对安全的「精准挑包强装法」
由于 Oracle Linux 9.6 自身已经自带了绝大部分底层基础库,我们不需要让 DNF 做全局复杂的依赖计算。直接使用rpm命令将最核心的 3 个存储业务包强制“塞”进系统,既高效又绝对安全,完全不会动到系统原有的核心引导。
在解压后的.rpm目录下执行:
# 1. 强制安装 iSCSI 核心包(这两个包互相有依赖,必须一起安装)sudorpm-ivhiscsi-initiator-utils-*.rpm iscsi-initiator-utils-iscsiuio-*.rpm--nodeps--force# 2. 强制安装 NFS 核心包sudorpm-ivhnfs-utils-*.rpm--nodeps--force(注:过程中如果出现warning: ... NOKEY警告,是因为离线环境没有官方公钥证书,完全不影响正常使用。)
1.3 启动服务与状态完美验证
安装完成后,必须手动激活iscsid服务,并验证两项依赖是否完全就绪:
# 启动并设置开机自启sudosystemctlenable--nowiscsid.service🛠️ 验证一:检查 iSCSI 服务状态
运行命令sudo systemctl status iscsid.service,当看到绿色高亮的active (running)以及Ready to process requests时,说明 iSCSI 完全成功:
● iscsid.service - Open-iSCSI Loaded: loaded (/usr/lib/systemd/system/iscsid.service; enabled; preset: disabled) Active: active (running) since Fri 2026-10-02 11:21:01 CST; 8s ago Status: "Ready to process requests" Main PID: 1127648 (iscsid) CGroup: /system.slice/iscsid.service └─1127648 /usr/sbin/iscsid -f🛠️ 验证二:检查 NFS 客户端
运行命令showmount --version,系统应当能正确识别并输出版本号:
showmount for 2.5.4至此,宿主机层面的底层存储环境已全部完美打通!
第二阶段:离线同步 Longhorn 镜像
接下来我们需要处理 Longhorn 自身的容器镜像。我们需要在联网机拉取后,导入到内部的私有镜像仓库(如 Harbor)。
2.1 获取 Longhorn 镜像列表
- 前往 Longhorn 官方 GitHub Releases 下载目标版本的
longhorn.yaml(例如 v1.x.x)。 - 使用以下命令提取文件中所有用到的镜像:
grep-oE"image: .*"longhorn.yaml|awk'{print $2}'|sort-u>images.txt
2.2 在「有网环境」批量拉取并打包
编写一个简单的 Shell 脚本download.sh:
#!/bin/bashIMAGES_FILE="images.txt"OUTPUT_TAR="longhorn-images.tar"echo"开始下载 Longhorn 镜像..."whileIFS=read-rimage;doecho"Pulling:$image"dockerpull"$image"done<"$IMAGES_FILE"echo"正在打包镜像为 tar 包..."dockersave-o"$OUTPUT_TAR"$(cat"$IMAGES_FILE")echo"打包完成:$OUTPUT_TAR"2.3 在「离线环境」推送至私有仓库
将打包好的longhorn-images.tar传到离线环境的私有镜像仓库节点,执行导入与推送脚本push.sh(记得修改为你自己的私有仓库地址):
#!/bin/bashPRIVATE_REGISTRY="://yourdomain.com"# 替换为你的私有仓库地址IMAGES_FILE="images.txt"echo"正在加载本地镜像..."dockerload-ilonghorn-images.tarecho"开始推送镜像至私有仓库..."whileIFS=read-rimage;do# 提取镜像名和标签,例如 longhornio/longhorn-manager:v1.5.1 -> longhorn-manager:v1.5.1IMAGE_NAME=$(echo"$image"|awk-F'/''{print $NF}')NEW_IMAGE="${PRIVATE_REGISTRY}/${IMAGE_NAME}"echo"Tagging$image->$NEW_IMAGE"dockertag"$image""$NEW_IMAGE"dockerpush"$NEW_IMAGE"done<"$IMAGES_FILE"第三阶段:修改配置并最终部署 Longhorn
配置与镜像全部就绪后,我们只需要将官方清单中的镜像地址替换为内部私有仓库的地址。
3.1 替换 YAML 中的镜像地址
如果使用单文件部署,直接利用sed批量替换:
# 将默认的 longhornio/ 替换为你的内部私有仓库路径sed-i's|image: longhornio/|image: ://yourdomain.com/|g'longhorn.yaml3.2 如果使用 Helm 部署(推荐)
若使用 Helm,可以直接下载官方的 Chart 压缩包,解压后修改values.yaml中的registryUrl:
image:longhorn:manager:repository:://yourdomain.com/longhorn-managerengine:repository:://yourdomain.com/longhorn-engine3.3 执行部署与检查
# YAML 部署kubectl apply-flonghorn.yaml# 检查部署状态kubectl-nlonghorn-system get pod-w当所有组件的 Pod 状态均变为Running,并且longhorn-ui可以正常打开时,即宣告离线安装圆满成功!
💡 总结与排错心得
- 多节点批量处理:如果集群节点较多,建议将第一阶段的 RPM 包精准安装命令通过分发工具(如 Ansible)在所有 Worker 节点批量执行。
- 安全第一:离线环境面对依赖冲突,切勿盲目使用
dnf --allowerasing。优先选择用rpm --nodeps --force隔离基础系统组件,只针对业务包进行精准覆盖,是保证生产环境系统稳定的关键。
如果你在 Oracle Linux 9.6 离线安装过程中遇到了其他奇葩的错误提示,欢迎在评论区留言,我们一起交流闭坑!