容器服務ACK使用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創建集群唯一的對象存儲桶,可以提供動態OSS PV能力。以
cnfs-oss-<UUID e.g. clusterid>
為名稱的OSS Bucket,使用OSS動態存儲卷自動掛載創建的OSS Bucket,同時將OSS動態存儲卷綁定到工作負載Deployment和StatefulSet中。使用CNFS指向已經存在的Bucket,可以通過創建一個CNFS CRD并指定對象存儲的桶名(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>
的對象存儲,其中<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: / # volumeAs: subpath 在path路徑下為自動為每個PV創建子路徑 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: Retain --- 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:歸檔存儲。
ColdArchive:冷歸檔存儲。
說明使用歸檔存儲和冷歸檔存儲的文件無法直接被讀寫訪問,需要解凍后再訪問。
parameters.redundancyType
存儲冗余類型,默認為ZRS。取值:
LRS(本地冗余存儲):采用單可用區(AZ)內的數據冗余存儲機制,將用戶的數據冗余存儲在同一個可用區內多個設施的多個設備上。本地冗余存儲能確保硬件失效時的數據持久性和可用性。
ZRS(同城冗余存儲):采用多可用區(AZ)內的數據冗余存儲機制,將用戶的數據冗余存儲在同一地域(Region)的多個可用區。當某個可用區不可用時,同城冗余存儲仍然能夠保障數據的正常訪問。
重要僅storage-operator組件為v1.26.2-1de13b6-aliyun或以上版本時,支持該參數設置。
使用ZRS時,無法使用OSS冷歸檔存儲和深度冷歸檔存儲。
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:歸檔存儲。
ColdArchive:冷歸檔存儲。
說明使用歸檔存儲和冷歸檔存儲的文件無法直接被讀寫訪問,需要解凍后再訪問。
fsAttributes.redundancyType
存儲冗余類型,默認為ZRS。取值:
LRS(本地冗余存儲):采用單可用區(AZ)內的數據冗余存儲機制,將用戶的數據冗余存儲在同一個可用區內多個設施的多個設備上。本地冗余存儲能確保硬件失效時的數據持久性和可用性。
ZRS(同城冗余存儲):采用多可用區(AZ)內的數據冗余存儲機制,將用戶的數據冗余存儲在同一地域(Region)的多個可用區。當某個可用區不可用時,同城冗余存儲仍然能夠保障數據的正常訪問。
重要僅storage-operator組件為v1.26.2-1de13b6-aliyun或以上版本時,支持該參數設置。
使用ZRS時,無法使用OSS冷歸檔存儲和深度冷歸檔存儲。
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并指定對象存儲的桶名(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。