【云原生】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 的本地下载功能分析并打包所有依赖:
bash
# 创建临时目录
mkdir -p /tmp/longhorn-deps && cd /tmp/longhorn-deps
# 仅下载不安装,自动解析并下载所有交叉依赖包
sudo dnf download --resolve --alldeps -y iscsi-initiator-utils nfs-utils
# 打包文件夹
tar -czvf longhorn-deps.tar.gz /tmp/longhorn-deps
1.2 🔴【核心避坑】离线本地安装与冲突解决
🔥 常见错误陷阱
在离线机器上,如果我们直接运行 sudo dnf localinstall -y *.rpm --disablerepo=*,大概率会触发以下极其危险的报错:
text
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 目录下执行:
bash
# 1. 强制安装 iSCSI 核心包(这两个包互相有依赖,必须一起安装)
sudo rpm -ivh iscsi-initiator-utils-*.rpm iscsi-initiator-utils-iscsiuio-*.rpm --nodeps --force
# 2. 强制安装 NFS 核心包
sudo rpm -ivh nfs-utils-*.rpm --nodeps --force
(注:过程中如果出现 warning: ... NOKEY 警告,是因为离线环境没有官方公钥证书,完全不影响正常使用。)
1.3 启动服务与状态完美验证
安装完成后,必须手动激活 iscsid 服务,并验证两项依赖是否完全就绪:
bash
# 启动并设置开机自启
sudo systemctl enable --now iscsid.service
🛠️ 验证一:检查 iSCSI 服务状态
运行命令 sudo systemctl status iscsid.service,当看到绿色高亮的 active (running) 以及 Ready to process requests 时,说明 iSCSI 完全成功:
text
● 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,系统应当能正确识别并输出版本号:
text
showmount for 2.5.4
至此,宿主机层面的底层存储环境已全部完美打通!
第二阶段:离线同步 Longhorn 镜像
接下来我们需要处理 Longhorn 自身的容器镜像。我们需要在联网机拉取后,导入到内部的私有镜像仓库(如 Harbor)。
2.1 获取 Longhorn 镜像列表
-
前往 Longhorn 官方 GitHub Releases 下载目标版本的
longhorn.yaml(例如 v1.x.x)。 -
使用以下命令提取文件中所有用到的镜像:
bashgrep -oE "image: .*" longhorn.yaml | awk '{print $2}' | sort -u > images.txt
2.2 在「有网环境」批量拉取并打包
编写一个简单的 Shell 脚本 download.sh:
bash
#!/bin/bash
IMAGES_FILE="images.txt"
OUTPUT_TAR="longhorn-images.tar"
echo "开始下载 Longhorn 镜像..."
while IFS= read -r image; do
echo "Pulling: $image"
docker pull "$image"
done < "$IMAGES_FILE"
echo "正在打包镜像为 tar 包..."
docker save -o "$OUTPUT_TAR" $(cat "$IMAGES_FILE")
echo "打包完成:$OUTPUT_TAR"
2.3 在「离线环境」推送至私有仓库
将打包好的 longhorn-images.tar 传到离线环境的私有镜像仓库节点,执行导入与推送脚本 push.sh(记得修改为你自己的私有仓库地址):
bash
#!/bin/bash
PRIVATE_REGISTRY="://yourdomain.com" # 替换为你的私有仓库地址
IMAGES_FILE="images.txt"
echo "正在加载本地镜像..."
docker load -i longhorn-images.tar
echo "开始推送镜像至私有仓库..."
while IFS= read -r image; do
# 提取镜像名和标签,例如 longhornio/longhorn-manager:v1.5.1 -> longhorn-manager:v1.5.1
IMAGE_NAME=$(echo "$image" | awk -F'/' '{print $NF}')
NEW_IMAGE="${PRIVATE_REGISTRY}/${IMAGE_NAME}"
echo "Tagging $image -> $NEW_IMAGE"
docker tag "$image" "$NEW_IMAGE"
docker push "$NEW_IMAGE"
done < "$IMAGES_FILE"
第三阶段:修改配置并最终部署 Longhorn
配置与镜像全部就绪后,我们只需要将官方清单中的镜像地址替换为内部私有仓库的地址。
3.1 替换 YAML 中的镜像地址
如果使用单文件部署,直接利用 sed 批量替换:
bash
# 将默认的 longhornio/ 替换为你的内部私有仓库路径
sed -i 's|image: longhornio/|image: ://yourdomain.com/|g' longhorn.yaml
3.2 如果使用 Helm 部署(推荐)
若使用 Helm,可以直接下载官方的 Chart 压缩包,解压后修改 values.yaml 中的 registryUrl:
yaml
image:
longhorn:
manager:
repository: ://yourdomain.com/longhorn-manager
engine:
repository: ://yourdomain.com/longhorn-engine
3.3 执行部署与检查
bash
# YAML 部署
kubectl apply -f longhorn.yaml
# 检查部署状态
kubectl -n longhorn-system get pod -w
当所有组件的 Pod 状态均变为 Running,并且 longhorn-ui 可以正常打开时,即宣告离线安装圆满成功!
💡 总结与排错心得
- 多节点批量处理:如果集群节点较多,建议将第一阶段的 RPM 包精准安装命令通过分发工具(如 Ansible)在所有 Worker 节点批量执行。
- 安全第一 :离线环境面对依赖冲突,切勿盲目使用
dnf --allowerasing。优先选择用rpm --nodeps --force隔离基础系统组件,只针对业务包进行精准覆盖,是保证生产环境系统稳定的关键。
如果你在 Oracle Linux 9.6 离线安装过程中遇到了其他奇葩的错误提示,欢迎在评论区留言,我们一起交流闭坑!