摘要:本文分析了hostPath volume缺陷,然后对local persistent volume的使用场景、基本的工作机制进行了分析,介绍了使用时的注意事项,并简单介绍local volume manager如何帮助administrator进行local persistent volume的生命周期管理的。
过去我们经常会通过hostPath volume
让Pod能够使用本地存储,将Node文件系统中的文件或者目录挂载到容器内,但是hostPath volume
的使用是很难受的,并不适合在生产环境中使用。
我们先看看hostPath Type有哪些类型:
Value | Behavior |
---|---|
Empty string (default) is for backward compatibility, which means that no checks will be performed before mounting the hostPath volume. | |
DirectoryOrCreate | If nothing exists at the given path, an empty directory will be created there as needed with permission set to 0755, having the same group and ownership with Kubelet. |
Directory | A directory must exist at the given path |
FileOrCreate | If nothing exists at the given path, an empty file will be created there as needed with permission set to 0644, having the same group and ownership with Kubelet. |
File | A file must exist at the given path |
Socket | A UNIX socket must exist at the given path |
CharDevice | A character device must exist at the given path |
BlockDevice | A block device must exist at the given path |
看起来支持这么多type还是挺好的,但为什么说不适合在生产环境中使用呢?
FEATURE STATE: Kubernetes v1.11 Beta
Local persistent volume就是用来解决hostPath volume面临的portability, disk accounting, and scheduling
的缺陷。PV Controller和Scheduler会对local PV做特殊的逻辑处理,以实现Pod使用本地存储时发生Pod re-schedule的情况下能再次调度到local volume所在的Node。
local pv在生产中使用,也是需要谨慎的,毕竟它本质上还是使用的是节点上的本地存储,如果没有相应的存储副本机制,那意味着一旦节点或者磁盘异常,使用该volume的Pod也会异常,甚至出现数据丢失,除非你明确知道这个风险不会对你的应用造成很大影响或者允许数据丢失。
那么通常什么情况会使用Local PV呢?
Local volume允许挂载本地的disk, partition, directory到容器内某个挂载点。在Kuberentes 1.11仍然仅支持local pv的static provision,不支持dynamic provision。
.spec.nodeAffinity
field来描述local volume与Node的绑定关系。volumeBindingMode: WaitForFirstConsumer
的local-storage StorageClass来实现PVC的延迟绑定,使得PV Controller并不会立刻为PVC做Bound,而是等待某个需要使用该local pv的Pod完成调度后,才去做Bound。下面是定义local pv的Sample:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 100Gi
# volumeMode field requires BlockVolume Alpha feature gate to be enabled.
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- example-node
对应的local-storage storageClass定义如下:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
// VolumeBindingImmediate indicates that PersistentVolumeClaims should be
// immediately provisioned and bound.
VolumeBindingImmediate VolumeBindingMode = "Immediate"
// VolumeBindingWaitForFirstConsumer indicates that PersistentVolumeClaims
// should not be provisioned and bound until the first Pod is created that
// references the PeristentVolumeClaim. The volume provisioning and
// binding will occur during Pod scheduing.
VolumeBindingWaitForFirstConsumer VolumeBindingMode = "WaitForFirstConsumer"
上面这么多事情需要人为的去做预处理的工作,我们必须要有解决方案帮我们自动完成local volume的create和cleanup的工作。官方给出了一个简单的local volume manager,注意它仍然只是一个static provisioner,目前主要帮我们做两件事:
discovery directory
的新的挂载点,并为每个挂载点根据对应的storageClassName, path, nodeAffinity, and capacity创建PersistentVolume object。因此,除了需要人为的完成local volume的mount操作,local PV的生命周期管理就全部交给local volume manager了。下面我们专门介绍下这个Static Local Volume Provisioner。
后面我会单独写一个博文对local volume manager进行深度剖析。
本文对hostPath volume不能在生产环境中很好使用的原因进行了阐述,然后对local persistent volume的使用场景、基本的工作机制进行了分析,介绍了使用时的注意事项,最后简单介绍了local volume manager如何帮助administrator进行local persistent volume的生命周期管理的。接下来,我会再写两篇博客,分别对scheduler和pv controller如何对local persistent volume的处理逻辑进行源码分析,对local volume manager进行深度剖析。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。