【Kubernetes基础--持久化存储原理】--查阅笔记5

目录

  • 持久化存储机制
  • PV 详解
    • PV 关键配置参数
    • PV 生命周期的各个阶段
  • PVC 详解
    • PVC 关键配置参数
    • PV 和 PVC 的生命周期
  • StorageClass 详解
    • StorageClass 关键配置参数
    • 设置默认的 StorageClass

持久化存储机制

k8s 对于有状态的容器应用或对数据需要持久化的应用,不仅需要容器内的目录挂载到宿主机的目录或者 emptyDir 临时存储卷,而且需要更加可靠的存储来保存应用产生的重要数据,以便容器应用在重建之后仍然可以使用之前的数据。

k8s 1.0 版本引入了 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)两个资源对象来实现对存储的管理子系统。

PV 是底层网络共享存储的抽象,将共享存储定义为一种“资源”,类比 Node 是一种容器应用可以“消费”的资源。PVC 则是用户对存储资源的一个“申请”。就像 Pod “消费” Node的资源一样,PVC 能够“消费” PV 资源。PVC 可以申请特定的存储空间和访问模式。

通常应用程序都会对存储设备的特性和性能有不同的要求,包括读写速度、并发性能、数据冗余等更高的要求,k8s 从1.4版本开始引入了一个新的资源对象 StorageClass,用于标记存储资源的特性和性能。到1.6版本时,StorageClass 和动态资源供应的机制得到了完善,实现了存储卷的按需创建,在共享存储的自动化管理进程中实现了重要的一步。

通过 StorageClass 的定义,管理员可以将存储资源定义为某种类别(Class)​,正如存储设备对于自身的配置描述(Profile)​,例如“快速存储”​“慢速存储”​“有数据冗余”​“无数据冗余”等。用户根据 StorageClass 的描述就能够直观地得知各种存储资源的特性,就可以根据应用对存储资源的需求去申请存储资源了。

PV 详解

PV 作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略、后端存储类型等信息的设置。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 5Gi # 存储能力
  accessModes:  # 访问模式
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle # 回收策略
  storageClassName: slow # 存储类别
  nfs:  # PV类型:网络文件系统
    path: /tmp
    server: 172.17.0.2

PV 关键配置参数

  • 存储能力(Capacity):storage=xx
  • 存储卷模式(Volume Mode):volumeMode=xxx,Filesystem(文件系统)和Block(块设备)​,默认值为Filesystem
  • 访问模式(Access Modes):1. ReadWriteOnce(RWO)​:读写权限,并且只能被单个Node挂载;2. ReadOnlyMany(ROX)​:只读权限,允许被多个Node挂载;3. ReadWriteMany(RWX)​:读写权限,允许被多个Node挂载
  • 存储类别(Class):storageClassName=xxx
  • 回收策略(Reclaim Policy):persistentVolumeReclaimPolicy=xxx
  • 挂载参数(Mount Options):在将 PV 挂载到一个 Node 上时,根据后端存储的特点,可能需要设置额外的挂载参数,可以根据 PV 定义中的 mountOptions 字段进行设置
  • 节点亲和性(Node Affinity):限制只能通过某些Node访问Volume,可以在PV定义中的nodeAffinity字段进行设置。这个参数仅用于Local存储卷。

PV 生命周期的各个阶段

  • Available:可用状态,还未与某个PVC绑定
  • Bound:已与某个PVC绑定
  • Released:绑定的PVC已经删除,资源已释放,但没有被集群回收
  • Failed:自动资源回收失败

PVC 详解

PVC 作为用户对存储资源的需求申请,主要包括存储空间请求、访问模式、PV 选择条件和存储类别等信息的设置。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:  # 访问模式
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  storageClassName: slow
  selector: # PV 条件选择
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}

PVC 关键配置参数

  • 资源请求(Resources)​:描述对存储资源的请求,目前仅支持 request.storage 的设置,即存储空间大小
  • 访问模式(Access Modes)​:PVC 也可以设置访问模式,用于描述用户应用对存储资源的访问权限。其三种访问模式的设置与 PV 的设置相同
  • 存储卷模式(Volume Modes)​:PVC 也可以设置存储卷模式,用于描述希望使用的 PV 存储卷模式,包括文件系统和块设备
  • PV 选择条件(Selector)​:通过对Label Selector的设置,可使PVC对于系统中已存在的各种PV进行筛选。
  • 存储类别(Class)​: PVC 在定义时可以设定需要的后端存储的类别(通过 storageClassName 字段指定)​,以减少对后端存储特性的详细信息的依赖。只有设置了该 Class 的 PV 才能被系统选出,并与该 PVC 进行绑定。

注意,PVC 和 PV 都受限于 Namespace,PVC 在选择 PV 时受到 Namespace 的限制,只有相同 Namespace 中的 PV 才可能与 PVC 绑定。Pod 在引用 PVC 时同样受 Namespace 的限制,只有相同 Namespace 中的 PVC 才能挂载到 Pod 内。

PV 和 PVC 的生命周期

  • 资源供应:静态模式(Static,手工创建)和动态模式(Dynamic,通过StorageClass设置)​。资源供应的结果就是创建好的PV。
  • 资源绑定:根据 PVC 对存储资源的请求(存储空间和访问模式)在已存在的 PV 中选择一个,如果没有,PVC 则会无限期处于 Pending状态。PV 一旦绑定到某个 PVC 上,就会被这个 PVC 独占,不能再与其他 PVC 进行绑定了。
  • 资源使用:Pod 使用 Volume 的定义,将 PVC 挂载到容器内的某个路径进行使用。在容器应用挂载了一个 PVC 后,就能被持续独占使用。不过,多个 Pod 可以挂载同一个 PVC,应用程序需要考虑多个实例共同访问一块存储空间的问题。
  • 资源释放:删除 PVC,与该 PVC 绑定的 PV 将会被标记为“已释放”​,但还不能立刻与其他 PVC 进行绑定。通过之前 PVC 写入的数据可能还被留在存储设备上,只有在清除之后该 PV 才能再次使用。
  • 资源回收:对于 PV,管理员可以设定回收策略,用于设置与之绑定的 PVC 释放资源之后如何处理遗留数据的问题。只有 PV 的存储空间完成回收,才能供新的 PVC 绑定和使用。

StorageClass 详解

StorageClass 作为对存储资源的抽象定义,由系统自动完成 PV 的创建和绑定,实现了动态的资源供应。基于 StorageClass 的动态资源供应模式将逐步成为云平台的标准存储配置模式。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2

StorageClass 关键配置参数

  • 提供者(Provisioner):描述存储资源的提供者,也可以看作后端存储驱动。
  • 参数(Parameters):后端存储资源提供者的参数设置,不同的Provisioner包括不同的参数设置。

设置默认的 StorageClass

要在系统中设置一个默认的 StorageClass,则首先需要启用名为 DefaultStorageClass的admission controller,即在 kube-apiserver 的命令行参数 --admission-control 中增加:

--admission-control=...,DefaultStorageClass

在 StorageClass 的定义中设置一个 annotation:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gold
  annotations: storageclass.beta.kubernetes.io/is-default-class="true"
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

通过 kubectl create 创建,查看:

kubectl get sc
# NAME        TYPE
# gold (default)   kubernetes.io/gce-pd

你可能感兴趣的:(容器化,kubernetes,笔记,容器)