卷类型
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 — 通过持久卷声明来申请持久卷设备(一种特殊的可挂载设备);
downwardAPI — 通过Kubernetes的API获得集群的元数据(一种特殊的可挂载设备);
定义卷及挂载卷
由于每一种类型的卷的定义都不相同,因此这里仅对通用的地方做一个概括,具体的定义方式还需看各章的配置以及使用explain
命令查看。
卷在Kubernetes中不是以一种资源的形式出现的,因此其定义是在Pod的spec.volumes
中定义的;在定义好之后,再在Pod的spec.containers.volumeMounts
中进行挂载。
因此总结如下两步:
定义卷:在Pod的
spec.volumes
中定义卷的类型,以及卷的相关配置;其中卷名是必须的,因为在挂载时需要用到;挂载卷:在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?