kubernetes_volume

坚强是说给别人听的谎言 提交于 2019-12-27 04:00:05

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

Secret

更多Volume类型


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自动回收失败

资料来源:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!