IT评测·应用市场-qidao123.com

标题: 容器存储接口--CSI [打印本页]

作者: 铁佛    时间: 2024-9-2 07:28
标题: 容器存储接口--CSI
目录

一、背景

K8s 原生支持一些存储类型的 PV,如 iSCSI、NFS、CephFS 等等,这些 in-tree 类型的存储代码放在 Kubernetes 代码仓库中。这里带来的标题是 K8s 代码与三方存储厂商的代码强耦合
CSI 容器存储接口标准的出现解决了上述标题,将三方存储代码与 K8s 代码解耦,使得三方存储厂商研发人员只需实现 CSI 接口(无需关注容器平台是 K8s 还是 Swarm 等)。

二、CSI 是什么

CSI是Container Storage Interface(容器存储接口)的简写。
CSI的目标是定义行业标准"容器存储接口",使存储供应商(SP,Storage Provider)能够开辟一个符合CSI标准的插件并使其可以在多个容器编排(CO)系统中工作。CO包括Cloud Foundry, Kubernetes, Mesos,Swarm等。
kubernetes将通过CSI接口来跟第三方存储厂商举行通信,来操作存储,从而提供容器存储服务。
三、CSI 系统架构

CSI 主要包罗两个部门:

1、CSI 怎样与 k8s 组件相互通信


CSI Controller Server 和 External CSI SideCar 之间以及 CSI Node Server 和 Kubelet 之间其实都是通过创建 Unix Domain Socket 文件使用 gRPC 协议举行相互通信的
2、CSI 由哪些组件构成


3、CSI 的工作原理

CSI 的工作流程实际上就是围绕着两方面的组件:

4、k8s 存储中涉及的组件及其作用

4.1、Sidecar Containers

Sidecar Contrainers
Kubernetes CSI Sidecar 容器是一组标准容器,旨在简化 Kubernetes 上 CSI 驱动程序的开辟和部署。
这些容器包罗监视 Kubernetes API、针对 "CSI 卷驱动程序" 容器触发适当操作以及根据需要更新 Kubernetes API 的通用逻辑。
这些容器旨在与第三方 CSI 驱动容器捆绑在一起,并作为 pod 一起部署。
这些 Sidecar 容器的优点:
4.1.1、external-attacher

它监视 Kubernetes API 服务器上的 VolumeAttachment 对象并Controller[Publish|Unpublish]Volume 针对 CSI 端点触发操作。
4.1.2、external-provisioner

CSI external-provisioner 是一个 sidecar 容器,用于监视 Kubernetes API 服务器中的 PersistentVolumeClaim 对象。
它针对指定的 CSI 端点调用 CreateVolume 以配置新卷。
如果 PVC 引用 Kubernetes StorageClass,并且存储类的配置者字段中的名称与 GetPluginInfo 调用中指定的 CSI 端点返回的名称匹配,则通过创建新的 Kubernetes PersistentVolumeClaim 对象来触发卷配置。
乐成配置新卷后,sidecar 容器会创建一个 Kubernetes PersistentVolume 对象来表现该卷。
使用删除回收策略删除绑定到与此驱动程序对应的 PersistentVolume 的 PersistentVolumeClaim 对象,会导致 sidecar 容器针对指定的 CSI 端点触发 DeleteVolume 操作以删除该卷。一旦卷被乐成删除,sidecar 容器也会删除代表该卷的 PersistentVolume 对象。
4.1.3、external-resizer

CSI external-resizer 是一个 sidecar 容器,它监视 Kubernetes API 服务器上的 PersistentVolumeClaim 对象编辑,并在用户哀求 PersistentVolumeClaim 对象上的更多存储时触发针对 CSI 端点的 ControllerExpandVolume 操作。
4.1.4、external-snapshotter

CSI external-snapshotter sidecar 监视 Kubernetes API 服务器中的 VolumeSnapshotContent CRD 对象。CSI external-snapshotter sidecar还负责调用 CSI RPCs CreateSnapshot、DeleteSnapshot 和 ListSnapshots。
可以使用 --enable-volume-group-snapshots 选项启用卷组快照支持。启用后,CSI 外部快照 sidecar 会监视 API 服务器上的 VolumeGroupSnapshotContent CRD 对象,并负责调用 CSI RPCs CreateVolumeGroupSnapshot、DeleteVolumeGroupSnapshot 和 GetVolumeGroupSnapshot。
4.1.5、livenessprobe

CSI livenessprobe 是一个 sidecar 容器,用于监控 CSI 驱动程序的运行状况,并通过 Liveness Probe 机制向 Kubernetes 报告。这使得 Kubernetes 能够主动检测驱动程序的标题并重新启动 pod 以尝试修复标题。
所有 CSI 驱动程序都应使用活性探针来提高部署在 Kubernetes 上的驱动程序的可用性。
4.1.6、node-driver-registrar

CSI node-driver-registrar 是一个 sidecar 容器,它从 CSI 端点获取驱动程序信息(使用 NodeGetInfo),并使用 kubelet plugin registration mechanism (kubelet 插件注册机制)将其注册到该节点上的 kubelet。
Kubelet 直接针对 CSI driver  发出 CSI NodeGetInfo、NodeStageVolume 和 NodePublishVolume 调用。它使用 kubelet 插件注册机制来发现 unix 域套接字以与 CSI 驱动程序通信。因此,所有 CSI 驱动程序都应该使用这个 sidecar 容器向 kubelet 注册自己。
4.1.7、cluster-driver-registrar(已弃用)

自 k8s 1.13以来,此 Sidecar Container 未更新。从 k8s 1.16开始,此 Sidecar Container 已正式弃用
CSI cluster-driver-registrar 是一个 sidecar 容器,它通过创建 CSIDriver 对象向 Kubernetes 集群注册 CSI 驱动程序,该对象使驱动程序能够自定义 Kubernetes 与其交互的方式。
使用以下 Kubernetes 功能之一的 CSI 驱动程序应使用此 sidecar 容器:
如果不使用这些功能之一,则不需要此 sidecar 容器(以及 CSIDriver 对象的创建)。
4.1.8、external-health-monitor-controller

CSI external-health-monitor-controller 是一个 sidecar 容器,与 CSI controller driver一起部署,类似于 CSI external-provisioner sidecar 的部署方式。它调用 CSI 控制器 RPC ListVolumes 或 ControllerGetVolume 来检查 CSI 卷的运行状况,如果卷的状况非常,则在 PersistentVolumeClaim 上报告事件。
CSI 外部运行状况监视器控制器还监视节点故障事件。可以通过将 enable-node-watcher 标志设置为true来启用该组件。目前这只会对local PVs产生影响。当检测到节点故障事件时,将在 PVC 上报告一个事件,以指示使用此 PVC 的 pod 位于故障节点上。
支持 VOLUME_CONDITION 和 LIST_VOLUMES 或 VOLUME_CONDITION 和 GET_VOLUME 控制器功能的 CSI 驱动程序应使用此 sidecar 容器。
4.1.9、external-health-monitor-agent(已弃用)

此 sidecar 已被弃用,并替换为 Kubernetes 中的 CSIVolumeHealth 功能。
CSI external-health-monitor-agent 是一个 sidecar 容器,与 CSI 节点驱动程序一起部署,类似于 CSI node-driver-registrar sidecar 的部署方式。它调用 CSI 节点 RPC NodeGetVolumeStats  检查 CSI 卷的健康状况,如果卷状况非常,则报告 Pod 上的事件。
支持 VOLUME_CONDITION 和 NODE_GET_VOLUME_STATS 节点功能的 CSI 驱动程序应使用此 sidecar 容器。
4.2、PV Controller

是 kube-controller-manager 内部组件,是 k8s 控制面的一部门,负责 PV/PVC 绑定及周期管理,根据需求举行数据卷的 Provision/Delete 操作
4.3、AD Controller

AD Cotroller 全称 Attachment/Detachment 控制器 ,也是 kube-controller-manager  内部一个组件。主要负责创建、删除VolumeAttachment 对象,并调用 volume plugin 来做存储装备的 Attach/Detach 操作(将数据卷挂载到特定node节点上/从特定node节点上解除挂载),以及更新 node.Status.VolumesAttached 等。
差别的 volume plugin 的 Attach/Detach 操作逻辑有所差别,对于 csi plugin(out-tree volume plugin)来说,AD controller 的 Attach/Detach 操作只是修改 VolumeAttachment 对象的状态,而不会真正的将数据卷挂载到节点/从节点上解除挂载,真正的节点存储挂载/解除挂载操作由kubelet中 volume manager 调用 csi plugin 来完成。
4.4、Volume Manager

是 kubelet 内部一个组件,它主要是用来做节点 Volume 的 Attach/Detach/Mount/Unmount 操作。
对于 csi 来说,volume manager 的 Attach/Detach 操作只创建/删除 VolumeAttachment 对象,而不会真正的将数据卷挂载到节点/从节点上解除挂载;
CSI-Attacher 组件也不会做挂载/解除挂载操作,只是更新 VolumeAttachment 对象状态,真正的节点存储挂载/解除挂载操作由kubelet中 volume manager 调用调用 csi plugin 来完成。

四、CSI 存储流程

K8s 中的 Pod 在挂载存储卷时需经历三个的阶段:Provision/Delete(创盘/删盘)、Attach/Detach(挂接/摘除)和 Mount/Unmount(挂载/卸载),下面以图文的方式讲解 K8s 在这三个阶段使用 CSI 的流程。
1、Provisioning Volumes


1、集群管理员创建 StorageClass 资源,该 StorageClass 中包罗 CSI 插件名称(provisioner: rancher.io/local-path )
2、用户创建 PersistentVolumeClaim 资源,PVC 指定存储巨细及 StorageClass。
  1. cat << EOF > pvc-test.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: pvc-test
  6. spec:
  7.   accessModes:
  8.     - ReadWriteOnce
  9.   resources:
  10.     requests:
  11.       storage: 3Gi
  12.   storageClassName: local-path
  13. EOF
复制代码
3、卷控制器(PersistentVolumeController)观察到集群中新创建的 PVC 没有与之匹配的 PV,且其使用的存储类型为 out-of-tree,于是为 PVC 打 annotation:volume.beta.kubernetes.io/storage-provisioner=[out-of-tree CSI 插件名称](本例中为provisioner: rancher.io/local-path)。
4、External Provisioner 组件观察到 PVC 的 annotation 中包罗 "volume.beta.kubernetes.io/storage-provisioner" 且其 value 是自己,于是开始创盘流程。
5、外部 CSI 插件返回乐成后表现盘创建完成,此时 External Provisioner 组件会在集群创建一个 PersistentVolume 资源。
6、卷控制器会将 PV 与 PVC 举行绑定。

2、Attaching Volumes


3、Mounting Volumes


4、Unmounting Volumes


5、Detaching Volumes


6、Deleting Volumes



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4