卷类型

Kubernetes支持许多不同的卷类型,不同的云服务厂商都会各自开发不同的卷设备类型,因此这里仅对部分通用的卷类型进行说明:

  • emptyDir — 用于存储临时数据的简单空目录(生命周期与Pod一致,无法实现持久化存储)

  • gitRepo — 通过从Git仓库中的内容初始化卷(生命周期与Pod一致,无法实现持久化存储)

  • hostPath — 将Node上的目录挂载至Pod中的容器中(仅适用于单Node集群)

  • nfs — nfs共享卷;

  • gcePersistentDisk(Google高效能型存储磁盘卷)、awsElasticBlockStore(Amazon Web服务弹性块存储卷)、azureDisk(Microsoft Azure此判断) — 云服务商提供的特定存储类型;

  • cinder、cephfs、iscsi、flocker、glusterfs、quobyte、rbd、flexVolume、vsphere-Volume、photonPersistentDisk、scaleIO — 一些网络存储;

  • persistentVolumeClaim — 通过持久卷声明来申请持久卷设备(一种特殊的可挂载设备)

  • configMapsecret — 配置数据和敏感数据的挂载(一种特殊的可挂载设备)

  • downwardAPI — 通过Kubernetes的API获得集群的元数据(一种特殊的可挂载设备)

Tips: Pod所支持的卷类型,及其详细配置选项可以通过Pod的spec.volumes中进行查看;各卷类型支持的相关配置,则可通过spec.volumes.{卷类型}查看,如查看emptyDir卷支持的配置,则查看spec.volumes.emptyDir即可。

定义卷及挂载卷

由于每一种类型的卷的定义都不相同,因此这里仅对通用的地方做一个概括,具体的定义方式还需看各章的配置以及使用explain命令查看。

卷在Kubernetes中不是以一种资源的形式出现的,因此其定义是在Pod的spec.volumes中定义的;在定义好之后,再在Pod的spec.containers.volumeMounts中进行挂载。

因此总结如下两步:

  1. 定义卷:在Pod的spec.volumes中定义卷的类型,以及卷的相关配置;其中卷名是必须的,因为在挂载时需要用到;

  2. 挂载卷:在Pod的spec.containers.volumeMounts中进行挂载,指定容器中的挂载点,以及挂载的卷名

仅挂载卷内指定文件且不隐藏挂载点中的原文件

上面的这种方式,是以全覆盖的形式,即将卷中的所有文件,都挂载至挂载点下,并且挂载点中若原先有文件存在,会被隐藏处理,这就与Linux中挂载时类似。

下面介绍一种方式,可以仅挂载卷内指定的文件,并且不会隐藏挂载点中的原文件。

在第二步的挂载卷中,Pod的spec.containers.volumeMounts.subPath中指定需要挂载的文件名,并且spec.containers.volumeMounts.mountPath中的挂载点指定的是文件路径,而不是目录路径。

下面举个例子:

apiVersion: v1
kind: Pod
metadata:
  name: fortune-hostpath-test-subpath
spec:
  containers:
  - image: nginx:alpine
    name: web-server
    volumeMounts:    # 定义挂载点
    - name: hostpath    # 卷名
      mountPath: /etc/nginx/conf.d/aaa.txt    # 挂载点,即将a.txt挂载至容器中,并改名为aaa.txt
      readOnly: true
      subPath: a.txt    # 将hostPath卷中的a.txt文件挂载至容器中
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:    # 定义卷
  - name: hostpath    # 卷名
    hostPath:    # hostPath类型的卷
      path: "/tmp/test_hostpath_dir"

Last updated

Was this helpful?