如果應用需要儲存圖片、音視頻等非結構化資料,可以使用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倍。
順序讀取效能:在單線程或多線程(4線程)大檔案順序讀取情境下,ossfs 2.0的頻寬相較於ossfs 1.0提升了3倍以上。
小檔案並發讀取效能:在高並發(128線程)讀取小檔案的情境下,ossfs 2.0的頻寬相較於ossfs 1.0提升了20倍以上。
如遇讀寫效能(如時延、吞吐)未達到預期的情況,請參見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
數據卷
單擊增加雲端儲存聲明(PersistentVolumeClaim),然後完成參數配置。
掛載源:選擇之前建立的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