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


cstor-for-deployment
不过这也是cStor性能比较差的原因之一 , 它不像Ceph一样一个RBD image会分块存储在多个节点多个硬盘的多个OSD上 , 可以避免单节点的IO性能瓶颈问题 。
LocalPVLocalPV就是直接把本地磁盘(local disk)挂载到容器 , 这个其实就是Kubernetes LocalPV的增强版 , 因为直接读取本地磁盘 , 相对iSCSI需要走网络IO来说性能肯定是最好的 , 不过缺点是没有多副本、快照、克隆等高级特性 。
3.2 OpenEBS部署直接使用kubectl安装:
kubectl apply -f \如上会把所有的/dev下的块设备都当作OpenEBS的block devices , 建议修改下 openebs-ndm-config Configmap , 通过 path-filter 指定分给OpenEBS的物理设备 。
正如LVM有了PV还需要创建VG一样 , cStor需要手动创建一个Pool:
apiVersion: openebs.io/v1alpha1kind: StoragePoolClaimmetadata:name: cstor-disk-poolannotations:cas.openebs.io/config: |- name: PoolResourceRequestsvalue: |-memory: 2Gi- name: PoolResourceLimitsvalue: |-memory: 4Gispec:name: cstor-disk-pooltype: diskpoolSpec:poolType: stripedblockDevices:blockDeviceList:- blockdevice-ad96d141bd7804554d431cb13e7e61bc- blockdevice-b14cd44f3bfcbd94d3e0bda065f6e2bd- blockdevice-e3a5cf960033d7a96fdee46a5baee9d2其中poolType选择pool策略 , 如果使用mirror需要注意每个Node的磁盘数量必须是偶数 , 这里我们选择 striped, 即数据会打散分布存储在Node Pool的所有磁盘 。
blockDevices选择要放入该Pool的物理设备 , 这里作为测试每个Node节点只有一块盘 , 实际生产时应该至少使用3块盘以上 , 使用mirror则至少两块盘以上.
可以通过如下命令查看可用的blockDevices:
# kubectl get blockdevices --all-namespaces-o wideNAMESPACENAMENODENAMEPATHSIZECLAIMSTATESTATUSAGEopenebsblockdevice-ad96d141bd7804554d431cb13e7e61bcip-192-168-193-6.cn-northwest-1.compute.internal/dev/nvme0n1107374182400ClaimedActive4d17hopenebsblockdevice-b14cd44f3bfcbd94d3e0bda065f6e2bdip-192-168-193-172.cn-northwest-1.compute.internal/dev/nvme0n1107374182400ClaimedActive4d17hopenebsblockdevice-e3a5cf960033d7a96fdee46a5baee9d2ip-192-168-193-194.cn-northwest-1.compute.internal/dev/nvme0n1107374182400ClaimedActive4d17h其中Claimed表示已分配 ,PATH 对应物理设备路径 。
使用CR cstorpools 可以查看Pool:
# kubectl get cstorpools.openebs.io --all-namespacesNAMEALLOCATEDFREECAPACITYSTATUSREADONLYTYPEAGEcstor-disk-pool-9tey272K99.5G99.5GHealthyfalsestriped4m50scstor-disk-pool-lzg4272K99.5G99.5GHealthyfalsestriped4m50scstor-disk-pool-yme1272K99.5G99.5GHealthyfalsestriped4m50s可见OpenEBS会在所有的Node节点创建Pool实例 , 与前面的解释一致 。
3.3 Kubernetes集成OpenEBS块存储本小节主要以cStor为例演示下如何使用OpenEBS , 前面已经创建了cStor Pool , 接下来只需要再创建对应的StorageClass即可:
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: cstor-disk-poolannotations:openebs.io/cas-type: cstorcas.openebs.io/config: |- name: StoragePoolClaimvalue: "cstor-disk-pool"- name: ReplicaCountvalue: "3"provisioner: openebs.io/provisioner-iscsi其中StoragePoolClaim指定使用的Pool名称 , ReplicaCount指定volume的副本数 。
创建完StorageClass后就可以创建PVC了:
kind: PersistentVolumeClaimapiVersion: v1metadata:name: test-openebs-cstornamespace: defaultspec:storageClassName: cstor-disk-poolaccessModes:- ReadWriteOnceresources:requests:storage: 50Gi---apiVersion: v1kind: Podmetadata:name: test-openebs-cstornamespace: defaultspec:containers:- name: test-openebs-cstorimage: jocatalin/kubernetes-bootcamp:v1volumeMounts:- name: test-openebs-cstormountPath: /datavolumes:- name: test-openebs-cstorpersistentVolumeClaim:claimName: test-openebs-cstor每创建一个PV , OpenEBS就会创建一个Target Pod , 这个Pod通过一个单副本的Deployment管理 , 这个Pod会创建一个LUN并export , 通过Service暴露iSCSI端口:
# kubectl get pvc --all-namespacesNAMESPACENAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGEdefaulttest-openebs-cstorBoundpvc-6673e311-0db1-4f15-b480-aafb16a72d4650GiRWOcstor-disk-pool31m# kubectl get pod -n openebs | grep pvc-6673e311-0db1-4f15-b480-aafb16a72d46pvc-6673e311-0db1-4f15-b480-aafb16a72d46-target-55bb467574mf7hf3/3Running131m# kubectl get deployments.apps -n openebs | grep pvc-6673e311-0db1-4f15-b480-aafb16a72d46pvc-6673e311-0db1-4f15-b480-aafb16a72d46-target1/11132m# kubectl get svc -n openebs | grep pvc-6673e311-0db1-4f15-b480-aafb16a72d46pvc-6673e311-0db1-4f15-b480-aafb16a72d46ClusterIP10.96.24.353260/TCP,7777/TCP,6060/TCP,9500/TCP32m毫无疑问 , OpenEBS的所有服务运行、存储调度、服务之间通信以及存储的管理都是通过Kubernetes完成的 , 它就像集成到Kubernetes的一个内嵌功能一样 , 一旦配置完成 , 基本不需要额外的运维和管理 。