LocalPV:Kubernetes直接使用宿主机的本地磁盘目录 ,来持久化存储容器的数据。它的读写性能相比于大多数远程存储来说,要好得多,尤其是SSD盘。所以在一些分布式存储、分布式应用中,有广泛地应用。
本文介绍三种创建LocalPV地方式:
- 手动LocalPV
- 使用LocalPath-Provisioner创建LocalPV
- 使用Open-Local 创建LocalPV
手动创建PV
创建LocalPV,首先需要对可用的磁盘进行格式化,然后挂载到一个文件目录上。如果没有可用的磁盘,可以只是测试使用,可以简单一些目录进行模拟。节点上的磁盘和目录初始化完毕后,通过下面的操作创建LocalPV:
- 创建StorageClass,并设定为延迟绑定
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer #延迟绑定
- 创建PV
apiVersion: v1 kind: PersistentVolume metadata: name: pv-name spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage #步骤1创建的StorageClass名 local: path: /mnt/disk1 #块设备挂载的目录 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node01 #PV所在的节点
- 创建PVC
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: localpv-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: local-storage
手动创建PV不需要额外的组件,但是需要系统管理员人工管理PV,包括挂载的目录、节点,以及创建/扩容/删除的管理。
LocalPath-Provisioner创建LocalPV
LocalPath-Provisioner可以利用hostpath 或者本地卷动态地创建PV。但是它不支持PV地扩容,也不知道PV层地调度。
- 部署LocalPath-Provisioner
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
- 配置创建PV地目录,config.json配置每个节点创建PV地目录。
kind: ConfigMap apiVersion: v1 metadata: name: local-path-config namespace: local-path-storage data: config.json: |- { "nodePathMap":[ { "node":"DEFAULT_PATH_FOR_NON_LISTED_NODES", "paths":["/opt/local-path-provisioner"] }, { "node":"yasker-lp-dev1", "paths":["/opt/local-path-provisioner", "/data1"] } ] } setup: |- #!/bin/sh set -eu mkdir -m 0777 -p "$VOL_DIR" teardown: |- #!/bin/sh set -eu rm -rf "$VOL_DIR" helperPod.yaml: |- apiVersion: v1 kind: Pod metadata: name: helper-pod spec: containers: - name: helper-pod image: busybox
- 创建StorageClass,并指定provisioner。创建PVC或者PV时指定local-path,LocalPath-Provisioner便能动态创建PV
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-path provisioner: cluster.local/local-path-provisioner #指定provisioner volumeBindingMode: WaitForFirstConsumer reclaimPolicy: Delete
虽然LocalPath-Provisioner可以解决人工创建/删除PV地问题,但是目前不支持PV扩容、PV地调度、共享磁盘、PV地监控等。
Open-Local管理本地PV
Open-local 是阿里巴巴开源,由多个组件构成的本地磁盘管理系统,目标是解决当前kubernetes本地存储能力缺失问题。不但提供了动态创建PV地能力,而且提供根据更加完备地系统管理本地磁盘,如pv地调度、支持逻辑卷(LVM)切分磁盘、监控指标采集等
Open-Local包含四大类组件:
- Scheduler-Extender: 作为 Kubernetes Scheduler 的扩展组件,通过 Extender 方式实现,新增本地存储调度算法
- CSI: 按照 CSI(Container Storage Interface) 标准实现本地磁盘管理能力
- Agent: 运行在集群中的每个节点,根据配置清单初始化存储设备,并通过上报集群中本地存储设备信息以供 Scheduler-Extender 决策调度
- Controller: 获取集群存储初始化配置,并向运行在各个节点的 Agent 下发详细的配置清单
Open-local 支持两种类型本地磁盘的使用:
- 逻辑卷管理(Logic Volume Manage, LVM): 它是一个共享磁盘的管理方式,通过 LVM 方式让多个pod可以共享一块或者多块存储设备。当在kubernetes 中创建 PV 资源时,Open-local会从对应 VolumeGroup 中创建 LogicalVolume 来代表该PV。可以通过StorageClass 设置为open-local-lvm的方式,创建LVM的volume。
- 块设备管理(Device): 它是一个种独占盘的管理方式,即一个 PV 一个块设备。这里块设备可以是一整块磁盘,也可以是一个分区。可以通过StorageClass设置为open-local-device-hdd或者open-local-device-ssd的方式创建独占盘的volume。
不同类型 PV 所支持的存储能力也不同。针对于分布式存储,数据存储可以选择独占盘类型,而在日志、元数据可以选择共享盘类型。
类型 | 动态分配 | PV扩容 | PV快照 | 原生块设备 | IO限流 | 临时卷 | 监控数据 |
---|---|---|---|---|---|---|---|
共享盘类型 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
独占盘类型 | 支持 | 不支持 | 不支持 | 支持 | 不支持 | 不支持 | 支持 |