Volume概述
Volume是 Pod中能够被多个容器访问的共享目录。 Kubernetes的 Volume定义在 Pod 上,它被一个Pod中的多个容 器挂载到具体的文件目录下。 Volume与 Pod的生命周期相同,但与容器的生命周期不相关, 当容器终止或重启时, Volume 中的数据也不会丢失。 要使用volume, pod需要指定 volume 的类型和内容(字段) , 和映射到容器的位置(字段) 。Kubernetes 支持多种类型的 Volume,包括: emptyDir、 hostPath、 gcePersistentDisk、awsElasticBlockStore、 nfs、 iscsi、 flocker、 glusterfs、 rbd、 cephfs、 gitRepo、secret、 persistentVolumeClaim、 downwardAPI、 azureFileVolume、 azureDisk、vsphereVolume、 Quobyte、 PortworxVolume、 ScaleIO。 emptyDirEmptyDir 类型的 volume创建于 pod 被调度到某个宿主机上的时候, 而同一个 pod 内的容器都能读写 EmptyDir 中的同一个文件。 一旦这个 pod离开了这个宿主机, EmptyDir 中的数据就会被永久删除。 所以目前 EmptyDir类型的 volume主要用作临时空间, 比如 Web服务器写日志或者 tmp 文件
需要的临时目录。
EmptyDir
yaml示例如下
apiVersion: v1 kind: Pod metadata: name: mynginx labels: app: mynginx spec: containers: - name: mynginx image: reg.harbor.com/public/nginx:latest ports: - containerPort: 80 volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
hostPath
HostPath属性的 volume使得对应的容器能够访问当前宿主机上的指定目录。 例如, 需要运行一个访问 Docker系统目录的容器, 那么就使用/var/lib/docker 目录作为一个HostDir类型的 volume; 或者要在一个容器内部运行 CAdvisor, 那么就使用/dev/cgroups目录作为一个 HostDir类型的 volume。 一旦这个 pod 离开了这个宿主机, HostDir中的数据虽然不会被永久删除, 但数据也不会随 pod 迁移到其他宿主机上。 因此, 需要注意的是,由于各个宿主机上的文件系统结构和内容并不一定完全相同, 所以相同 pod的 HostDir 可能会在不 同的宿主机上表现出不同的行为。 yaml示例如下:
apiVersion: v1 kind: Pod metadata: name: mynginx2 labels: app: mynginx2 spec: containers: - name: mynginx2 image: reg.harbor.com/public/nginx:latest ports: - containerPort: 80 volumeMounts: - mountPath: /test-pd name: test-volume volumes: - name: test-volume hostPath: path: /data
NFS
NFS 类型 volume。 允许一块现有的网络硬盘在同一个 pod内的容器间共享。 yaml 示例如下:
apiVersion: apps/v1 kind: Deployment metadata: name: mynginx3 spec: replicas: 2 selector: matchLabels: app: mynginx3 template: metadata: labels: app: mynginx3 spec: containers: - image: reg.harbor.com/public/nginx:1.18.0 name: mynginx3 imagePullPolicy: IfNotPresent ports: - containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ volumes: - name: html nfs: path: /nfs/data server: 10.91.74.201