1. 离线环境部署LiteIO概述
在Kubernetes集群中部署存储解决方案时,LiteIO是一个值得考虑的高性能选项。特别是在某些安全要求严格的场景下,我们需要在完全离线的环境中完成整个部署过程。这种部署方式虽然增加了复杂度,但能够满足企业内网环境或隔离网络的安全需求。
离线部署的核心挑战在于:
- 依赖包的完整获取和正确安装
- 编译环境的隔离配置
- 容器镜像的离线分发
- 各组件间的版本兼容性
本文将详细记录我在三节点Kubernetes集群(1个master+2个worker)上完成LiteIO离线部署的全过程,包含从系统依赖安装到最终验证的所有关键步骤。
2. 环境准备与依赖安装
2.1 系统基础环境确认
在开始前,需要确保所有节点满足以下条件:
- CentOS 7.x操作系统
- 已安装Docker 18.06+
- Kubernetes 1.20+集群正常运行
- 各节点间SSH免密互通
- 至少50GB的额外磁盘空间(用于存储依赖包和镜像)
可以通过以下命令快速检查基础环境:
bash复制# 检查系统版本
cat /etc/redhat-release
# 检查Docker版本
docker version --format '{{.Server.Version}}'
# 检查Kubernetes集群状态
kubectl get nodes
2.2 离线RPM包安装
我们将所有依赖的RPM包预先下载并放置在/liteio-offline/rpm目录下。安装时需要使用--nodeps --force参数跳过依赖检查:
bash复制cd /liteio-offline/rpm
# 批量安装所有依赖包
rpm -ivh --nodeps --force *.rpm
# 验证关键组件
gcc --version # 需要4.8.5+
cmake --version # 需要2.8.12+
python3 --version # 需要3.6+
安装过程中常见问题及解决方案:
- 签名警告:出现NOKEY警告可以忽略,不影响安装
- 文件冲突:某些基础包可能已安装,使用
--force强制覆盖 - 依赖缺失:虽然用了
--nodeps,但如果缺少核心依赖仍会失败,需要检查包完整性
提示:建议先将所有节点的yum缓存清空(yum clean all),避免残留数据影响离线安装。
2.3 构建工具链配置
LiteIO依赖DPDK和SPDK,需要额外安装meson和ninja构建工具:
bash复制cd /liteio-offline/whl
# 安装Python wheel包
pip3 install meson-0.60.0-py3-none-any.whl
pip3 install pyelftools-0.32-py3-none-any.whl
pip3 install --force-reinstall ninja-1.9.0-cp36-cp36m-manylinux1_x86_64.whl
# 永久添加PATH
echo "export PATH=\$PATH:/usr/local/bin" >> /etc/profile
source /etc/profile
# 验证工具链
meson --version # 需≥0.60.0
ninja --version # 需≥1.9.0
3. DPDK与SPDK编译安装
3.1 DPDK离线编译
DPDK作为数据平面开发套件,是LiteIO的核心依赖:
bash复制cd /liteio-offline/src
tar -xf dpdk-21.11.tar.xz
cd dpdk-21.11
# 三步式编译安装
meson build --prefix=/usr/local/dpdk-21.11
ninja -C build
ninja -C build install
# 配置环境变量
echo "export PKG_CONFIG_PATH=/usr/local/dpdk-21.11/lib64/pkgconfig:\$PKG_CONFIG_PATH" >> /etc/profile
source /etc/profile
# 验证安装
ls /usr/local/dpdk-21.11/ # 应包含bin、include、lib64等目录
编译时的注意事项:
- 使用
-j参数加速编译(如ninja -C build -j4) - 如果构建目录已存在,直接运行
ninja -C build即可 - 内存不足时可能编译失败,建议至少4GB空闲内存
3.2 SPDK离线编译
SPDK为LiteIO提供存储性能开发工具包:
bash复制cd /liteio-offline/src
tar -zxf spdk-v22.05-src.tar.gz
mv spdk-22.05 spdk
cd spdk
# 安装SPDK专用依赖
cd /liteio-offline/rpm/spdk-deps
rpm -ivh --nodeps --force *.rpm
# 配置编译选项(禁用不需要的模块)
./configure --without-isal --without-vfio-user --disable-tests --with-dpdk=/usr/local/dpdk-21.11
# 编译安装
make -j4
make install
# 验证安装
/usr/local/bin/spdk_tgt --version # 应显示v22.05
关键配置说明:
--without-isal:禁用ISA-L加速(减少依赖)--without-vfio-user:离线环境通常不需要VFIO--with-dpdk:必须指向正确的DPDK安装路径
4. SPDK服务配置
4.1 内核模块加载
SPDK需要特定的内核模块支持:
bash复制# 临时加载模块
modprobe uio
modprobe vfio
modprobe vfio-pci
modprobe nvme
# 设置开机自启
echo -e "uio\nvfio\nvfio-pci\nnvme" >> /etc/modules-load.d/spdk.conf
# 验证模块
lsmod | grep -E "nvme|vfio|uio"
4.2 大页内存配置
SPDK依赖大页内存提升性能:
bash复制# 临时配置(2GB)
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# 永久配置
echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf
sysctl -p
# 挂载大页文件系统
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
echo "nodev /mnt/huge hugetlbfs defaults 0 0" >> /etc/fstab
# 验证配置
grep Huge /proc/meminfo
4.3 SPDK服务启动
bash复制# 停止已有服务
pkill spdk_tgt
# 启动服务(-s指定内存页数,-m指定CPU核心)
/usr/local/bin/spdk_tgt -s 1024 -m 0x1 -r /var/tmp/spdk.sock &
# 验证服务
ps aux | grep spdk_tgt | grep -v grep
ls -l /var/tmp/spdk.sock # 应存在socket文件
5. 容器镜像准备
5.1 离线镜像导入
将所有需要的Docker镜像导入:
bash复制cd /liteio-offline/images/
# 批量导入镜像
for img in *.tar; do docker load -i $img; done
# 验证镜像
docker images | grep -E "busybox|attacher|registrar|provisioner|livenessprobe|node-disk-controller|nvmftgt"
关键镜像说明:
silentred/nvmftgt:NVMe over Fabric target实现node-disk-controller:LiteIO的磁盘控制器- 各类CSI组件:提供Kubernetes存储接口
5.2 存储设备准备
在每个worker节点上准备物理存储:
bash复制# 确认新磁盘(假设为/dev/sdb)
lsblk
# 创建物理卷和卷组
pvcreate /dev/sdb
vgcreate test-vg /dev/sdb
# 验证VG
vgdisplay test-vg # 应显示50G容量
注意:如果磁盘已有分区表,需要使用
pvcreate -ff /dev/sdb强制初始化
6. LiteIO部署与验证
6.1 基础组件部署
在master节点执行:
bash复制cd /liteio-offline/src/liteio/
# 部署基础CRD和控制器
kubectl create -f hack/deploy/base/
# 部署LVM配置
kubectl create -f hack/deploy/lvm/
关键组件验证:
bash复制# 检查命名空间
kubectl get ns obnvmf
# 检查StorageClass
kubectl get sc antstor-nvmf
# 检查Pod状态
kubectl get pods -n obnvmf -w
6.2 部署状态检查
等待所有Pod变为Running状态:
bash复制# 检查控制器
kubectl get deployment -n obnvmf node-disk-controller
# 检查DaemonSet
kubectl get daemonset -n obnvmf obnvmf-disk-agent-app
# 查看日志(示例)
kubectl logs -n obnvmf deploy/node-disk-controller --tail=50
常见问题排查:
- 镜像拉取失败:确认所有节点已正确导入镜像
- Pod卡在Pending:检查资源配额和节点污点
- CrashLoopBackOff:查看日志定位具体错误
6.3 功能验证
创建测试PVC验证存储功能:
yaml复制# test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
namespace: obnvmf
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: antstor-nvmf
应用并验证:
bash复制kubectl apply -f test-pvc.yaml
# 检查PVC状态
kubectl get pvc -n obnvmf test-pvc -w # 应变为Bound
# 查看对应的AntstorVolume
kubectl get antstorvolumes -n obnvmf
7. 运维与调优建议
7.1 性能调优参数
在/etc/profile中添加以下环境变量优化性能:
bash复制# DPDK调优
export DPDK_HUGE_DIR=/mnt/huge
export DPDK_IGB_UIO_DRIVER=uio_pci_generic
# SPDK调优
export SPDK_PCI_WHITELIST="0000:00:00.0" # 替换为实际NVMe设备地址
export SPDK_NO_JSONRPC=1
7.2 监控指标收集
通过kubectl获取LiteIO运行指标:
bash复制# 查看存储池状态
kubectl get storagepools -n obnvmf -o wide
# 查看节点磁盘状态
kubectl get antstornodes -n obnvmf
# 查看卷统计信息
kubectl get antstorvolumes -n obnvmf -o yaml
7.3 日常维护命令
bash复制# 扩容卷组(当添加新磁盘时)
vgextend test-vg /dev/sdc
# 清理残留资源
kubectl delete -f hack/deploy/base/ --grace-period=0 --force
# 日志收集脚本
kubectl logs -n obnvmf deploy/node-disk-controller > controller.log
kubectl logs -n obnvmf ds/obnvmf-disk-agent-app > agent.log
8. 故障排查指南
8.1 常见问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| SPDK服务启动失败 | 大页内存不足 | 检查/proc/meminfo中的HugePages_Free |
| PVC一直Pending | StorageClass配置错误 | 检查SC的provisioner是否为antstor.csi.alipay.com |
| 性能低下 | NUMA未正确配置 | 使用numactl启动SPDK并绑定CPU |
| 容器启动失败 | 镜像版本不匹配 | 确认所有节点使用相同版本的nvmftgt镜像 |
8.2 日志分析技巧
-
控制器日志:关注Volume的创建和绑定过程
bash复制
kubectl logs -n obnvmf deploy/node-disk-controller | grep -i volume -
节点代理日志:查看磁盘管理状态
bash复制
kubectl logs -n obnvmf ds/obnvmf-disk-agent-app -c disk-agent | grep -i lvm -
SPDK日志:检查NVMe设备识别情况
bash复制
journalctl -u spdk_tgt --no-pager -n 50
8.3 环境清理步骤
完整卸载LiteIO的步骤:
bash复制# 删除所有存储资源
kubectl delete pvc --all -n obnvmf
kubectl delete antstorvolumes --all -n obnvmf
# 卸载组件
kubectl delete -f hack/deploy/lvm/
kubectl delete -f hack/deploy/base/
# 清理SPDK
pkill spdk_tgt
rm -rf /var/tmp/spdk.sock
# 卸载软件包
rpm -e $(rpm -qa | grep -E "dpdk|spdk") --nodeps
经过上述步骤,我们完成了LiteIO在离线环境下的完整部署。实际生产环境中,建议在部署前使用Ansible等工具将依赖包和镜像批量分发到所有节点,并编写详细的部署检查清单。对于性能要求高的场景,还需要针对具体的硬件配置(如NVMe型号、网卡类型等)进行深度调优。