Volume概述
Volume
是 Pod
中能够被多个容器访问的共享目录。 Kubernetes
的 Volume
定义在 Pod 上,它被一个Pod
中的多个容 器挂载到具体的文件目录下。 Volume
与 Pod
的生命周期相同,但与容器的生命周期不相关, 当容器终止或重启时, Volume
中的数据也不会丢失。 要使用volume
, pod
需要指定 volume
的类型和内容(字段) , 和映射到容器的位置(字段) 。Kubernetes
支持多种类型的 Volume
,包括: emptyDir
、 hostPath
、 gcePersistentDisk
、awsElasticBlockStore
、 nfs
、 iscsi
、 fl
ocker
、 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