如果應用需要儲存圖片、音視頻等非結構化資料,可以使用OSS作為持久化儲存卷。本文介紹如何為應用靜態掛載OSS儲存卷,並驗證OSS的共用儲存和持久化儲存。
背景資訊
OSS是一個海量、安全、低成本、高可靠的儲存空間,適合儲存寫入後較少修改的資料,以及非結構化資料(如圖片、音視頻等)。更多資訊,請參見儲存概述。
ACS僅支援靜態掛載OSS儲存卷,暫不支援動態掛載OSS儲存卷。
前提條件
ACS叢集中已安裝managed-csiprovisioner組件。
您可以在ACS叢集管理頁的左側導覽列選擇
,在儲存頁簽下查看managed-csiprovisioner組件的安裝情況。注意事項
OSS為共用儲存,一個OSS儲存卷可以掛載到多個Pod上。
掛載目錄中建議存放的檔案數不要超過1000個。
通過ossfs進行
ls
等操作時,將發起HTTP請求到OSS擷取檔案的Meta資訊,如果ls
的目標目錄下檔案較多,ossfs將消耗大量系統記憶體,可能會導致Pod發生OOM(Out Of Memory)事件。您可以通過掛載OSS Bucket的子目錄,或對檔案較多的目錄進行目錄分級來避免此問題。
建立並擷取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儲存卷
通過kubectl命令
步驟一:建立PV
串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集或在CloudShell上通過kubectl管理Kubernetes叢集。
將以下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 max_stat_cache_size=0 -o allow_other"
說明以上YAML可以建立一個Secret和一個PV。Secret用於儲存AccessKey,以便在PV中可以安全使用。請使用實際的AccessKey ID和AccessKey Secret替換
akId
和akSecret
的取值。PV的相關參數說明如下:
參數
說明
alicloud-pvname
PV的標籤。用於綁定PVC。
storageClassName
該配置僅用於綁定PVC,無需關聯實際的StorageClass。
storage
OSS儲存卷的容量大小。
說明OSS靜態卷的容量僅起聲明效果,實際容量不受限制,可使用量以OSS控制台顯示為準。
accessModes
訪問模式。
persistentVolumeReclaimPolicy
回收策略。
driver
驅動類型。此處配置為
ossplugin.csi.alibabacloud.com
,表示使用阿里雲OSS CSI外掛程式。volumeHandle
PV的唯一識別碼,與
metadata.name
保持一致。nodePublishSecretRef
從指定的Secret中擷取AccessKey,用於授權認證。
bucket
OSS Bucket的名稱。請使用實際的OSS Bucket名稱替換
bucket
的取值。url
OSS 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
掛載參數。格式為
-o *** -o ***
,例如:-o max_stat_cache_size=0 -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
登入容器計算服務控制台。
在叢集頁面,單擊目的地組群ID,進入該叢集的管理頁面。
在叢集管理頁面的左側導覽列,選擇
。在儲存卷頁面,單擊建立。
在彈出的對話方塊中,完成參數配置,然後單擊建立。
參數
說明
樣本
儲存卷類型
選擇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)。
驗證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