第九章 存储卷与数据持久化
1 存储卷概述
Kubernetes提供的存储卷(Volume)属于Pod资源级别,共享于Pod内的所有容器,可用于在容器的文件系统之外存储应用程序的相关数据,甚至还可独立于Pod的生命周期之外实现数据持久化。
2 临时存储卷
Kubernetes支持存储卷类型中,emptyDir存储卷的生命周期与其所属的Pod对象相同,它无法脱离Pod对象的生命周期提供数据存储功能,因为emptyDir通常仅用于数据缓存或临时存储。
2.1 emptyDir存储卷
emptyDir存储卷定义于.spec.volumes.emptyDir嵌套字段中,可用字段主要包含两个,具体如下
- medium:此目录所在的存储介质的类型,可取值为“default”或“Memory”,默认为default,表示使用节点的默认存储介质;Memory”表示使用基于RAM的临时文件系统tmpfs,空间受限于内存,但性能非常好,通常用于为容器中的应用提供缓存空间。
- sizeLimit:当前存储卷的空间限额,默认值为nil,表示不限制;不过,在medium字段为“Memory”是建议无比定义此限额。
下面为emptyDir存储卷的简单示例:作为边车(sidecar)的容器paggen,其间隔10秒生成一行信息追加到存储卷上的index.html文件中,因此,通过主容器nginx的应用访问到的内容也会处于不停的变动中。
apiVersion: v1 kind: Pod metadata: name: vol-emptydir-pod spec: volumes: - name: html emptyDir: {} containers : - name: nginx image: nginx:1.12-alpine volumeMounts: - name: html mountPath: /usr/share/nginx/html - name: pagegen image: alpine volumeMounts: - name: html mountPath: /html command: ["/bin/sh”,”-c”] args : - while true; do echo $(hostname) $(date)> /html/index.html;sleep 10; done
3 节点存储卷hostPath
hostPath类型的存储卷是指将工作节点上某文件系统的目录或文件挂载于Pod中的一种存储卷,它可独立于Pod资源的生命周期,因此具有持久性。
配置hostPath存储卷的嵌套字段共有两个:一个是用于指定工作节点上的目录路径必选字段path;另一个是指定存储卷类型的type,它支持使用的卷类型包含如下几种。
- DirectoryOrCreate:指定的路径不存在时自动将其创建为权限是0755的空目录,属主属组均为kubelet。
- Directory:必须存在的目录路径
- FileOrCreate:指定的文件不存在时自动将其创建为权限是0644的空文件,属主属组均为kubelet。
- File:必须存在文件路径
- Socket:必须存在的Socket文件路径
- CharDevice:必须存在的字符设备文件路径
- BlockDevice:必须存在的块设备文件路径
例如下面定义运行日志收集代理应用filebeat,它使用了hostPath类型的存储卷
apiVersion: v1 kind: Pod metadata: name: vol-hostpath-pod spec: volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers - name: socket hostPath: path: /var/run/docker.sock containers: - name: filebeat image: ikubernetes/filebeat:5.6.7-alpine env: - name: REDIS_HOST value: redis.ilinux.io:6379 - name: LOG_LEVEL value: info volumeMounts: - name: varlog mountPath: /var/log - name: socket mountPath: /var/run/docker.sock - name : varlibdockercontainers mountPath: /var/lib/docker/containers readOnly : true terminationGracePeriodSeconds: 30
4 网络存储卷
4.1 NFS存储卷
Kubernetes的NFS存储卷用于将某事先存在的NFS服务器上导出(export)的存储空间挂载到Pod中以供容器使用。
定义NFS存储卷时,常用以下字段。
- service<string>:NFS服务器的IP地址或主机名,必选字段
- path<string>: NFS服务器导出
- readOnly<boolean>:是否以只读方式挂载,默认为false
如下示例:
apiVersion: v1 kind: Pod metadata: name: vol-nfs-pod labels : app: redis spec : volumes: - name: redisdata nfs: server: nfs.工linux.io path: /data/redis readOnly: false containers: - name: redis image: redis:4-alpine ports: - containerPort: 6379 name: redisport volumeMounts: - mountPath: /data name: redisdata
4.2 RBD存储卷
Ceph是一个专注于分布式的、弹性可扩展的、高可靠的、性能优异的存储系统平台,同时支持提供块设备、文件系统和REST三种存储接口。要配置Pod资源使用RBD存储集群,需要事先满足如下几个前提条件。
- 存在某可用的Ceph RBD存储集群,否则就需要创建一个。
- 在Ceph RBD集群中创建一个能满足Pod资源数据存储需要的存储映像(image)
- 在Kubernetes集群内的各节点上安装Ceph客户端程序包(ceph-common)
在配置RBD类型的存储卷时,需要指定要连接的目标服务器和认证信息等,这一点通常使用以下嵌套字段进行定义。
- monitors<[]string>:Ceph存储监视器,逗号分隔的字符串列表;必选字段
- image<string>:rados image的名称,必选字段
- pool<string>:rados存储池名称,默认为RBD
- user<string>:rados用户名,默认为admin
- keyring<string>:RBD用户认证时使用的keyring文件路径,默认为/etc/ceph/keyring
- secretRef<Object>:RBD用户认证时使用的保存有相应认证信息的Secret对象,会覆盖由keyring字段提供的密钥信息。
- readOnly<boolean>:是否以只读的方式进行访问
- fsType:要挂载的存储卷的文件系统类型,至少应该是节点操作系统支持的文件系统,如ext4、xfs、ntfs等,默认为ext4
下面定义了使用RBD存储卷的Pod资源示例:
apiVersion: v1 kind: Pod metadata : name: vol-rbd-pod spec: containers: - name: redis image: redis:4-alpine ports : - containerPort: 6379 name : redisport volumeMounts: - mountPath: /data name: redis-rbd-vol volumes: - name: redis-rbd-vol rbd: monitors: - ’172.16.0.56:6789’ - '172.16.0.57:6789' - '172.16.0.58:6789' pool: kube image: redis fsType: ext4 readOnly: false user: admin secretRef: name: ceph-secret
5 持久存储卷
5.1 创建PV
PersistentVolume Spec主要支持如下几个通用字段,用于定义PV的容量、访问模式和回收策略。
- Capacity:当前PV的容量;目前,Capacity仅支持空间设定,将来应该还可以指定IOPS和throughput
- accessMode 访问模式:
-
- ReadWriteOnce:仅可被单个节点读写挂载;命令行中简写为RWO
- ReadOnlyMany:可被多个节点同时只读挂载;命令行中简写为ROX
- ReadWriteMany:可被多个节点同时读写挂载;命令行中简写为RWX
3. persistentVolumeReclaimPolicy:PV空间被释放时的处理机制;可用类型仅为Retain(默认)、Recycle或Delete,具体说明如下。
-
- Retain:保持不动,由管理员随后手动回收
- Recycle:空间回收,即删除存储卷目录下的所有文件(包括子目录和隐藏文件),目前仅NFS和hostPath支持此操作
- Delete:删除存储卷,仅部分云端存储系统支持
4. volumeMode:卷类型,用于指定此卷可被用作文件系统还是裸格式的块设备;默认为Filesystem
5. storageClassName:当前PV所属的StorageClass的名称;默认为空值,即不属于任何StorageClass
6. mountOptions:挂载选项组成的列表,如ro、soft和hard等
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-0001 labels: release: stable spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1 nfs: path: ”/webdata/htdocs" server: nfs.ilinux.io
5.2 创建PVC
PersistentVolumeClaim是存储卷类型的资源,他通过申请占用某个PersistentVolume而创建,它与PV是一对一的关系,用户无须关系其底层实现细节。申请时用户需要指定目标空间的大小、访问模式、PV标签选择器和StorageClass等相关信息即可,
PVC的Spec字段的可嵌套字段如下:
- accessMode;当前PVC的访问模式,其可用模式与PV相同
- resources:当前PVC存储卷需要占用的资源量最小值;目前,PVC的资源限定仅指其空间大小。
- selector:绑定时对PV应用的标签选择器(mattchLabels)或匹配条件表达式(matchExpressions),用于挑选要绑定的PV;如果同时指定了两种挑选机制,则必须同时满足两种选择机制的PV才能被选出。
- storageClassName:所依赖的存储类的名称
- volumeMode:卷模型,用于指定此卷可被用作文件系统还是裸格式的块设备;默认为“Filesystem”
- volumeName:用于直接指定要绑定的PV的卷名。
示例:
如下定义了一个PVC资源示例,其选择PV的挑选机制是使用了标签选择器,适配的标签是release:stable,存储类为slow,这会关联到前面创建的PV资源。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs-0001 lables: release: stable spec: accessModes: - ReadWriteMany volumeMode: Filesystem resources : requests: storage: 5Gi storageClassName: slow selector: matchLabels: release: stable
5.3 在Pod中使用PVC
在Pod资源中调用PVC资源,只需要在定义volumes时使用persistentVolumeClaims字段嵌套指定两个字段即可,具体如下:
- claimName:要调用的PVC存储卷的名称,PVC卷要与Pod在同一名称空间中。
- readOnly:是否将存储卷强制挂载为只读模式,默认为false
如下示例调用如上创建的pvc资源:
apiVersion: v1 kind: Pod metadata: name: vol-rbd-pod spec : containers: - name: redis image: redis:4-alpine ports: - containerPort: 6379 name : redisport volumeMounts: - mountPath: /data name: redis-nfs-vol volumes · - name: redis-nfs-vol persistenιVolumeClaim: claimName: pv-nfs-0001

浙公网安备 33010602011771号