Volume 概述
Volume 是 Pod 中能够被多个容器访问的共享目录。Kubernetes 的 Volume 定义在 Pod 上, 它被一个 Pod 中的多个容 器挂载到具体的文件目录下。Volume 与 Pod 的生命周期相同, 但与容器的生命周期不相关,当容器终止或重启时,Volume 中的数据也不会丢失。要使用 volume,pod 需要指定 volume 的类型和内容( 字段),和映射到容器的位置( 字段)。
Kubernetes 支持多种类型的 Volume,包括:emptyDir、hostPath、gcePersistentDisk、 awsElasticBlockStore、nfs、iscsi、flflocker、glusterfs、rbd、cephfs、gitRepo、 secret、persistentVolumeClaim、downwardAPI、azureFileVolume、azureDisk、 vsphereVolume、Quobyte、PortworxVolume、ScaleIO。emptyDirEmptyDir 类型的 volume 创建于 pod 被调度到某个宿主机上的时候,而同一个 pod 内的容器都能读写 EmptyDir 中 的同一个文件。一旦这个 pod 离开了这个宿主机,EmptyDir 中的数据就会被永久删除。所以目前 EmptyDir 类型的 volume 主要用作临时空间,比如 Web 服务器写日志或者 tmp 文件需要的临时目录。
yaml 示例如下
apiVersion: v1kind: Podmetadata:name: test-pdspec:containers:- image: docker.io/nazarpc/webservername: test-containervolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}
hostPath
HostPath 属性的 volume 使得对应的容器能够访问当前宿主机上的指定目录。例如,需要运行一个访问 Docker 系统目录的容器,那么就使用/var/lib/docker 目录作为一个 HostDir 类型的 volume;或者要在一个容器内部运行 CAdvisor,那么就使用/dev/cgroups 目录作为一个 HostDir 类型的 volume。一旦这个 pod 离开了这个宿主机,HostDir 中的数 据虽然不会被永久删除,但数据也不会随 pod 迁移到其他宿主机上。
因此,需要 注意的是, 由于各个宿主机上的文件系统结构和内容并不一定完全相同,所以相同 pod 的 HostDir 可 能会在不 同的宿主机上表现出不同的行为。yaml 示例如下:
apiVersion: v1kind: Podmetadata: name: test-pdspec:containers:-image: docker.io/nazarpc/webservername: test-container # 指定在容器中挂接路径volumeMounts:- mountPath: /test-pdname: test-volume # 指定所提供的存储卷volumes:-name: test-volume # 宿主机上的目录hostPath: # directory location on host path: /data
NFS
NFS 类型 volume。允许一块现有的网络硬盘在同一个 pod 内的容器间共享。yaml 示例如下:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: Deploymentmetadata:name: redisspec:selector:matchLabels:app: redisrevisionHistoryLimit: 2template:metadata:labels:app: redisspec:containers: # 应用的镜像-image: redisname: redisimagePullPolicy: IfNotPresent# 应用的内部端口ports:-containerPort: 6379 name: redis6379env:-name: ALLOW_EMPTY_PASSWORDvalue: "yes"-name: REDIS_PASSWORDvalue: "redis"# 持久化挂接位置,在 docker 中volumeMounts:-name: redis-persistent-storagemountPath: /datavolumes: # 宿主机上的目录-name: redis-persistent-storagenfs: path: /k8s-nfs/redis/dataserver: 192.168.126.112
