在容器化情境中,傳統方案常採用基於FUSE的檔案系統(如ossfs)掛載Object Storage Service資料。但對於小檔案讀取密集型情境(例如AI訓練集載入、時序日誌分析等需要快速遍曆百萬級小檔案的業務情境),傳統方案難以滿足高吞吐與低延遲需求。此時,推薦採用虛擬塊裝置方案,通過strmvol儲存卷直接掛載Object Storage Service資料,最佳化小檔案讀取效能。
注意事項
strmvol儲存卷
目前僅支援以內網方式訪問OSS資料,即僅支援使用內網Endpoint。
虛擬塊裝置初始化時需要構建全量的檔案元資訊索引,該階段需要佔用節點部分資源,業務Pod會處於ContainerCreating狀態。所需資源與時間與OSS Bucket掛載路徑下檔案數量緊密相關。
在選擇OSS Bucket掛載路徑時應按照最小原則。
如業務A訪問OSS Bucket中
/app/a/下的內容,業務B訪問/app/b/下的內容時,建議為A、B業務分別建立掛載目標路徑為/app/a/與/app/b/的儲存卷。初始化期間所需時間及資源開銷,請參見中繼資料索引構建。
虛擬塊裝置在節點上掛載期間(除初始化階段)佔用的資源開銷受PV上的相關配置限制,請保留足夠的節點資源。
單塊虛擬塊裝置容量為16 TiB,即掛載的OSS路徑下最多可儲存16 TiB資料。
叢集和節點要求
叢集類型為ACK託管叢集Pro版或ACK專有叢集,且叢集版本為1.20及以上,儲存外掛程式類型為CSI。
節點核心版本≥4.19,資源規格建議4C8G及以上。
支援的節點OS:Alibaba Cloud Linux 3、Alibaba Cloud Linux 2、CentOS 7。為使用erofs作業系統最佳化資料訪問效能,推薦使用Alibaba Cloud Linux 3。
說明CentOS 7和AliyunLinux 2目前已停止維護(EOL),具體請參見【產品變更】停止維護Alibaba Cloud Linux 2、CentOS 7的公告。
暫不支援為調度到虛擬節點上的Serverless Pod掛載strmvol儲存卷。
準備工作
步驟一:部署strmvol-csi-driver
使用strmvol儲存卷需要部署單獨的CSI驅動(strmvol-csi-driver組件)。部署後,該CSI驅動與ACK組件管理中維護的csi-provisioner與csi-plugin組件相互獨立,不會產生衝突。
登入Container Service管理主控台,在左側導覽列,選擇。
在應用市場頁面,搜尋strmvol-csi-driver,然後單擊對應的卡片。
在應用詳情頁面,單擊右上方的一鍵部署。
在彈出面板中完成基本資料和參數配置,單擊確定。
步驟二:配置OSS存取權限
建立RAM使用者並授權。
建立RAM使用者,如已建立可跳過。具體操作,請參見建立RAM使用者。
建立如下OSS訪問的自訂權限原則。具體操作,請參見建立自訂權限原則。
以下唯讀和讀寫權限策略請根據使用需求選擇,並替換
mybucket為您實際建立的Bucket名稱。OSS唯讀權限原則
OSS讀寫權限
(可選)若您使用KMS託管的指定CMK ID加密OSS Object,還需要為該RAM使用者配置KMS許可權。具體操作,請參見加密操作。
為RAM使用者添加OSS許可權。具體操作,請參見為RAM使用者授權。
為RAM使用者建立AccessKey。具體操作,請參見擷取AccessKey。
建立存放鑒權資訊的Secret,用於訪問OSS資料。
命令樣本如下,請替換
akId和akSecret為實際使用的AccessKey。kubectl create -n default secret generic strmvol-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'
掛載strmvol儲存卷
步驟一:建立strmvol儲存卷
使用strmvol靜態卷
建立PV。
修改以下YAML,儲存為strmvol-pv.yaml。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-strmvol spec: capacity: # 掛載的OSS掛載點下最高可儲存16 TiB資料。 storage: 20Gi # 僅支援ReadOnlyMany訪問模式。 accessModes: - ReadOnlyMany # 為避免刪除遠端資料,目前僅支援Retain。 persistentVolumeReclaimPolicy: Retain csi: driver: strmvolplugin.csi.alibabacloud.com volumeHandle: pv-strmvol # 使用準備工作中建立的secret。 nodeStageSecretRef: name: strmvol-secret namespace: default volumeAttributes: bucket: cnfs-oss-test path: /subpath # strmvol儲存卷僅支援以內網訪問OSS資料。 url: oss-cn-hangzhou-internal.aliyuncs.com umask: "000" directMode: "false" resourceLimit: "2c4g"nodeStageSecretRef參數說明參數
是否必選
說明
name必選
儲存AccessKey資訊的Secret名稱。
namespace必選
儲存AccessKey資訊的Secret所在的命名空間。
volumeAttributes參數說明參數
是否必選
說明
bucket必選
需要掛載的OSS Bucket。
path可選
OSS Bucket掛載路徑,表示掛載時相對Bucket根檔案的目錄結構。
重要掛載路徑的選擇應按照最小夠用原則。
url必選
掛載OSS的內網Endpoint。Endpoint以OSS控制台Bucket概覽頁為準,常見內網格式如下:
http://oss-{{regionName}}-internal.aliyuncs.com或https://oss-{{regionName}}-internal.aliyuncs.com。重要vpc100-oss-{{regionName}}.aliyuncs.com的內網訪問連接埠格式已廢棄,請及時切換。umask可選
掛載虛擬塊裝置後檔案系統預設許可權的掩碼。
如若您期望檔案系統的預設許可權為755,則umask應配置為022。
directMode可選
是否開啟direct模式。
"true":開啟direct模式時,關閉預取與資料本機快取,適合小檔案隨機讀情境,如訓練集的隨機批量讀取。"false":預設關閉direct模式,適合小檔案順序讀、大檔案等通用情境。若您的業務沒有明顯資料讀取特性,請保持direct模式關閉。
resourceLimit可選
掛載虛擬塊裝置後能使用節點的最大資源限制。
如
"2c4g"表示該虛擬塊裝置最多能佔用節點的2 vCPU、4GiB記憶體資源。說明記憶體主要用於資料預取與本機快取。開啟direct模式時,所需記憶體量會明顯低於預設值。
對非Alibaba Cloud Linux 3作業系統,資料讀取效能上限趨近,因此不推薦使用過高配置。具體請參見資料讀取效能測試。
建立PV。
kubectl create -f strmvol-pv.yaml確認PV狀態。
kubectl get pv pv-strmvol預期返回如下:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-strmvol 20Gi ROX Retain Available <unset> 18s
建立PVC。
修改以下YAML,儲存為strmvol-pvc-static.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-strmvol namespace: default spec: # 以下配置需要與PV一致 accessModes: - ReadOnlyMany resources: requests: storage: 20Gi volumeName: pv-strmvol建立PVC。
kubectl create -f strmvol-pvc-static.yaml確認PVC狀態。
kubectl get pvc pvc-strmvol預期返回如下,可以看到PVC已綁定PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-strmvol-2 Bound pv-strmvol 20Gi ROX <unset> 16s
使用strmvol動態磁碟區
建立StorageClass。
修改以下YAML,儲存為strmvol-sc.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: strmvol-test parameters: # 使用準備工作中建立的secret。 csi.storage.k8s.io/node-stage-secret-name: strmvol-secret csi.storage.k8s.io/node-stage-secret-namespace: default bucket: cnfs-oss-test path: /subpath # strmvol儲存卷僅支援以內網訪問OSS資料。 url: oss-cn-hangzhou-internal.aliyuncs.com umask: "000" directMode: "false" resourceLimit: "2c4g" provisioner: strmvolplugin.csi.alibabacloud.com # 為避免刪除遠端資料,目前僅支援Retain reclaimPolicy: Retain volumeBindingMode: Immediateparameters中的相關參數說明如下:配置Secret
參數
是否必選
說明
csi.storage.k8s.io/node-stage-secret-name必選
儲存AccessKey資訊的Secret名稱。
csi.storage.k8s.io/node-stage-secret-namespace必選
儲存AccessKey資訊的Secret所在的命名空間。
配置儲存卷
參數
是否必選
說明
bucket必選
需要掛載的OSS Bucket。
path可選
OSS Bucket掛載路徑,表示掛載時相對Bucket根檔案的目錄結構。
重要掛載路徑的選擇應按照最小夠用原則。
url必選
掛載OSS的內網Endpoint。Endpoint以OSS控制台Bucket概覽頁為準,常見內網格式如下:
http://oss-{{regionName}}-internal.aliyuncs.com或https://oss-{{regionName}}-internal.aliyuncs.com。重要vpc100-oss-{{regionName}}.aliyuncs.com的內網訪問連接埠格式已廢棄,請及時切換。umask可選
掛載虛擬塊裝置後檔案系統預設許可權的掩碼。
如若您期望檔案系統的預設許可權為755,則umask應配置為022。
directMode可選
是否開啟direct模式。
"true":開啟direct模式時,關閉預取與資料本機快取,適合小檔案隨機讀情境,如訓練集的隨機批量讀取。"false":預設關閉direct模式,適合小檔案順序讀、大檔案等通用情境。若您的業務沒有明顯資料讀取特性,請保持direct模式關閉。
resourceLimit可選
掛載虛擬塊裝置後能使用節點的最大資源限制。
如
"2c4g"表示該虛擬塊裝置最多能佔用節點的2 vCPU、4GiB記憶體資源。說明記憶體主要用於資料預取與本機快取。開啟direct模式時,所需記憶體量會明顯低於預設值。
對非Alibaba Cloud Linux 3作業系統,資料讀取效能上限趨近,因此不推薦使用過高配置。具體請參見資料讀取效能測試。
建立StorageClass。
kubectl create -f strmvol-sc.yaml
建立PVC。
修改以下YAML,儲存為strmvol-pvc-dynamic.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-strmvol namespace: default spec: # 僅支援ReadOnlyMany訪問模式 accessModes: - ReadOnlyMany # 指定StorageClass storageClassName: strmvol-test resources: requests: # 掛載的OSS掛載點下最高可儲存16 TiB資料 storage: 20Gi建立PVC。
kubectl create -f strmvol-pvc-dynamic.yaml確認PVC狀態。
kubectl get pvc pvc-strmvol預期返回如下,可以看到PVC已綁定CSI自動建立的PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-strmvol Bound strmvol-d8d1d22a-e1d7-4caa-b875-54f378dec769 20Gi ROX strmvol-test <unset> 3m
步驟二:建立應用並掛載strmvol儲存卷
使用以下YAML,建立strmvol-test.yaml。
以下YAML樣本可以建立包含1個Pod的StatefulSet,Pod通過名為
pvc-strmvol的PVC申請儲存資源,掛載路徑為/data。apiVersion: apps/v1 kind: StatefulSet metadata: name: strmvol-test namespace: default spec: replicas: 1 selector: matchLabels: app: strmvol-test template: metadata: labels: app: strmvol-test spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-strmvol mountPath: /data volumes: - name: pvc-strmvol persistentVolumeClaim: claimName: pvc-strmvol建立StatefulSet並掛載strmvol儲存卷。
kubectl create -f strmvol-test.yaml查看StatefulSet中Pod的部署情況。
kubectl get pod -l app=strmvol-test預期返回:
NAME READY STATUS RESTARTS AGE strmvol-test-0 1/1 Running 0 14s驗證掛載點類型為塊裝置,且應用能正常訪問OSS資料。
kubectl exec -it strmvol-test-0 -- sh -c "df /data && ls /data"預期返回:
Filesystem 1K-blocks Used Available Use% Mounted on /dev/ublkb1 24812 24812 0 100% /data <data in OSS mountpath>