【云原生】Oracle Linux 9.6 离线(Air-Gapped)环境下安装 Longhorn 及其底层依赖(iSCSI/NFS)完全指南

【云原生】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 镜像列表

  1. 前往 Longhorn 官方 GitHub Releases 下载目标版本的 longhorn.yaml(例如 v1.x.x)。

  2. 使用以下命令提取文件中所有用到的镜像:

    bash 复制代码
    grep -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 可以正常打开时,即宣告离线安装圆满成功!


💡 总结与排错心得

  1. 多节点批量处理:如果集群节点较多,建议将第一阶段的 RPM 包精准安装命令通过分发工具(如 Ansible)在所有 Worker 节点批量执行。
  2. 安全第一 :离线环境面对依赖冲突,切勿盲目使用 dnf --allowerasing 。优先选择用 rpm --nodeps --force 隔离基础系统组件,只针对业务包进行精准覆盖,是保证生产环境系统稳定的关键。

如果你在 Oracle Linux 9.6 离线安装过程中遇到了其他奇葩的错误提示,欢迎在评论区留言,我们一起交流闭坑!

相关推荐
高山有多高1 小时前
【Linux笔记】线程同步与互斥
linux·笔记
星间都市山脉1 小时前
RecoveryUI 圆角屏安全边距配置及代码调用链
android·java·linux·windows·ubuntu
rest10241 小时前
对主从复的理解
linux
忆挽篱笙歌1 小时前
linux开发工具
linux·运维·ubuntu
Henry-SAP2 小时前
SAP MMBE跨工厂库存层级展示解析
人工智能·云原生·sap·erp
troy1285 小时前
K8s 平台测试清单:深度分析与实战指南
云原生·容器·kubernetes
Henry-SAP11 小时前
SAP PP核心引擎计划策略业务解析
人工智能·云原生·sap·erp
左手の明天11 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
꯭自꯭闭꯭11 小时前
达梦SQL优化相关
linux·运维·数据库·sql