第九章 数据管理
9.1 Volume
Pod是短暂的,Pod在销毁时,保存在容器内部的文件系统各种的数据会被清除。
为了持久化保存容器中的的数据,可以使用K8s Volume。
9.1.1 emptyDir
emptyDir: 最基础的Volumne类型,是Host上的一个目录。
emptyDIr Volume: 对于容器来说是持久的,对于Pod不是。当Pod从节点删除时,Volume的内容也会被删除。但是如果只是容器被销毁而Pod存在,则volume不受影响。也就是说:emptyDir Volume的生命周期与Pod一致。
Pod中的所有容器都可以共享Volume,它们可以指定各自的mount路径。
如下Pod有两个容器: producer 和 consumer,它们共享一个Volume. Producer 写, consumer 读。
apiVersion: v1 kind: Pod metadata: name: producer-consumer spec: containers: - image: busybox name: producer volumeMounts: # 将shared-volume mount 到 producer_dir目录 - mountPath: /producer_dir name: shared-volume args: # 将数据写入到文件hello中 - /bin/sh - -c - echo "hello world" > /producer_dir/hello ; sleep 30000 - image: busybox name: consumer volumeMounts: # 将shared-volume mount 到 /consumer_dir - mountPath: /consumer_dir name: shared-volume args: - /bin/sh - -c - cat /consumer_dir/hello ; sleep 30000 # 通过cat从文件hello读数据 volumes: # 定义了一个emptyDir类型的Volume,名字是shared-volume. - name: shared-volume emptyDir: {}
如下命令: consumer 容器成功的读到了hello world.
kubeusr@GalaxyKubernetesMaster:~$ kubectl logs producer-consumer consumer # 指定Pod 和 容器
hello world
emptyDir是host上创建的临时目录,其优点是能够方便地为Pod中的容器提供共享存储,不需要额外的配置。它不具备持久性,如果Pod没有了,emptyDir也就没有了。所以emptyDir的使用场景是: 适合Pod中的容器需要临时共享存储空间的场景。
9.1.2 hostPath
hostPath volume的作用是将Docker Host文件系统中已经存在的目录mount给Pod的容器。大部分应用不会使用HostPath,因为它增加了Pod与节点的耦合。
应用场景: 需要访问K8s或docker内部数据(配置文件和二进制库)的应用需要使用hostPath.
用处不大,例子略。
9.1.2 外部Storage Provider
如果K8s部署在公有云上(比如AWS, Azure等),可以直接使用云硬盘作为Volume.
Ceph: 相对于emptyDir和hostPath,这些volume类型的最大特点就是不依赖K8s。Volume的底层基础设施由独立的存储系统管理,与K8S集群分离。
9.2 PersistentVolume & PersistentVolumeClaim
Volume在可管理上有不足: 要使用Volume,Pod必须事先知道如下信息:
(1)当前Volume来自AWS,CEPH
(2)AWS/CEPT Volume 已经提前创建, 并且知道确切的Volume-id
Pod是开发人员维护,Volume是存储系统管理员维护。二者之间耦合,不利于大规模系统的开发,沟通效率低下。
K8s给出的解决方案是:PersistentVolume(PV) 和 PersistentVolumeClaim(PVC)
PV: 外部存储系统中的一块存储空间,由管理员维护和创建。PV具有持久性,声明周期独立于Pod。
PVC: 是对PV的申请。PVC通常由普通用户创建和维护。需要为Pod分配资源时,用户可以创建一个PVC,指定存储资源容量的大小和访问模式,K8s会查找并提供满足条件的PV。
有了PVC,用户只需要告诉K8s需要什么资源,而不必关心真正的空间从哪里来、如何访问。
K8s支持多种类型的PV,比如AWS EBS、Ceph、NFS等。