在 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-containerimage: busyboxcommand: ["sh", "-c", "while true; do echo hello > /data/test.txt; sleep 10; done"]volumeMounts:- name: gpfs-volumemountPath: /data # 容器內掛載路徑volumes:- name: gpfs-volumepersistentVolumeClaim: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: 50GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retaincsi:driver: spectrumscale.csi.ibm.comvolumeHandle: gpfs-static-volume # 唯一標識volumeAttributes:filesystem: gpfs_datapath: /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:
七、參考資料
- IBM Spectrum Scale CSI 官方文檔
- spectrum-scale-csi GitHub 倉庫
?
?
?
?
?
?
?
?
?
?