第九章 数据管理

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等。  

 

  

 

  

  

  

posted @ 2019-01-01 15:02  刘大飞  阅读(307)  评论(0编辑  收藏  举报