k8s的csi对接GPFS

发布于:2025-07-28 ⋅ 阅读:(16) ⋅ 点赞:(0)

在 Kubernetes(k8s)集群中,通过 CSI(Container Storage Interface)对接 GPFS(General Parallel File System,现为 IBM Spectrum Scale)是实现高性能共享存储的重要方案。GPFS 作为并行文件系统,适用于大规模数据处理、HPC 等场景,而 CSI 则标准化了 k8s 与存储系统的接口,简化了集成流程。以下是详细的对接方案与关键要点:

一、核心概念与集成意义

  1. Kubernetes(k8s):容器编排平台,需要存储系统为 Pod 提供持久化存储(如数据卷)。
  2. CSI(Container Storage Interface):标准化接口,允许存储厂商开发驱动,使 k8s 无需修改核心代码即可对接存储系统(替代传统的 in-tree 存储插件)。
  3. GPFS(IBM Spectrum Scale):高性能并行文件系统,支持多节点共享访问、高吞吐量和高可用性,适用于需要大规模数据共享的场景(如 AI 训练、大数据分析)。

集成意义:通过 CSI 将 GPFS 接入 k8s,可让 Pod 直接使用 GPFS 的共享存储,满足高并发、大容量的存储需求,同时利用 k8s 的编排能力实现存储的动态管理

二、前置条件

在对接前需确保以下环境就绪:

  1. GPFS 集群状态

    • GPFS 集群已部署并正常运行(至少 1 个管理节点、多个存储节点)。
    • 需在 k8s 所有节点上安装 GPFS 客户端(gpfs.base等包),并确保节点已加入 GPFS 集群(通过mmmount可挂载 GPFS 文件系统)。
    • 确认 GPFS 文件系统路径(如/gpfs/data),并确保该路径可被 k8s 节点访问
  2. k8s 环境

    • k8s 集群版本需与 CSI 驱动兼容(通常要求 k8s ≥ 1.19,具体看驱动版本)。
    • 已安装kubectl工具,且有权限操作集群(如部署资源、创建 RBAC)。
  3. 网络与权限

    • 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

五、关键注意事项

  1. 版本兼容性

    • spectrum-scale-csi驱动版本需与 k8s 版本(如 1.24+)、GPFS(Spectrum Scale)版本(如 5.1.6+)匹配,否则可能出现挂载失败或功能异常(参考官方兼容性表)。
  2. 高可用性

    • CSI 控制器需部署多副本(如 3 个),避免单点故障。
    • GPFS 集群本身需配置高可用(如多管理节点、数据副本),确保存储后端可靠。
  3. 权限配置

    • GPFS 文件系统需允许 k8s 节点的用户(如 Pod 的 UID/GID)访问,可通过 GPFS 的 ACL 配置(mmchacl)或dirPermissions参数控制。
    • 若 GPFS 启用了认证(如 Kerberos),需在 CSI 驱动中通过 Secret 传递认证信息(参考驱动文档的安全配置)。
  4. 性能调优

    • 挂载选项:在 StorageClass 的parameters中添加 GPFS 性能参数(如mountOptions: "rsize=1m,wsize=1m"优化读写块大小)。
    • 避免在 GPFS 上存储小文件(影响并行性能),建议用于大文件场景(如数据集、日志)。
  5. 静态存储分配
    若不需要动态创建 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中已存在的目录

六、常见问题与排查

  1. Pod 挂载失败

    • 检查 k8s 节点是否已挂载 GPFS(mount | grep gpfs),未挂载需先通过mmmount挂载。
    • 查看 CSI 节点插件日志:kubectl logs -n kube-system <spectrum-scale-csi-node-xxx> -c node-driver-registrar,排查挂载命令错误。
  2. 动态 PV 创建失败

    • 检查 StorageClass 的filesystemclusterMountpoint是否正确(与 GPFS 实际配置一致)。
    • 查看 CSI 控制器日志:kubectl logs -n kube-system <spectrum-scale-csi-controller-xxx> -c csi-provisioner,定位目录创建失败原因(如权限不足)。
  3. 权限拒绝(Permission denied)

    • 检查 GPFS 目录的 ACL:mmgetacl /gpfs/data/<pv-path>,确保 k8s 节点的用户(如 Pod 的 UID=1000)有读写权限,可通过mmchacl调整。

七、参考资料

 

 

 

 

 

 

 

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到