如果應用需要存儲圖片、音視頻等非結構化數據,可以使用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