容器服务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。