2万字长文:Kubernetes云原生开源分布式存储( 七 )

输出结果如下:
# kubectl get pod test-ceph-blockstorageNAMEREADYSTATUSRESTARTSAGEtest-ceph-blockstorage1/1Running05m4s# kubectl get pvcNAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGEtest-ceph-blockstorage-pvcBoundpvc-6ff56a06-86a1-437c-b04f-62bb18e7637520GiRWOrook-ceph-block5m8s# rbd -p replicapool lscsi-vol-e65ec8ef-7cc1-11ea-b6f8-ce60d5fc8330从输出结果可见PV volume对应Ceph的一个RBD image 。
4.3.2 共享文件系统存储共享文件系统存储即提供文件系统存储接口 , 我们最常用的共享文件系统存储如NFS、CIFS、GlusterFS等 , Ceph通过CephFS实现共享文件系统存储 。
和创建Ceph Pool一样 , 同样使用Kubernetes即可声明一个共享文件系统实例 , 完全不需要调用 ceph 接口:
apiVersion: ceph.rook.io/v1kind: CephFilesystemmetadata:name: myfsnamespace: rook-cephspec:metadataPool:replicated:size: 3dataPools:- replicated:size: 3preservePoolsOnDelete: truemetadataServer:activeCount: 1activeStandby: true可以通过如下命令查看mds服务是否就绪:
# kubectl -n rook-ceph get pod -l app=rook-ceph-mdsNAMEREADYSTATUSRESTARTSAGErook-ceph-mds-myfs-a-f87d59467-xwj841/1Running032srook-ceph-mds-myfs-b-c96645f59-h7ffr1/1Running032s# kubectl get cephfilesystems.ceph.rook.ioNAMEACTIVEMDSAGEmyfs1111s创建cephfs StorageClass:
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: rook-cephfsprovisioner: rook-ceph.cephfs.csi.ceph.comparameters:clusterID: rook-cephfsName: myfspool: myfs-data0csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisionercsi.storage.k8s.io/provisioner-secret-namespace: rook-cephcsi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisionercsi.storage.k8s.io/controller-expand-secret-namespace: rook-cephcsi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-nodecsi.storage.k8s.io/node-stage-secret-namespace: rook-cephreclaimPolicy: DeleteallowVolumeExpansion: truemountOptions:我们知道CephFS是共享文件系统存储 , 支持多个Pod共享 , 首先我们创建一个 ReadWriteMany 的PVC:
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: cephfs-pvcspec:accessModes:- ReadWriteManyresources:requests:storage: 1GistorageClassName: rook-cephfs通过Deployment创建三个Pod共享这个PVC:
---apiVersion: apps/v1kind: Deploymentmetadata:name: cephfs-demolabels:k8s-app: cephfs-demokubernetes.io/cluster-service: "true"spec:replicas: 3selector:matchLabels:k8s-app: cephfs-demotemplate:metadata:labels:k8s-app: cephfs-demospec:containers:- name: cephfs-demoimage: jocatalin/kubernetes-bootcamp:v1volumeMounts:- name: volvmountPath: /datavolumes:- name: volvpersistentVolumeClaim:claimName: cephfs-pvcreadOnly: false等待Pod初始完成后 , 我们从其中一个Pod写入数据 , 看另一个Pod能否看到写入的数据:
2万字长文:Kubernetes云原生开源分布式存储文章插图
cephfs demo
如上图 , 我们往Pod cephfs-demo-5799fcbf58-2sm4b 写入数据 , 从 cephfs-demo-5799fcbf58-bkw9f 可以读取数据 , 符合我们预期 。
在Ceph Dashboard中我们也可以看到myfs实例一共有3个 clients:
2万字长文:Kubernetes云原生开源分布式存储文章插图
【2万字长文:Kubernetes云原生开源分布式存储】cephfs dashboard
4.3.3 对象存储Ceph通过RGW实现对象存储接口 , RGW兼容AWS S3 API , 因此Pod可以和使用S3一样使用Ceph RGW , 比如Python可以使用boto3 SDK对桶和对象进行操作 。
首先我们需要创建RGW网关:
apiVersion: ceph.rook.io/v1kind: CephObjectStoremetadata:name: my-storenamespace: rook-cephspec:metadataPool:failureDomain: hostreplicated:size: 3dataPool:failureDomain: hosterasureCoded:dataChunks: 2codingChunks: 1preservePoolsOnDelete: truegateway:type: s3sslCertificateRef:port: 80securePort:instances: 1网关就绪后 , 我们就可以创建bucket了 , 虽然bucket不是Volume , 但Rook也把bucket抽象封装为StorageClass:
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: rook-ceph-bucketprovisioner: ceph.rook.io/bucketreclaimPolicy: Deleteparameters:objectStoreName: my-storeobjectStoreNamespace: rook-cephregion: us-east-1接下来就像声明PVC一样创建bucket了 , 不过不叫PVC , 而是叫OBC(Object Bucket Claim) ,
apiVersion: objectbucket.io/v1alpha1kind: ObjectBucketClaimmetadata:name: ceph-bucketspec:generateBucketName: ceph-bktstorageClassName: rook-ceph-bucket其中AK(access key)以及SK(secret key)保存在Secret ceph-bucket 中 , 我们可以通过如下命令获取:
export AWS_ACCESS_KEY_ID=$(kubectl -n default \get secret ceph-bucket -o yaml \| grep AWS_ACCESS_KEY_ID \| awk '{print $2}' | base64 --decode)export AWS_SECRET_ACCESS_KEY=$(kubectl -n default \get secret ceph-bucket -o yaml \| grep AWS_SECRET_ACCESS_KEY \| awk '{print $2}' | base64 --decode)# S3 Endpoint为Service rook-ceph-rgw-my-store地址export AWS_ENDPOINT=http://$(kubectl get svc \-n rook-ceph \-l app=rook-ceph-rgw \-o jsonpath='{.items[0].spec.clusterIP}')