第九章 存储卷与数据持久化

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的容量、访问模式和回收策略。

  1. Capacity:当前PV的容量;目前,Capacity仅支持空间设定,将来应该还可以指定IOPS和throughput
  2. 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
posted @ 2022-11-29 21:21  摩天居士-谢烟客  阅读(104)  评论(0)    收藏  举报