k8s权威指南笔记:存储原理

Posted by keys961 on April 7, 2022

1. Kubernetes Volume

Volume用于Pod容器间共享存储。

它与Pod绑定,和Pod生命周期相同。

Volume支持多种类型:

  • 资源对象:ConfigMap、Secret、DownwardAPI等

  • 宿主机存储:EmptyDir、HostPath、Local等

  • 网络存储:CephFS、NFS等

  • 存储厂商存储:StorageOS、VsphereVolume等

  • 公有云:AzureDisk、GCEPersistentDisk等

2. PV、PVC、StorageClass

PV:存储资源的抽象,由管理员配置,供Pod使用,但独立于Pod生命周期。

PVC:用户对PV的申请,会消耗PV资源

  • 若已有PV能满足,可以使用已有PV

  • 若已有PV不能满足,则需指定StorageClass,以此动态创建PV

StorageClass:用于定义存储资源的特性,以此为依据,动态创建PV

2.1. PV与PVC工作流程

可将PV为资源,PVC当成需求,工作分为:

  1. 资源供应:PV资源供应

  2. 资源绑定:通过PVC,将PV与Pod绑定

  3. 资源使用:Pod使用PV资源

  4. 资源回收:删除PVC,回收处理PV资源

图片.png

a. 资源供应

分为2种模式供应:

  • 静态模式:管理员预先创建PV

  • 动态模式:PVC后,基于指定的StorageClass创建PV

    • StorageClass需要预先定义

    • StorageClass可为"",此时禁用动态模式

b. 资源绑定

静态模式下:

  1. 根据PVC,寻找已有满足要求的PV

  2. 将PV和PVC绑定

    • PV被该PVC独占,不能与其它PVC绑定
  3. 若没有满足的PV,则PVC将处于Pending状态

动态模式:

  1. 根据PVC,找到合适的StorageClass

  2. 自动创建PV与该PVC绑定

c. 资源使用

Pod定义,可设置persistentVolumeClaim设置PVC。

多个Pod可使用同一个PVC,此时多Pod共享同一个PV,需要处理好多进程访问同一个存储多问题。

PV与PVC保护:

  • PVC删除在使用它的Pod删除后执行

  • PV删除在绑定它的PVC删除后执行

d. 资源回收

PV与PVC绑定结束后(PVC被删除),PV有3种回收策略:

  • Retaine:保留数据

  • Delete:自动删除数据

  • Recycle:回收,仅HostPath和NFS等支持,简单执行rm -rf /thevolume/*

    • 被弃用,以动态供应机制代替

e. PVC扩容

PVC可在使用中更新,通过修改PVC定义,以实现扩容。

一些机制,如CSI类型存储、文件系统、在线扩容、扩容失败后恢复机制,需要后端等其它的支持。

2.2. PV配置

配置参考:[PersistentVolume Kubernets](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/)

关键配置如下:

  • 存储容量

  • 存储卷模式:例如文件存储、块存储

  • 访问模式:RWOP读写(单Pod挂载)、RWO读写(单Node挂载)、ROX只读(多Node挂载)、RWX读写(多Node挂载)

  • 存储类:即StorageClass的名字

    • 与具有该类别的PVC绑定

    • 若不设置,则不和任何PVC绑定

  • 回收策略:Retain、Delete、Recycle

  • 挂载选项

  • 节点亲和性:限制某些Node访问Volume,可将使用该Volume的Pod调度到指定Node上

    • 对Local等PV比较适用

PV的4个状态:Available(未绑定)、Bound(已经绑定)、Release(刚删除绑定的PVC,未回收)、Failed(回收失败)

2.3. PVC配置

配置参考:[PersistentVolumeClaim Kubernetes](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/)

关键配置如下:

  • 存储资源的请求量

  • 访问模式

  • 存储卷模式:同PV,优先的可以绑定文件存储

  • PV选择Selector:利用Label Selector筛选PV

  • 存储类:即要申请的StorageClass名字

    • 若为""则不使用动态模式

    • 若未设置,则默认为DefaultStorageClass,若默认未允许,同""

2.4. Pod使用PVC

volumes.persistentVolumeClaim中设置,在claimName中指定PVC的名字,同时需要设置volumes.name

然后,在Pod中容器的挂载设置中(containers.volumeDevices),指定上面设置的Volume设备(volumes.name)。

2.5. StorageClass配置

配置参考:[StorageClass Kubernetes](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/storage-class-v1/)

关键配置如下:

  • 存储提供者:即Provisioner,后端存储驱动

    • 可以用内置、第三方,也可自行实现,需要符合规范
  • 回收策略:Delete(默认)与Retain

  • 是否允许扩容:允许PVC与PV绑定后,通过修改PVC完成PV扩容

  • 挂载选项

  • 存储绑定模式:包括

    • Immediate(默认):PVC创建时,立刻创建PV并绑定

    • WaitForFirstConsumer:第一个使用PVC的Pod创建后,在Pod所在Node上创建PV并绑定

      • Azure、GCE、AWS存储后端都支持
  • 存储后端的参数

StorageClass可被指定为默认的,需要:

  • api-server开启DefaultStorageClass选项

  • StorageClass中指定一个annotation storageclass.beta.kubernetes.io/is-default-class="true"

3. CSI存储机制

即Container Storage Interface,通过该接口标准,实现存储插件,为容器提供存储服务。

避免以“in-tree”(将代码并入k8s主库)方式实现存储插件,降低耦合性。

具体参考:Introduction - Kubernetes CSI Developer Documentation

3.1. 核心组件与架构

组件:CSI Controller、CSI Node

a. CSI Controller

提供存储服务视图,对存储资源和存储卷进行管理操作。

一般部署为单实例Pod,该Pod运行2个容器:

  1. kube-controller-manager通信的sidecar容器,包含:

    • external-attacher:监控VolumeAttachment资源对象变更

    • external-provisioner:监控PVC的变更

    • external-snapshotter:管理快照

    • external-resizer:管理扩容

  2. CSI Driver存储驱动容器,由第三方提供,实现CSI规定的接口

两个容器通过Unix Socket并使用gRPC协议通信,sidecar容器调用CSI Driver容器接口,CSI Driver容器负责具体存储卷操作。

b. CSI Node

对主机Node上的Volume进行管理和操作。

一般部署为DaemonSet,每个Pod运行2个容器:

  1. kubelet通信的sidecar容器node-driver-registrar,主要将驱动注册到kubelet

  2. CSI Driver存储驱动容器,由第三方提供,主要接收kubelet的调用,需实现一系列与Node相关的CSI接口

通信也同样基于Unix Socket和gRPC。

3.2. 存储快照管理

引入3个资源对象:

  • VolumeSnapshotContent:某个PV的快照(类比PV)

  • VolumeSnapshot:需要使用某个快照的申请(类比PVC)

  • VolumeSnapshotClass:设置快照的特性,屏蔽VolumeSnapshotContent的细节(类比StorageClass)

此外还需要部署Snapshot Controller,并为CSI驱动部署csi-snapshotter辅助sidecar:

  • Snapshot Controller:监控VS的创建,自动创建VSC对象

  • 辅助sidecar:监控VSC创建和删除,调用CSI的CreateSnapshot或DeleteSnapshot接口,创建或删除快照

a. VolumeSnapshot与VolumeSnapshotContent生命周期

与PV、PVC类似,生命周期包括:

  • 资源供应:包括静态(预先创建)和动态(基于VolumeSnapshotClass,在申请时创建)供应

  • 资源绑定:Snapshot Controller将VolumeSnapshot绑定到VolumeSnapshotContent上,一对一绑定

  • 对PVC的保护:PVC的删除会在VolumeSnapshot创建完成/终止后执行

  • 资源删除:VolumeSnapshot删除后,对VolumeSnapshotContent执行Delete或Retain操作

b. 基于快照创建新的PVC存储卷

在PVC中设置dataSouce,指定kindVolumeSnapshot

c. PVC存储卷克隆

CSI类型存储可支持克隆功能,可基于某个已有PVC克隆一个新PVC,通过dataSource字段设置源PVC实现(kind设置为PersistentVolumeClaim)。

克隆需要注意:

  • 仅支持CSI类型的存储卷

  • 仅适用动态供应模式

  • 具体功能实现,取决于CSI驱动

  • 目标PVC和源PVC处于一个namespace

  • 目标PVC和源PVC属于同一个StorageClass

  • 目标PVC和源PVC的存储模式相同(必须同为文件或块存储)