Kubernetes Volume
docker volume ≠ kubernetes volume
- Kubernetes中的volume定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下
- Kubernetes中的volume与Pod的生命周期相同,但与容器的生命周期不想管,当容器终止或重启时,volume的数据不会丢失
- Kubernetes支持多种类型的volume,例如GlusterFS、Ceph等先进的分布式文件系统
使用
在Pod上生命一个volume,然后在容器里引用该volume并mount到容器里的某个目录上,如下例子:
给tomcat Pod增加一个名字为datavol的volume,并且mount到容器的/mydata-data目录上,则Pod的定义文件如下:
apiVersion: v1
kind: Pod
metadata:
name: tomcat
labels:
app: tomcat
tier: frontend
spec:
volumes:
- name: datavol
emptyDir: {}
containers:
- name: tomcat-demo
image: tomcat
volumeMounts:
- mountPath: /mydata-data
name: datavol
类型
emptyDir
一个emptyDir Volume是正在Pod分配到Node是创建的。emptyDir的初始化内容为空,并且无需指定宿主机上对应的目录文件,因为这是Kubernetes自动分诶的一个目录。当Pod从Node移除时,emptyDir中的数据也会被永久删除。删除容器不影响emptyDir。用途如下:
- 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留;
- 长时间任务的中间过程CheckPoint的临时保存目录;
- 一个容器需要从另一个容器中获取数据的目录。
上方yaml文件就是emptyDir的示例yaml文件。
hostPath
hostPath为在Pod上挂载宿主机上的文件或目录,用途如下:
- 容器应用程序生成的日志文件需要永久保存时,可以使用宿主机的高速文件系统进行存储;
- 需要访问宿主机上Docker引擎内部数据结构的容器应用时,可以通过定义hostPath为宿主机/var/lib/docker目录,使容器内部应用可以直接访问Docker的文件系统。
注意:
- 在不同的Node上具有相同配置的Pod可能回因为宿主机上的目录和文件不同而导致对volume上目录和文件的访问结果不一致;
- 如果使用了资源配额管理,则Kubernetes无法将hostPath在宿主机上使用的资源纳入管理;
- 在底层主机上创建的文件或目录只能由 root 写入。需要在特权容器中以 root 身份运行进程,或修改主机上的文件权限以便写入 hostPath 卷。
hostPath type值的类型:
值 | 行为 |
---|---|
空字符串(默认)用于向后兼容,这意味着在挂载 hostPath 卷之前不会执行任何检查。 | |
DirectoryOrCreate |
如果在给定的路径上没有任何东西存在,那么将根据需要在那里创建一个空目录,权限设置为 0755,与 Kubelet 具有相同的组和所有权。 |
Directory |
给定的路径下必须存在目录 |
FileOrCreate |
如果在给定的路径上没有任何东西存在,那么会根据需要创建一个空文件,权限设置为 0644,与 Kubelet 具有相同的组和所有权。 |
File |
给定的路径下必须存在文件 |
Socket |
给定的路径下必须存在 UNIX 套接字 |
CharDevice |
给定的路径下必须存在字符设备 |
BlockDevice |
给定的路径下必须存在块设备 |
yaml文件示例:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
gcePersistentDisk
谷歌公有云上的永久提盘(Persistent Disk, PD)存放volume的数据,它与emptyDir不同,PD上的内容会永久保存,但Pod被删除时,PD只是被卸载,但不会被删除。但是,需要先创建一个永久磁盘,才能使用 gcePersistentDisk。
awsElasticBlockStore
该类型volume使用亚马逊公有云提供的EBS Volume存储数据,需要先创建一个EBS Volume才能使用awsElsasticBockStore。
NFS
使用NFS(Network File System)网络文件系统提供的共享目录存储数据时,我们需要在系统中部署一个NFS Server。Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。Pod被删除时,Volume被卸载,内容被保留。这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递。
示例文件:
volumes:
- name: nfs
nfs:
server: nfs-server.localhost
path: "/"
iSCSI
iscsi(Internet Small Computer System Interface, 一种基于因特网及SCSI-3协议下的存储技术)允许将现有的iscsi磁盘挂载到我们的pod中,和emptyDir不同的是,删除Pod时会被删除,但Volume只是被卸载,内容被保留,这就意味着iscsi能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间“切换”。
flocker
Flocker是一个开源的容器集群数据卷管理器。它提供各种存储后端支持的数据卷的管理和编排。
glusterfs
glusterfs,允许将Glusterfs(一个开源网络文件系统)Volume安装到pod中。不同于emptyDir,Pod被删除时,Volume只是被卸载,内容被保留。味着glusterfs能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间“切换”。
cephfs
cephfs Volume可以将已经存在的CephFS Volume挂载到pod中,与emptyDir特点不同,pod被删除的时,cephfs仅被被卸载,内容保留。cephfs能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间“切换”。
secret
Persistent Volume(PV)
Volume是定义在Pod上的,属于“计算资源”的一部分,而实际上,“网络存储”是相对独立于“计算资源”而存在的一种实体资源。在使用虚拟机的情况下,会先定义一个网络存储,然后从中划出一个“网盘”并挂接到虚拟机上。Persistent Volume和Persistent Volume Claim(PVC)也起到类似作用。
PV可以理解为Kubernetes集群中的某个网络存储中对应的一块存储,与Volume区别如下:
- PV只能是网络存储,不属于任何Node,但可以在每个Node上访问;
- PV并不是定义在Pod上的,而是独立于Pod之外的定义;
概念
PersistentVolume是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。
PersistentVolumeClaim是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。声明可以请求特定的大小和访问模式(例如,可以以读/写一次或 只读多次模式挂载)。
accessMode属性
一个卷一次只能使用一种访问模式挂载,即使它支持很多访问模式
- ReadWriteOnce: 读写权限、并且只能被单个Node挂载;
- ReadOnlyMany:只读权限、允许被多个Node挂载;
- ReadWriteMany:读写权限、允许被多个Node挂载;
PV定义文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
path: /somepath
server: 182.18.0.2
PVC定义文件
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
Pod Volume定义PVC
volumes:
- name: mypd
persistentVoumeClaim:
claimName: myclaim
PV访问模式
- Available:空闲状态
- Bound:已经绑定到某个PVC上
- Released:对应的PVC已经删除,但资源还没有被集群收回
- Failed:PV自动回收失败
资料来源:
- 《Kubernetes 权威指南》纪念版
- kubernetes handbook
来源:CSDN
作者:zhengfke
链接:https://blog.csdn.net/weixin_40242845/article/details/103706947