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 示例如下

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-pd
  5. spec:
  6. containers:
  7. - image: docker.io/nazarpc/webserver
  8. name: test-container
  9. volumeMounts:
  10. - mountPath: /cache
  11. name: cache-volume
  12. volumes:
  13. - name: cache-volume
  14. emptyDir: {}

hostPath

HostPath 属性的 volume 使得对应的容器能够访问当前宿主机上的指定目录。例如,需要运行一个访问 Docker 系统目录的容器,那么就使用/var/lib/docker 目录作为一个 HostDir 类型的 volume;或者要在一个容器内部运行 CAdvisor,那么就使用/dev/cgroups 目录作为一个 HostDir 类型的 volume。一旦这个 pod 离开了这个宿主机,HostDir 中的数 据虽然不会被永久删除,但数据也不会随 pod 迁移到其他宿主机上。
因此,需要 注意的是, 由于各个宿主机上的文件系统结构和内容并不一定完全相同,所以相同 pod 的 HostDir 可 能会在不 同的宿主机上表现出不同的行为。yaml 示例如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata: name: test-pd
  4. spec:
  5. containers:
  6. -image: docker.io/nazarpc/webserver
  7. name: test-container # 指定在容器中挂接路径
  8. volumeMounts:
  9. - mountPath: /test-pd
  10. name: test-volume # 指定所提供的存储卷
  11. volumes:
  12. -name: test-volume # 宿主机上的目录
  13. hostPath: # directory location on host path: /data

NFS

NFS 类型 volume。允许一块现有的网络硬盘在同一个 pod 内的容器间共享。yaml 示例如下:

  1. apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
  2. kind: Deployment
  3. metadata:
  4. name: redis
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: redis
  9. revisionHistoryLimit: 2
  10. template:
  11. metadata:
  12. labels:
  13. app: redis
  14. spec:
  15. containers: # 应用的镜像
  16. -image: redis
  17. name: redis
  18. imagePullPolicy: IfNotPresent
  19. # 应用的内部端口
  20. ports:
  21. -containerPort: 6379 name: redis6379
  22. env:
  23. -name: ALLOW_EMPTY_PASSWORD
  24. value: "yes"
  25. -name: REDIS_PASSWORD
  26. value: "redis"
  27. # 持久化挂接位置,在 docker 中
  28. volumeMounts:
  29. -name: redis-persistent-storage
  30. mountPath: /data
  31. volumes: # 宿主机上的目录
  32. -name: redis-persistent-storage
  33. nfs: path: /k8s-nfs/redis/data
  34. server: 192.168.126.112