如果應用需要儲存圖片、音視頻等非結構化資料,可以使用OSS作為持久化儲存卷。本文介紹如何為應用掛載OSS靜態儲存卷,並驗證OSS的共用儲存和持久化儲存。
背景資訊
OSS是一個海量、安全、低成本、高可靠的儲存空間,適合儲存寫入後較少修改的資料,以及非結構化資料(如圖片、音視頻等)。更多資訊,請參見儲存概述。
OSS儲存卷用戶端
OSS儲存卷可通過用戶端檔案系統(Filesystem in Userspace,簡稱FUSE)實現Object Storage Service的本地掛載。相較於傳統的本機存放區和Block Storage,其在POSIX操作相容性方面存在一定限制。目前ACS支援如下OSS儲存卷用戶端。
適用情境 | 用戶端 | 類型 | 說明 |
讀寫或需要配置使用者權限等絕大部分情境。 | FUSE | 支援大部分POSIX操作,包括追加寫、隨機寫、設定使用者權限等。 | |
唯讀或只包括順序追加寫的情境。如AI訓練、推理、巨量資料處理、自動駕駛等。 | FUSE | 支援完整讀和順序追加寫操作。適用於多讀情境,如AI訓練、推理、巨量資料處理、自動駕駛等,可大幅提升資料讀取效能。 ossfs 2.0目前僅支援GPU算力。如需使用CPU算力,請提交工單申請。 |
若對當前業務的讀寫模型不明確,建議優先選用ossfs 1.0。ossfs 1.0對POSIX操作的相容性更佳,可更好地保障業務穩定運行。
對於讀寫可分離情境,即讀寫操作不同時進行或讀寫操作檔案不同(例如斷點儲存、日誌持久儲存等),建議拆分不同的儲存卷,如使用ossfs 2.0儲存卷掛載唯讀路徑,使用ossfs 1.0儲存卷掛載寫路徑。
POSIX API支援情況
以下為ossfs 1.0與ossfs 2.0對於常用POSIX API的支援情況。
POSIX API支援情況
效能Benchmark
ossfs 2.0相較於ossfs 1.0在順序讀寫和高並發小檔案讀取方面均實現了顯著的效能提升。
順序寫入效能:在單線程大檔案順序寫入情境下,ossfs 2.0的頻寬相較於ossfs 1.0提升了近18倍。
順序讀取效能
在單線程大檔案順序讀取情境下,ossfs 2.0的頻寬相較於ossfs 1.0提升了約8.5倍。
在多線程(4線程)大檔案順序讀取情境下,ossfs 2.0的頻寬相較於ossfs 1.0提升了5倍以上。
小檔案並發讀取效能:在高並發(128線程)讀取小檔案的情境下,ossfs 2.0的頻寬相較於ossfs 1.0提升了280倍以上。
如遇讀寫效能(如時延、吞吐)未達到預期的情況,請參見OSS儲存卷效能調優最佳實務。
前提條件
ACS叢集中已安裝csi-provisioner組件。
您可以在ACS叢集管理頁的左側導覽列單擊組件管理,然後在儲存頁簽下確認csi-provisioner組件的安裝情況。
注意事項
以下注意事項主要針對通用讀寫情境(ossfs 1.0),ossfs 2.0用戶端由於僅支援部分POSIX操作(主要為讀操作),基本不涉及。
ACS僅支援OSS靜態儲存卷,暫不支援OSS動態儲存裝置卷。
隨機或者追加寫檔案實際為在本地產生新檔案重新上傳至OSS服務端,由於OSS儲存特性,請注意以下事項:
檔案、檔案夾的rename操作非原子。
請盡量避免並發多寫,或直接在掛載路徑下進行壓縮、解壓縮等操作。
重要多寫情境依賴使用者自行協調各個用戶端的行為。對於寫操作導致的中繼資料和資料的不一致性問題,ACS不承諾保障。
此外,還需注意以下限制:
不支援永久連結(Hard Link)。
不支援掛載Archive Storage、冷Archive Storage或者深度冷Archive Storage類型的Bucket。
針對ossfs1.0儲存卷,readdir操作預設會發送大量headObject請求以擷取路徑下的所有對象的擴充資訊。當目標路徑下的檔案較多時,可能會影響ossfs的整體效能。若在讀寫情境中對檔案的許可權等屬性不敏感,可開啟
-o readdir_optimize參數進行最佳化。具體請參見新增readdir最佳化功能。
建立並擷取OSS Bucket資訊
建立OSS Bucket。
(可選)如果需要掛載OSS Bucket的子目錄,按需建立子目錄。
在Bucket列表頁面,單擊目標Bucket名稱。
在Bucket詳情頁面的左側導覽列,選擇。
根據需要單擊建立目錄,對OSS Bucket進行目錄分級。
擷取OSS Bucket的Endpoint。
在Bucket列表頁面,單擊目標Bucket名稱。
在Bucket詳情頁面,單擊概覽頁簽,然後在訪問連接埠地區,複製目標Endpoint。
OSS Bucket和ACS叢集屬於相同地區時,請複製VPC內網的Endpoint。
OSS Bucket沒有地區屬性,或者和ACS叢集屬於不同地區時,請複製外網的Endpoint。
擷取AccessKey ID和AccessKey Secret,用於OSS授權訪問。具體操作,請參見擷取AccessKey。
說明如果需要跨帳號掛載OSS Bucket,請擷取OSS Bucket所屬帳號的AccessKey。
掛載OSS儲存卷
ossfs 1.0儲存卷
kubectl
步驟一:建立PV
將以下YAML內容儲存為oss-pv.yaml。
apiVersion: v1 kind: Secret metadata: name: oss-secret namespace: default stringData: akId: <your AccessKey ID> akSecret: <your AccessKey Secret> --- apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv labels: alicloud-pvname: oss-pv spec: storageClassName: test capacity: storage: 20Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: oss-pv nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: "<your OSS Bucket Name>" url: "<your OSS Bucket Endpoint>" otherOpts: "-o umask=022 -o allow_other"說明以上YAML可以建立一個Secret和一個PV。Secret用於儲存AccessKey,以便在PV中可以安全使用。請使用實際的AccessKey ID和AccessKey Secret替換
akId和akSecret的取值。PV的相關參數說明如下:
參數
說明
alicloud-pvnamePV的標籤。用於綁定PVC。
storageClassName該配置僅用於綁定PVC,無需關聯實際的StorageClass。
storageOSS儲存卷的容量大小。
說明OSS靜態卷的容量僅起聲明效果,實際容量不受限制,可使用量以OSS控制台顯示為準。
accessModes訪問模式。
persistentVolumeReclaimPolicy回收策略。
driver驅動類型。此處配置為
ossplugin.csi.alibabacloud.com,表示使用阿里雲OSS CSI外掛程式。volumeHandlePV的唯一識別碼,與
metadata.name保持一致。nodePublishSecretRef從指定的Secret中擷取AccessKey,用於授權認證。
bucketOSS Bucket的名稱。請使用實際的OSS Bucket名稱替換
bucket的取值。urlOSS Bucket的接入網域名稱(Endpoint)。請使用實際的OSS Bucket的Endpoint替換
url的取值。OSS Bucket和ACS叢集屬於相同地區時,使用VPC內網的Endpoint。例如
oss-cn-shanghai-internal.aliyuncs.com。OSS Bucket沒有地區屬性,或者和ACS叢集屬於不同地區時,使用外網的Endpoint。例如
oss-cn-shanghai.aliyuncs.com。
otherOpts為OSS儲存卷輸入定製化參數,格式為
-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=100000 -o allow_other。建立Secret和PV。
kubectl create -f oss-pv.yaml查看PV。
kubectl get pv預期返回:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE oss-pv 20Gi RWX Retain Available test <unset> 9s
步驟二:建立PVC
將以下YAML內容儲存為oss-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: oss-pvc spec: storageClassName: test accessModes: - ReadWriteMany resources: requests: storage: 20Gi selector: matchLabels: alicloud-pvname: oss-pv相關參數說明如下:
參數
說明
storageClassName該配置僅用於綁定PV,無需關聯實際的StorageClass。與PV的
spec.storageClassName保持一致。accessModes訪問模式。
storage分配給Pod的儲存容量。不能高於OSS儲存卷的容量。
alicloud-pvname要綁定的PV的標籤。與PV的
metadata.labels.alicloud-pvname保持一致。建立PVC。
kubectl create -f oss-pvc.yaml查看PVC。
kubectl get pvc預期返回如下,此時PVC已綁定步驟一建立的PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE oss-pvc Bound oss-pv 20Gi RWX test <unset> 6s
步驟三:建立應用並掛載OSS
使用以下YAML內容,建立oss-test.yaml檔案。
以下YAML樣本可以建立包含2個Pod的Deployment,2個Pod均通過名為
oss-pvc的PVC申請儲存資源,掛載路徑均為/data。apiVersion: apps/v1 kind: Deployment metadata: name: oss-test labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-oss mountPath: /data volumes: - name: pvc-oss persistentVolumeClaim: claimName: oss-pvc建立Deployment並掛載OSS。
kubectl create -f oss-test.yaml查看Deployment中Pod的部署情況。
kubectl get pod | grep oss-test返回樣本如下,已建立2個Pod。
oss-test-****-***a 1/1 Running 0 28s oss-test-****-***b 1/1 Running 0 28s查看掛載路徑。
命令樣本如下,預期會返回OSS Bucket掛載目錄下的資料,預設為空白。
kubectl exec oss-test-****-***a -- ls /data
控制台
步驟一:建立PV
登入容器計算服務控制台。
在叢集列表頁面,單擊目的地組群名稱,進入該叢集的管理頁面。
在叢集管理頁面的左側導覽列,選擇。
在儲存卷頁面,單擊建立。
在彈出的對話方塊中,完成參數配置,然後單擊建立。
參數
說明
樣本
儲存卷類型
選擇OSS。
OSS
名稱
PV名稱,自訂輸入。格式要求請參考介面提示。
oss-pv
總量
OSS儲存卷的容量大小。
說明OSS靜態卷的容量僅起聲明效果,實際容量不受限制,可使用量以OSS控制台顯示為準。
20Gi
訪問模式
按需選擇以下配置:
ReadOnlyMany:卷可以被多個Pod以唯讀方式掛載。
ReadWriteMany:卷可以被多個Pod以讀寫方式掛載。
ReadWriteMany
訪問認證
為保證安全性,將AccessKey資訊儲存到Secret中。本文以建立保密字典為例。
建立保密字典
命名空間:default
名稱:oss-secret
AccessKey ID:********
AccessKey Secret:********
Bucket ID
選擇OSS Bucket。
oss-acs-***
OSS Path
要掛載的目錄。預設掛載根目錄(
/),可按需掛載子目錄(如/dir),需確保該子目錄已存在。/
訪問網域名稱
OSS Bucket的接入網域名稱(Endpoint)。
OSS Bucket和ACS叢集屬於相同地區時,選擇私網網域名稱。
OSS Bucket沒有地區屬性,或者和ACS叢集屬於不同地區時,選擇公網網域名稱。
私網網域名稱
建立完成後,在儲存卷頁面可以看到新建立的PV資訊,當前PV還沒綁定PVC。
步驟二:建立PVC
在叢集管理頁面的左側導覽列,選擇。
在儲存聲明頁面,單擊建立。
在彈出的對話方塊中,完成參數配置,然後單擊建立。
參數
說明
樣本
儲存宣告類型
選擇OSS。
OSS
名稱
PVC名稱,自訂輸入。格式要求請參考介面提示。
oss-pvc
分配模式
選擇已有儲存卷。
已有儲存卷
已有儲存卷
選擇之前建立的PV。
oss-pv
總量
分配給Pod的儲存容量。不能高於OSS儲存卷的容量。
20Gi
建立完成後,在儲存聲明頁面可以看到新建立的PVC,該PVC已綁定PV(即OSS儲存卷)。
步驟三:建立應用並掛載OSS
在叢集管理頁面的左側導覽列,選擇。
在無狀態頁面,單擊使用鏡像建立。
完成Deployment的參數配置,單擊建立。
需要注意的參數如下,其他參數保持預設即可。更多資訊,請參見建立無狀態工作負載Deployment。
配置頁
參數
說明
樣本
應用基本資料
應用程式名稱
Deployment名稱,自訂輸入。格式要求請參考介面提示。
oss-test
副本數量
配置Deployment的副本數量。
2
容器配置
鏡像名稱
輸入用於部署應用的鏡像地址。
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
所需資源
設定所需的vCPU和記憶體資源。
0.25 vCPU,0.5 GiB
資料卷
單擊增加雲端儲存聲明,然後完成參數配置。
掛載源:選擇之前建立的PVC。
容器路徑:輸入OSS Bucket要掛載到的容器路徑。
掛載源:oss-pvc
容器路徑:/data
查看應用部署情況。
在無狀態頁面,單擊應用程式名稱。
在容器組頁簽下,確認Pod已正常運行(狀態為Running)。
ossfs 2.0儲存卷
ACS目前僅支援使用kubectl方式掛載ossfs 2.0靜態儲存卷。
步驟一:建立PV
將以下YAML內容儲存為oss-pv.yaml。
apiVersion: v1 kind: Secret metadata: name: oss-secret namespace: default stringData: akId: <your AccessKey ID> akSecret: <your AccessKey Secret> --- apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv labels: alicloud-pvname: oss-pv spec: storageClassName: test capacity: storage: 20Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: oss-pv nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: fuseType: ossfs2 # 顯式聲明使用ossfs 2.0用戶端 bucket: "<your OSS Bucket Name>" url: "<your OSS Bucket Endpoint>" otherOpts: "-o close_to_open=false" # 注意:支援的掛載參數與ossfs 1.0用戶端不相容說明以上YAML可以建立一個Secret和一個PV。Secret用於儲存AccessKey,以便在PV中可以安全使用。請使用實際的AccessKey ID和AccessKey Secret替換
akId和akSecret的取值。PV的相關參數說明如下:
參數
說明
alicloud-pvnamePV的標籤。用於綁定PVC。
storageClassName該配置僅用於綁定PVC,無需關聯實際的StorageClass。
storageOSS儲存卷的容量大小。
說明OSS靜態卷的容量僅起聲明效果,實際容量不受限制,可使用量以OSS控制台顯示為準。
accessModes訪問模式。
persistentVolumeReclaimPolicy回收策略。
driver驅動類型。此處配置為
ossplugin.csi.alibabacloud.com,表示使用阿里雲OSS CSI外掛程式。volumeHandlePV的唯一識別碼,與
metadata.name保持一致。nodePublishSecretRef從指定的Secret中擷取AccessKey,用於授權認證。
fuseType使用ossfs 2.0用戶端時,固定為
ossfs2。bucketOSS Bucket的名稱。請使用實際的OSS Bucket名稱替換
bucket的取值。urlOSS Bucket的接入網域名稱(Endpoint)。請使用實際的OSS Bucket的Endpoint替換
url的取值。OSS Bucket和ACS叢集屬於相同地區時,使用VPC內網的Endpoint。例如
oss-cn-shanghai-internal.aliyuncs.com。OSS Bucket沒有地區屬性,或者和ACS叢集屬於不同地區時,使用外網的Endpoint。例如
oss-cn-shanghai.aliyuncs.com。
otherOpts為OSS儲存卷輸入定製化參數,格式為
-o *** -o ***,例如-o close_to_open=false。close_to_open:預設為關閉。開啟後,每次開啟檔案時,系統會主動向OSS發送GetObjectMeta請求,以擷取檔案在OSS中的最新中繼資料資訊,從而確保中繼資料的即時性。但在需要大量讀取小檔案的情境下,頻繁的中繼資料查詢會顯著增加訪問延遲。更多選擇性參數,請參見ossfs 2.0掛載選項說明。
建立Secret和PV。
kubectl create -f oss-pv.yaml查看PV。
kubectl get pv預期返回:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE oss-pv 20Gi RWX Retain Available test <unset> 9s
步驟二:建立PVC
將以下YAML內容儲存為oss-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: oss-pvc spec: storageClassName: test accessModes: - ReadWriteMany resources: requests: storage: 20Gi selector: matchLabels: alicloud-pvname: oss-pv相關參數說明如下:
參數
說明
storageClassName該配置僅用於綁定PV,無需關聯實際的StorageClass。與PV的
spec.storageClassName保持一致。accessModes訪問模式。
storage分配給Pod的儲存容量。不能高於OSS儲存卷的容量。
alicloud-pvname要綁定的PV的標籤。與PV的
metadata.labels.alicloud-pvname保持一致。建立PVC。
kubectl create -f oss-pvc.yaml查看PVC。
kubectl get pvc預期返回如下,此時PVC已綁定步驟一建立的PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE oss-pvc Bound oss-pv 20Gi RWX test <unset> 6s
步驟三:建立應用並掛載OSS
使用以下YAML內容,建立oss-test.yaml檔案。
以下YAML樣本可以建立包含2個Pod的Deployment,2個Pod均通過名為
oss-pvc的PVC申請儲存資源,掛載路徑均為/data。apiVersion: apps/v1 kind: Deployment metadata: name: oss-test labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-oss mountPath: /data volumes: - name: pvc-oss persistentVolumeClaim: claimName: oss-pvc建立Deployment並掛載OSS。
kubectl create -f oss-test.yaml查看Deployment中Pod的部署情況。
kubectl get pod | grep oss-test返回樣本如下,已建立2個Pod。
oss-test-****-***a 1/1 Running 0 28s oss-test-****-***b 1/1 Running 0 28s查看掛載路徑。
命令樣本如下,預期會返回OSS Bucket掛載目錄下的資料,預設為空白。
kubectl exec oss-test-****-***a -- ls /data
驗證OSS的共用儲存和持久化儲存
按照上文樣本建立的Deployment中含有2個Pod,2個Pod同時掛載了同一OSS Bucket。您可以通過以下方式進行驗證:
在一個Pod中建立檔案,然後另一個Pod中查看檔案,以此來驗證共用儲存。
重建Deployment,然後在新建立的Pod中查看OSS Bucket中的資料是否存在,以此來驗證持久化儲存。
查看Pod資訊。
kubectl get pod | grep oss-test返回樣本如下:
oss-test-****-***a 1/1 Running 0 40s oss-test-****-***b 1/1 Running 0 40s驗證共用儲存。
在一個Pod中建立檔案。
以名為
oss-test-****-***a的Pod作為樣本:kubectl exec oss-test-****-***a -- touch /data/test.txt在另一個Pod中查看檔案。
以名為
oss-test-****-***b的Pod作為樣本:kubectl exec oss-test-****-***b -- ls /data預期返回如下,可以看到已共用建立的檔案
test.txt。test.txt
驗證持久化儲存。
重建Deployment。
kubectl rollout restart deploy oss-test查看Pod,等待新Pod建立成功。
kubectl get pod | grep oss-test返回樣本如下:
oss-test-****-***c 1/1 Running 0 67s oss-test-****-***d 1/1 Running 0 49s在新Pod中查看檔案系統中的資料是否存在。
以名為
oss-test-c***的Pod作為樣本:kubectl exec oss-test-****-***c -- ls /data預期返回如下,可以看到OSS Bucket中的資料依然存在,在新Pod的掛載目錄下可以重新擷取。
test.txt