Container ServiceACK使用CNFS(Container Network File System)對OSS Bucket全生命週期的管理,實現對Bucket層的獨立管理。本文介紹如何使用CNFS對OSS Bucket全生命週期的管理及CNFS在工作負載中的應用。
前提條件
已建立Kubernetes叢集,且儲存外掛程式選擇為CSI。具體操作,請參見建立ACK託管叢集。
csi-plugin和csi-provisioner組件版本不低於 v1.24.2-5b34494d-aliyun。關於升級CSI-Plugin和CSI-Provisioner組件的操作,請參見升級csi-plugin和csi-provisioner。
storage-operator組件版本不低於v1.24.95-e2d0756-aliyun。關於升級storage-operator組件的操作,請參見管理組件。
已通過kubectl工具串連Kubernetes叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
功能介紹
您可以通過以下兩種方式使用CNFS對OSS全生命週期的管理:
方式一:使用CNFS建立以cnfs-oss-為名稱的OSS Bucket
使用CNFS建立叢集唯一的Object Storage Service桶,可以提供動態OSS PV能力。以
cnfs-oss-<UUID e.g. clusterid>
為名稱的OSS Bucket,使用OSS動態儲存裝置卷自動掛載建立的OSS Bucket,同時將OSS動態儲存裝置卷綁定到工作負載Deployment和StatefulSet中。使用CNFS指向已經存在的Bucket,可以通過建立一個CNFS CRD並指定Object Storage Service的桶名(BucketName)來完成建立。然後使用OSS靜態儲存卷或OSS動態儲存裝置卷掛載已有的OSS Bucket,同時將建立的OSS靜態儲存卷或OSS動態儲存裝置卷綁定到工作負載Deployment中。
BucketName:cnfs-oss-<UUID e.g. clusterid>
說明如下:
如果BucketName已存在,使用Bucket作為ContainerNetworkFileSystem對應的目標Bucket。
如果BucketName不存在,則會建立名稱為指定名稱的Bucket,並建立相應的ContainerNetworkFileSystem。比如:指定名稱為
cnfs-oss-<clusterid>
,系統會建立Bucket名稱為cnfs-oss-<clusterid>
的Object Storage Service,其中<clusterid>
為ACK叢集的ClusterID,保證BucketName全域唯一。
方式一:使用CNFS建立以cnfs-oss-<UUID e.g. clusterid>為名稱的OSS Bucket
執行以下內容,使用CNFS建立以
cnfs-oss-<UUID e.g. clusterid>
為名稱的OSS Bucket,並通過動態儲存裝置卷的方式,將OSS Bucket綁定到工作負載Deployment和StatefulSet中。替換以下
<clusterid>
為您的叢集ID。# 建立CNFS、StorageClass和Deployment、StatefulSet對象。 cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: oss-secret stringData: akId: "xxxx" #OSS Bucket掛載時必需的AKSK。 akSecret: "xxxx" --- apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-oss-<clusterid> #建議CNFS的名稱與BucketName一致。 spec: description: "cnfs-oss" type: oss reclaimPolicy: Retain #只支援Retain策略,刪除CNFS時並不會刪除OSS Bucket。 parameters: bucketName: cnfs-oss-<clusterid> #如果Bucket已存在,會讀取Bucket資訊。如果Bucket不存在,則會建立名稱為cnfs-oss-clusterid的Bucket,ClusterId需要填寫為ACK叢集的clusterid,來保證BucketName全域唯一。 encryptType: "AES256" #如果Bucket已存在,會將Bucket加密方式修改為AES256。如果Bucket不存在,會使用AES256作為加密方式。 storageType: "Standard" #OSS Bucket使用標準儲存類型。 aclType: "private" #OSS Bucket的擁有者和授權使用者有該Bucket內的檔案的讀寫權限。 --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alibabacloud-cnfs-oss parameters: containerNetworkFileSystem: cnfs-oss-<clusterid> #建立StorageClass時,使用名稱為cnfs-oss-clusterid的CNFS的Bucket資訊。 otherOpts: -o max_stat_cache_size=0 -o allow_other #緩衝相關操作。 path: / csi.storage.k8s.io/node-publish-secret-name: oss-secret #使用oss-secret作為掛載的Secret。 csi.storage.k8s.io/node-publish-secret-namespace: default #oss-secret所在的命名空間。 provisioner: ossplugin.csi.alibabacloud.com reclaimPolicy: Delete --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: cnfs-oss-pvc spec: accessModes: - ReadOnlyMany storageClassName: alibabacloud-cnfs-oss #建立PVC時,使用名稱為alibabacloud-cnfs-oss的StoragClass。 resources: requests: storage: 100Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: cnfs-oss-deployment labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: "/data" name: cnfs-oss-pvc volumes: - name: cnfs-oss-pvc #建立Deployment時,使用名稱為cnfs-oss-pvc的PVC。 persistentVolumeClaim: claimName: cnfs-oss-pvc --- apiVersion: apps/v1 kind: StatefulSet metadata: name: cnfs-oss-sts labels: app: nginx spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: "/data" name: www volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadOnlyMany" ] storageClassName: "alibabacloud-cnfs-oss" #建立StatefulSet時,使用名稱為cnfs-oss-pvc的PVC。 resources: requests: storage: 100Gi EOF
CNFS輸入參數說明:
參數
說明
description
當前檔案系統的簡單描述。
type
需要建立的儲存卷類型。
reclaimPolicy
回收策略,目前僅支援Retain策略,刪除CNFS時並不會刪除OSS Bucket。
parameters.bucketName
OSS Bucket的名稱。
parameters.storageType
儲存類型,預設為Standard。取值:
Standard:標準儲存。
IA:低頻訪問。
Archive:Archive Storage。
ColdArchive:冷Archive Storage。
說明使用Archive Storage和冷Archive Storage的檔案無法直接被讀寫訪問,需要解凍後再訪問。
parameters.redundancyType
儲存冗餘類型,預設為ZRS。取值:
LRS(本地備援儲存體):採用單可用性區域(AZ)內的資料冗餘儲存機制,將使用者的資料冗餘儲存在同一個可用性區域內多個設施的多個裝置上。本地備援儲存體能確保硬體失效時的資料持久性和可用性。
ZRS(同城冗餘儲存):採用多可用性區域(AZ)內的資料冗餘儲存機制,將使用者的資料冗餘儲存在同一地區(Region)的多個可用性區域。當某個可用性區域不可用時,同城冗餘儲存仍然能夠保障資料的正常訪問。
重要僅storage-operator組件為v1.26.2-1de13b6-aliyun或以上版本時,支援該參數設定。
使用ZRS時,無法使用OSS冷Archive Storage和深度冷Archive Storage。
storageType和redundancyType的相關計費說明,請參見計費項目。
parameters.encryptType
加密方式。
None:不加密。
AES256:使用OSS服務端的AES256加密。
SM4:使用OSS服務端的SM4加密。
parameters.aclType
指定Bucket的存取權限ACL,預設為private。取值:
public-read-write(公用讀寫):所有使用者都有該Bucket內檔案的讀寫權限。請謹慎使用該存取權限。
public-read(公用讀取):Bucket的擁有者和授權使用者有該Bucket內檔案的讀寫權限,其他使用者只有該Bucket內檔案的讀許可權。請謹慎使用該存取權限。
private(私人):Bucket的擁有者和授權使用者有該Bucket內檔案的讀寫權限,其他使用者沒有許可權操作該Bucket內的檔案。
parameters.enableVersioning
Bucket版本控制狀態,預設為Enabled。取值:
Enabled:開啟版本控制。
Suspended:暫停版本控制。
None:不開啟版本控制。
重要僅storage-operator組件為v1.26.2-1de13b6-aliyun或以上版本時,支援該參數設定。
Bucket版本控制,與合規保留原則以及OSS-HDFS服務無法同時配置,若您後續計劃開通這兩項服務,請配置enableVersioning為
None
。如果Bucket處於
Enabled
開啟版本狀態,將無法返回至None
未開啟狀態。此時,您可以暫停Bucket的版本控制狀態。版本控制功能本身不收取任何費用,但對目前的版本和所有歷史版本的檔案都會收取儲存費用。您可以通過配置生命週期回收歷史版本。更多資訊,請參見生命週期概述。
執行以下命令,查看建立的OSS Bucket。
kubectl get cnfs/cnfs-oss-<clusterid> -o yaml
預期輸出:
apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"storage.alibabacloud.com/v1beta1","kind":"ContainerNetworkFileSystem","metadata":{"annotations":{},"name":"cnfs-oss-xxxxxxxxxx"},"spec":{"description":"cnfs-oss","parameters":{"aclType":"private","bucketName":"cnfs-oss-clusterid","encryptType":"AES256","storageType":"Standard"},"reclaimPolicy":"Retain","type":"oss"}} creationTimestamp: "2022-09-18T07:02:34Z" finalizers: - protection.alibabacloud.com/cnfs generation: 6 name: cnfs-oss-**** resourceVersion: "8091291" uid: ca187b2a-3bfa-4a5f-82d8-ca1b1f69**** spec: description: cnfs-oss parameters: aclType: private bucketName: cnfs-oss-**** encryptType: AES256 storageType: Standard reclaimPolicy: Retain type: oss status: conditions: - lastProbeTime: "2022-09-18 15:02:39" reason: The oss bucket is complete initialization. status: Ready fsAttributes: accessGroupName: DEFAULT_VPC_GROUP_NAME aclType: private bucketName: cnfs-oss-**** encryptType: AES256 endPoint: extranet: oss-****.aliyuncs.com internal: oss-****-internal.aliyuncs.com regionId: **** storageType: Standard status: Available
CNFS輸出參數說明:
參數
說明
status
CNFS的目前狀態,包括以下狀態:
Pending:等待。
Creating:建立中。
Initialization:建立檔案系統中。
Available:可用。
Unavailable:暫時不可用,可以恢複為可用狀態。
Fatal:不可用,無法恢複。
Terminating:刪除中。
conditions.lastProbeTime
最後探活的時間。
conditions.reason
處於目前狀態的原因。
conditions.status
目前狀態是否可用。
Ready:可用狀態。
NotReady:不可用狀態。
fsAttributes.accessGroupName
掛載點所應用的許可權組名稱,目前僅支援DEFAULT_VPC_GROUP_NAME(專用網路預設許可權組)。
fsAttributes.encryptType
加密方式。
None:不加密。
AES256:使用OSS服務端的AES256加密。
SM4:使用OSS服務端的SM4加密。
fsAttributes.regionId
ACK叢集所在的地區。
fsAttributes.storageType
儲存類型,預設為Standard。
Standard:標準儲存。
IA:低頻訪問。
Archive:Archive Storage。
ColdArchive:冷Archive Storage。
說明使用Archive Storage和冷Archive Storage的檔案無法直接被讀寫訪問,需要解凍後再訪問。
fsAttributes.redundancyType
儲存冗餘類型,預設為ZRS。取值:
LRS(本地備援儲存體):採用單可用性區域(AZ)內的資料冗餘儲存機制,將使用者的資料冗餘儲存在同一個可用性區域內多個設施的多個裝置上。本地備援儲存體能確保硬體失效時的資料持久性和可用性。
ZRS(同城冗餘儲存):採用多可用性區域(AZ)內的資料冗餘儲存機制,將使用者的資料冗餘儲存在同一地區(Region)的多個可用性區域。當某個可用性區域不可用時,同城冗餘儲存仍然能夠保障資料的正常訪問。
重要僅storage-operator組件為v1.26.2-1de13b6-aliyun或以上版本時,支援該參數設定。
使用ZRS時,無法使用OSS冷Archive Storage和深度冷Archive Storage。
storageType和redundancyType的相關計費說明,請參見計費項目。
fsAttributes.aclType
CNFS指定Bucket的存取權限ACL,預設為private。
fsAttributes.endPoint
CNFS的端點地址。
extranet:公網端點地址。
internal:內網端點地址。
fsAttributes.enableVersioning
Bucket版本控制狀態,預設為Enabled。取值:
Enabled:開啟版本控制。
Suspended:暫停版本控制。
None:不開啟版本控制。
重要僅storage-operator組件為v1.26.2-1de13b6-aliyun或以上版本時,支援該參數設定。
Bucket版本控制,與合規保留原則以及OSS-HDFS服務無法同時配置,若您後續計劃開通這兩項服務,請配置enableVersioning為
None
。如果Bucket處於
Enabled
開啟版本狀態,將無法返回至None
未開啟狀態。此時,您可以暫停Bucket的版本控制狀態。版本控制功能本身不收取任何費用,但對目前的版本和所有歷史版本的檔案都會收取儲存費用。您可以通過配置生命週期回收歷史版本。更多資訊,請參見生命週期概述。
執行以下命令,查看已建立應用的狀態。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE cnfs-oss-deployment-5864fd8d98-4**** 1/1 Running 0 2m21s cnfs-oss-sts-0 1/1 Running 0 2m21s cnfs-oss-sts-1 1/1 Running 0 2m16s
由預期輸出可得,所建立的Deployment、StatefulSet為Running狀態,表示該Deployment已正常使用CNFS。
方式二:使用已有的OSS Bucket建立CNFS
使用CNFS指向已經存在的Bucket,可以通過建立一個CNFS CRD並指定Object Storage Service的桶名(BucketName)來完成建立。然後使用OSS靜態儲存卷或OSS動態儲存裝置卷掛載已有的OSS Bucket,同時將建立的OSS靜態儲存卷或OSS動態儲存裝置卷綁定到工作負載Deployment中。
執行以下命令,使用已有的OSS Bucket建立CNFS。
cat <<EOF | kubectl apply -f - apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-oss-exist-bucket-name spec: description: "cnfs-oss" type: oss reclaimPolicy: Retain parameters: bucketName: bucket-name #已經存在的OSS Bucket名稱。 EOF
執行以下命令,查看OSS Bucket的詳細資料。
kubectl get cnfs/cnfs-oss-exist-bucket-name -o yaml
預期輸出:
apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"storage.alibabacloud.com/v1beta1","kind":"ContainerNetworkFileSystem","metadata":{"annotations":{},"name":"cnfs-oss-xxxx"},"spec":{"description":"cnfs-oss","parameters":{"bucketName":"exist-bucket-name"},"reclaimPolicy":"Retain","type":"oss"}} creationTimestamp: "2022-09-14T09:21:10Z" finalizers: - protection.alibabacloud.com/cnfs generation: 7 name: cnfs-oss-exist-bucket-name resourceVersion: "6504134" uid: 921564ac-0cd8-4a89-997d-c2393afd**** spec: description: cnfs-oss parameters: bucketName: exist-bucket-name reclaimPolicy: Retain type: oss status: conditions: - lastProbeTime: "2022-09-14 17:00:21" reason: The oss bucket is complete initialization. status: Ready fsAttributes: accessGroupName: DEFAULT_VPC_GROUP_NAME aclType: private bucketName: exist-bucket-name encryptType: AES256 endPoint: extranet: oss-****.aliyuncs.com internal: oss-****-internal.aliyuncs.com regionId: **** storageType: Standard status: Available
在OSS儲存卷中應用CNFS。
具體操作,請參見方式一:使用CNFS建立以cnfs-oss-為名稱的OSS Bucket,通過動態儲存裝置卷的方式應用CNFS。