k8s之CSI详解

Kubernetes CSI 详解

一、CSI 概述

Container Storage Interface(CSI) 是一个标准化接口,用于定义容器编排系统(如 Kubernetes)与存储供应商(Storage Providers)之间的交互方式。其目标是让存储供应商开发的插件能够兼容多个容器编排系统(如 Kubernetes、Mesos、Swarm 等),从而简化存储资源的管理和使用。

在 Kubernetes 中,CSI 提供了一种标准的方式,用于与第三方存储供应商(如 NFS、AWS EFS、Ceph、GlusterFS 等)对接,实现存储卷的创建、挂载、卸载等操作。CSI 的引入取代了旧的 FlexVolume 插件机制,提供了更灵活、更强大的存储管理能力。

二、CSI 系统架构

CSI 系统主要由两大部分组成:

Controller Server(控制服务器)

  • 功能:负责存储卷的生命周期管理,包括卷的创建、删除、挂载、卸载等操作。
  • 部署方式:通常以 StatefulSet 或 Deployment 的形式运行,确保高可用性和唯一性。
  • 组件
    • CSI 驱动容器:由第三方存储供应商提供,实现 CSI 接口。
    • Sidecar 容器(如 external-provisioner、external-attacher 等):负责与 Kubernetes 的组件(如 kube-controller-manager)通信,触发 CSI 驱动的操作。

Node Server(节点服务器)

  • 功能:负责节点级别的存储卷挂载和卸载操作。
  • 部署方式:以 DaemonSet 的形式运行,确保每个节点上都有 CSI 插件实例。
  • 组件
    • CSI 驱动容器:由第三方存储供应商提供,实现 CSI 接口。
    • Sidecar 容器(如 node-driver-registrar):负责与 kubelet 通信,注册 CSI 驱动。

三、CSI 组件构成及功能

(一)CSI Controller

CSI Controller 是 CSI 插件的控制端,负责存储卷的生命周期管理。其主要组件包括:

Sidecar 容器
  • external-provisioner
    • 监听 PersistentVolumeClaim(PVC)的变化。
    • 触发 CSI 驱动的 CreateVolume 和 DeleteVolume 操作,实现存储卷的创建和删除。
  • external-attacher
    • 监听 VolumeAttachment 的变化。
    • 触发 CSI 驱动的 ControllerPublish 和 ControllerUnpublish 操作,实现存储卷的挂载和卸载。
  • external-resizer(可选)
    • 监听 PersistentVolumeClaim 的大小变化。
    • 触发 CSI 驱动的 ResizeVolume 操作,实现存储卷的容量调整(Beta 阶段)。
  • externalsnapshotter(可选)
    • 监听 VolumeSnapshot 的变化。
    • 触发 CSI 驱动的 CreateSnapshot 和 DeleteSnapshot 操作,实现存储卷的快照管理(Alpha 阶段)。
CSI Driver 容器
  • 由第三方存储供应商提供,实现 CSI 接口。
  • 通过 Unix Domain Socket 与 Sidecar 容器通信,完成具体的存储卷操作。
部署建议

CSI Controller 通常以 StatefulSet 或 Deployment 的形式运行,副本数设为 1,以确保唯一性。

(二)CSI Node

CSI Node 是 CSI 插件的节点端,负责节点级别的存储卷管理。其主要组件包括:

Sidecar 容器
  • node-driver-registrar
    • 将 CSI 驱动注册到 kubelet。
    • 监听 kubelet 的操作请求,触发 CSI 驱动的节点端接口(如 NodePublishVolume、NodeUnpublishVolume 等)。
CSI Driver 容器
  • 由第三方存储供应商提供,实现 CSI 接口。
  • 接收 kubelet 的调用,完成存储卷的挂载、卸载等操作。
通信方式
  • node-driver-registrar 与 kubelet 通过 Unix Domain Socket 通信。
  • CSI Driver 容器与 kubelet 通过另一个 Unix Domain Socket 通信,并挂载 kubelet 的工作目录(默认为 /var/lib/kubelet),用于管理 Pod 的 Volume。
部署建议

CSI Node 以 DaemonSet 的形式运行,确保每个节点上都有 CSI 插件实例。

四、CSI 与 Kubernetes 组件的通信方式

CSI Controller 与 Kubernetes 的通信

  • 组件:external-provisioner、external-attacher 等 Sidecar 容器。
  • 通信方式
    • 通过 Kubernetes API 监听资源对象的变化(如 PersistentVolumeClaim、VolumeAttachment 等)。
    • 通过 Unix Domain Socket 调用 CSI 驱动的接口。

CSI Node 与 Kubelet 的通信

  • 组件:node-driver-registrar Sidecar 容器。
  • 通信方式:通过 Unix Domain Socket 与 kubelet 通信。CSI Driver 容器通过 Unix Domain Socket 接收 kubelet 的调用,完成存储卷的挂载和卸载。

CSI 驱动与 Sidecar 的通信

  • 通信方式:通过 Unix Domain Socket 使用 gRPC 协议进行通信。Sidecar 容器通过 gRPC 调用 CSI 驱动的接口,完成具体的存储操作。

五、CSI 工作原理

CSI 的工作流程围绕 Kubernetes 的存储资源(如 PersistentVolume、PersistentVolumeClaim)展开,主要包含以下步骤:

  1. 存储资源的创建:用户创建 PersistentVolumeClaim(PVC),指定存储需求(如大小、访问模式等)。external-provisioner 监听到 PVC 的变化,调用 CSI 驱动的 CreateVolume 接口,创建存储卷。
  2. 存储卷的挂载:external-attacher 监听到 VolumeAttachment 的变化,调用 CSI 驱动的 ControllerPublish 接口,将存储卷与目标节点绑定。kubelet 通过 node-driver-registrar 调用 CSI 驱动的 NodePublishVolume 接口,将存储卷挂载到容器的指定路径。
  3. 存储卷的卸载:用户删除 PersistentVolumeClaim 或 VolumeAttachment。external-attacher 调用 CSI 驱动的 ControllerUnpublish 接口,解除存储卷与节点的绑定。kubelet 调用 CSI 驱动的 NodeUnpublishVolume 接口,将存储卷从容器中卸载。
  4. 存储卷的删除:external-provisioner 监听到 PVC 的删除操作,调用 CSI 驱动的 DeleteVolume 接口,删除存储卷。

六、CSI 与 FlexVolume 的对比

CSI 是 FlexVolume 的升级版,主要区别如下:

  • 接口标准化:CSI 提供了更标准化的接口,支持更复杂的存储操作(如快照、扩容等)。
  • 组件分离:CSI 将功能分离为 Controller 和 Node 两个部分,支持更灵活的部署和扩展。
  • 性能优化:CSI 使用 gRPC 协议,通信效率更高。

七、总结

CSI 是 Kubernetes 中存储管理的重要组成部分,通过标准化的接口和灵活的组件设计,为用户提供了强大的存储管理能力。掌握 CSI 的工作原理和组件构成,能够帮助用户更好地管理和优化 Kubernetes 集群中的存储资源。

你可能感兴趣的:(#,k8s,kubernetes,容器,云原生)