在 Kubernetes(k8s)集群中,通过 CSI(Container Storage Interface)对接 GPFS(General Parallel File System,现为 IBM Spectrum Scale)是实现高性能共享存储的重要方案。GPFS 作为并行文件系统,适用于大规模数据处理、HPC 等场景,而 CSI 则标准化了 k8s 与存储系统的接口,简化了集成流程。以下是详细的对接方案与关键要点:
一、核心概念与集成意义
- Kubernetes(k8s):容器编排平台,需要存储系统为 Pod 提供持久化存储(如数据卷)。
- CSI(Container Storage Interface):标准化接口,允许存储厂商开发驱动,使 k8s 无需修改核心代码即可对接存储系统(替代传统的 in-tree 存储插件)。
- GPFS(IBM Spectrum Scale):高性能并行文件系统,支持多节点共享访问、高吞吐量和高可用性,适用于需要大规模数据共享的场景(如 AI 训练、大数据分析)。
集成意义:通过 CSI 将 GPFS 接入 k8s,可让 Pod 直接使用 GPFS 的共享存储,满足高并发、大容量的存储需求,同时利用 k8s 的编排能力实现存储的动态管理
二、前置条件
在对接前需确保以下环境就绪:
GPFS 集群状态:
- GPFS 集群已部署并正常运行(至少 1 个管理节点、多个存储节点)。
- 需在 k8s 所有节点上安装 GPFS 客户端(
gpfs.base
等包),并确保节点已加入 GPFS 集群(通过mmmount
可挂载 GPFS 文件系统)。 - 确认 GPFS 文件系统路径(如
/gpfs/data
),并确保该路径可被 k8s 节点访问
k8s 环境:
- k8s 集群版本需与 CSI 驱动兼容(通常要求 k8s ≥ 1.19,具体看驱动版本)。
- 已安装
kubectl
工具,且有权限操作集群(如部署资源、创建 RBAC)。
网络与权限:
- k8s 节点与 GPFS 管理节点 / 存储节点网络互通(需开放 GPFS 端口,如 1191、2049 等)。
- GPFS 文件系统对 k8s 节点有读写权限(可通过 GPFS 的 ACL 或用户组配置)。
三、CSI 驱动选择:IBM Spectrum Scale CSI
对接 GPFS 的核心是使用IBM 官方提供的 CSI 驱动——spectrum-scale-csi
(专为 IBM Spectrum Scale 设计,支持 GPFS)。该驱动实现了 CSI 规范,支持动态 / 静态存储分配、挂载管理等功能。
- 驱动版本兼容性:需匹配 k8s 版本和 GPFS(Spectrum Scale)版本(参考官方兼容性矩阵)。
- 获取方式:可从IBM GitHub 仓库下载,或通过 Helm Chart 部署。
四、部署步骤
步骤 1:准备 GPFS 客户端与配置
- 在所有 k8s 节点上安装 GPFS 客户端
# 以RHEL为例,安装GPFS客户端包 rpm -ivh gpfs.base-<version>.rpm gpfs.gpl-<version>.rpm gpfs.docs-<version>.rpm
确保 k8s 节点已加入 GPFS 集群,并能挂载目标文件系统:
# 检查节点是否在GPFS集群中
mmlscluster
# 挂载GPFS文件系统(如挂载到/gpfs/data)
mmmount gpfs_data -t gpfs -o rw /gpfs/data
步骤 2:部署 Spectrum Scale CSI 驱动
Spectrum Scale CSI
包含控制器插件(Controller Plugin,部署为 StatefulSet,负责存储分配、PV 管理)和节点插件(Node Plugin,部署为 DaemonSet,负责节点上的存储挂载)。
1. 下载驱动与配置文件
从 GitHub 克隆仓库
git clone https://github.com/IBM/spectrum-scale-csi.git
cd spectrum-scale-csi
2. 配置 RBAC 权限
CSI 驱动需要 k8s 的 RBAC 权限(如访问 PV、PVC、StorageClass 等资源)。驱动提供了默认的 RBAC 配置文件(deploy/rbac.yaml
),包含 ClusterRole、ClusterRoleBinding 等,直接部署即可:
kubectl apply -f deploy/rbac.yaml
3. 部署 CSI 控制器与节点插件
- 控制器插件:运行在 k8s 控制平面,负责处理 PVC 请求、创建 PV 等(需多副本保证高可用)。
- 节点插件:运行在每个 k8s 节点,负责将 GPFS 文件系统挂载到 Pod 的容器中。
通过以下命令部署(使用驱动提供的部署文件):
# 部署控制器插件(StatefulSet)
kubectl apply -f deploy/controller.yaml
# 部署节点插件(DaemonSet)
kubectl apply -f deploy/node.yaml
验证部署:检查 Pod 状态(控制器 Pod 和节点 Pod 均需 Running):
kubectl get pods -n kube-system | grep spectrum-scale-csi
步骤 3:配置存储类(StorageClass)
StorageClass 定义了存储的 “模板”,用于动态创建 PV(PersistentVolume)。需指定 GPFS 文件系统路径、挂载选项等参数。
示例StorageClass
配置(gpfs-sc.yaml
):
piVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gpfs-sc
provisioner: spectrumscale.csi.ibm.com # CSI驱动的provisioner名称
parameters:
# GPFS文件系统名称(通过mmlsfs查看)
filesystem: gpfs_data
# GPFS文件系统在节点上的挂载路径(需与节点上的实际挂载一致)
clusterMountpoint: /gpfs/data
# 动态创建的目录权限(可选)
dirPermissions: "0777"
reclaimPolicy: Delete # PV回收策略(Delete/Retain)
allowVolumeExpansion: true # 允许卷扩容(需GPFS支持)
部署存储类:
kubectl apply -f gpfs-sc.yaml
步骤 4:创建 PVC 与使用存储
通过 PVC(PersistentVolumeClaim)申请存储,k8s 会基于 StorageClass 自动创建 PV,并绑定到 PVC。
1. 创建 PVC(gpfs-pvc.yaml
):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gpfs-pvc
spec:
accessModes:
- ReadWriteMany # GPFS支持多节点读写(RWX)
resources:
requests:
storage: 10Gi # 申请10GiB存储(GPFS实际按目录分配,此值为逻辑大小)
storageClassName: gpfs-sc # 关联上述存储类
部署 PVC:
kubectl apply -f gpfs-pvc.yaml
2. 在 Pod 中使用 PVC:
apiVersion: v1
kind: Pod
metadata:
name: gpfs-pod
spec:
containers:
- name: test-container
image: busybox
command: ["sh", "-c", "while true; do echo hello > /data/test.txt; sleep 10; done"]
volumeMounts:
- name: gpfs-volume
mountPath: /data # 容器内挂载路径
volumes:
- name: gpfs-volume
persistentVolumeClaim:
claimName: gpfs-pvc # 关联PVC
部署 Pod 后,验证存储是否可用:
# 进入Pod查看挂载
kubectl exec -it gpfs-pod -- df -h | grep /data
# 检查文件是否写入GPFS
kubectl exec -it gpfs-pod -- cat /data/test.txt
五、关键注意事项
版本兼容性:
spectrum-scale-csi
驱动版本需与 k8s 版本(如 1.24+)、GPFS(Spectrum Scale)版本(如 5.1.6+)匹配,否则可能出现挂载失败或功能异常(参考官方兼容性表)。
高可用性:
- CSI 控制器需部署多副本(如 3 个),避免单点故障。
- GPFS 集群本身需配置高可用(如多管理节点、数据副本),确保存储后端可靠。
权限配置:
- GPFS 文件系统需允许 k8s 节点的用户(如 Pod 的 UID/GID)访问,可通过 GPFS 的 ACL 配置(
mmchacl
)或dirPermissions
参数控制。 - 若 GPFS 启用了认证(如 Kerberos),需在 CSI 驱动中通过 Secret 传递认证信息(参考驱动文档的安全配置)。
- GPFS 文件系统需允许 k8s 节点的用户(如 Pod 的 UID/GID)访问,可通过 GPFS 的 ACL 配置(
性能调优:
- 挂载选项:在 StorageClass 的
parameters
中添加 GPFS 性能参数(如mountOptions: "rsize=1m,wsize=1m"
优化读写块大小)。 - 避免在 GPFS 上存储小文件(影响并行性能),建议用于大文件场景(如数据集、日志)。
- 挂载选项:在 StorageClass 的
静态存储分配:
若不需要动态创建 PV,可手动创建 PV(指定 GPFS 路径),示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: gpfs-static-pv
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: spectrumscale.csi.ibm.com
volumeHandle: gpfs-static-volume # 唯一标识
volumeAttributes:
filesystem: gpfs_data
path: /gpfs/data/static-dir # GPFS中已存在的目录
六、常见问题与排查
Pod 挂载失败:
- 检查 k8s 节点是否已挂载 GPFS(
mount | grep gpfs
),未挂载需先通过mmmount
挂载。 - 查看 CSI 节点插件日志:
kubectl logs -n kube-system <spectrum-scale-csi-node-xxx> -c node-driver-registrar
,排查挂载命令错误。
- 检查 k8s 节点是否已挂载 GPFS(
动态 PV 创建失败:
- 检查 StorageClass 的
filesystem
和clusterMountpoint
是否正确(与 GPFS 实际配置一致)。 - 查看 CSI 控制器日志:
kubectl logs -n kube-system <spectrum-scale-csi-controller-xxx> -c csi-provisioner
,定位目录创建失败原因(如权限不足)。
- 检查 StorageClass 的
权限拒绝(Permission denied):
- 检查 GPFS 目录的 ACL:
mmgetacl /gpfs/data/<pv-path>
,确保 k8s 节点的用户(如 Pod 的 UID=1000)有读写权限,可通过mmchacl
调整。
- 检查 GPFS 目录的 ACL:
七、参考资料