深入理解k8s中的容器存储接口(CSI)

server/2025/2/8 19:11:06/

CSI出现的原因

K8s原生支持一些存储类型的PV,像iSCSI、NFS等。但这种方式让K8s代码与三方存储厂商代码紧密相连,带来不少麻烦。比如更改存储代码就得更新K8s组件,成本高;存储代码的bug还会影响K8s稳定性;K8s社区维护和测试负担重,而且存储插件特权高,存在安全隐患。CSI的出现,就是为了解决这些问题,把三方存储代码和K8s代码分开,让存储厂商开发插件更轻松。

CSI核心流程分三步

  1. Provision/Delete(创盘/删盘):用户创建PVC,K8s根据PVC和StorageClass,让External Provisioner调用CSI插件创盘,之后创建PV并绑定PVC。删盘时,External Provisioner根据PVC回收策略,调用CSI插件删盘并删除PV。
    在这里插入图片描述

  2. Attach/Detach(挂接/摘除):Pod调度到节点后,AD控制器创建VolumeAttachment对象,External Attacher调用CSI插件挂接存储卷,完成后更新状态。Pod删除时,AD控制器删除VolumeAttachment对象,External Attacher调用插件摘除存储卷。
    在这里插入图片描述

  3. Mount/Unmount(挂载/卸载):Kubelet发现使用CSI类型PV的Pod调度到本节点,等待VolumeAttachment状态就绪,调用CSI插件挂载。Pod删除时,Kubelet调用插件卸载。
    在这里插入图片描述

CSI Sidecar组件

为使 K8s 适配 CSI 标准,社区将与 K8s 相关的存储流程逻辑放在了 CSI Sidecar 组件中。

  1. Node Driver Registrar:负责把外部CSI插件注册到Kubelet,让Kubelet能调用插件函数。
  2. External Provisioner:创建或删除存储卷和PV资源。
  3. External Attacher:实现存储卷的挂接和摘除。
  4. External Resizer:监控PVC,满足条件时调用CSI插件扩容存储卷。
  5. livenessprobe:通过暴露端口检查CSI插件是否正常运行。

CSI接口

三方存储厂商需实现 CSI 插件的三大接口:IdentityServerControllerServerNodeServer

  1. IdentityServer:认证插件身份信息,提供插件名称、版本等。
// IdentityServer is the server API for Identity service.
type IdentityServer interface {// 获取CSI插件的信息,比如名称、版本号GetPluginInfo(context.Context, *GetPluginInfoRequest) (*GetPluginInfoResponse, error)// 获取CSI插件提供的能力,比如是否提供ControllerService能力GetPluginCapabilities(context.Context, *GetPluginCapabilitiesRequest) (*GetPluginCapabilitiesResponse, error)// 获取CSI插件健康状况Probe(context.Context, *ProbeRequest) (*ProbeResponse, error)
}
  1. ControllerServer:处理存储卷的创建、删除、挂接、摘除、扩容等操作。
// ControllerServer is the server API for Controller service.
type ControllerServer interface {// 创建存储卷CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error)// 删除存储卷DeleteVolume(context.Context, *DeleteVolumeRequest) (*DeleteVolumeResponse, error)// 挂接存储卷到特定节点ControllerPublishVolume(context.Context, *ControllerPublishVolumeRequest) (*ControllerPublishVolumeResponse, error)// 从特定节点摘除存储卷ControllerUnpublishVolume(context.Context, *ControllerUnpublishVolumeRequest) (*ControllerUnpublishVolumeResponse, error)// 验证存储卷能力是否满足要求,比如是否支持跨节点多读多写ValidateVolumeCapabilities(context.Context, *ValidateVolumeCapabilitiesRequest) (*ValidateVolumeCapabilitiesResponse, error)// 列举全部存储卷信息ListVolumes(context.Context, *ListVolumesRequest) (*ListVolumesResponse, error)// 获取存储资源池可用空间大小GetCapacity(context.Context, *GetCapacityRequest) (*GetCapacityResponse, error)// 获取ControllerServer支持功能点,比如是否支持快照能力ControllerGetCapabilities(context.Context, *ControllerGetCapabilitiesRequest) (*ControllerGetCapabilitiesResponse, error)// 创建快照CreateSnapshot(context.Context, *CreateSnapshotRequest) (*CreateSnapshotResponse, error)// 删除快照DeleteSnapshot(context.Context, *DeleteSnapshotRequest) (*DeleteSnapshotResponse, error)// 获取所有快照信息ListSnapshots(context.Context, *ListSnapshotsRequest) (*ListSnapshotsResponse, error)// 扩容存储卷ControllerExpandVolume(context.Context, *ControllerExpandVolumeRequest) (*ControllerExpandVolumeResponse, error)
}
  1. NodeServer:负责存储卷在节点上的挂载、卸载、获取容量信息等。
// ControllerServer is the server API for Controller service.
type ControllerServer interface {// 创建存储卷CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error)// 删除存储卷DeleteVolume(context.Context, *DeleteVolumeRequest) (*DeleteVolumeResponse, error)// 挂接存储卷到特定节点ControllerPublishVolume(context.Context, *ControllerPublishVolumeRequest) (*ControllerPublishVolumeResponse, error)// 从特定节点摘除存储卷ControllerUnpublishVolume(context.Context, *ControllerUnpublishVolumeRequest) (*ControllerUnpublishVolumeResponse, error)// 验证存储卷能力是否满足要求,比如是否支持跨节点多读多写ValidateVolumeCapabilities(context.Context, *ValidateVolumeCapabilitiesRequest) (*ValidateVolumeCapabilitiesResponse, error)// 列举全部存储卷信息ListVolumes(context.Context, *ListVolumesRequest) (*ListVolumesResponse, error)// 获取存储资源池可用空间大小GetCapacity(context.Context, *GetCapacityRequest) (*GetCapacityResponse, error)// 获取ControllerServer支持功能点,比如是否支持快照能力ControllerGetCapabilities(context.Context, *ControllerGetCapabilitiesRequest) (*ControllerGetCapabilitiesResponse, error)// 创建快照CreateSnapshot(context.Context, *CreateSnapshotRequest) (*CreateSnapshotResponse, error)// 删除快照DeleteSnapshot(context.Context, *DeleteSnapshotRequest) (*DeleteSnapshotResponse, error)// 获取所有快照信息ListSnapshots(context.Context, *ListSnapshotsRequest) (*ListSnapshotsResponse, error)// 扩容存储卷ControllerExpandVolume(context.Context, *ControllerExpandVolumeRequest) (*ControllerExpandVolumeResponse, error)
}

K8s CSI API对象

K8s 为支持 CSI 标准,包含如下 API 对象:

  1. CSINode:判断CSI插件是否注册成功,关联K8s节点和三方存储节点,显示卷拓扑信息。
apiVersion: storage.k8s.io/v1beta1
kind: CSINode
metadata:name: node-10.212.101.210
spec:drivers:- name: yodaplugin.csi.alibabacloud.comnodeID: node-10.212.101.210topologyKeys:- kubernetes.io/hostname- name: pangu.csi.alibabacloud.comnodeID: a5441fd9013042ee8104a674e4a9666atopologyKeys:- topology.pangu.csi.alibabacloud.com/zone
  1. CSIDriver:方便发现外部CSI插件,自定义K8s行为。
apiVersion: storage.k8s.io/v1beta1
kind: CSIDriver
metadata:name: pangu.csi.alibabacloud.com
spec:# 插件是否支持卷挂接(VolumeAttach)attachRequired: true# Mount阶段是否CSI插件需要Pod信息podInfoOnMount: true# 指定CSI支持的卷模式volumeLifecycleModes:- Persistent
  1. VolumeAttachment:记录存储卷挂接/摘除和节点信息。
apiVersion: storage.k8s.io/v1
kind: VolumeAttachment
metadata:annotations:csi.alpha.kubernetes.io/node-id: 21481ae252a2457f9abcb86a3d02ba05finalizers:- external-attacher/pangu-csi-alibabacloud-comname: csi-0996e5e9459e1ccc1b3a7aba07df4ef7301c8e283d99eabc1b69626b119ce750
spec:attacher: pangu.csi.alibabacloud.comnodeName: node-10.212.101.241source:persistentVolumeName: pangu-39aa24e7-8877-11eb-b02f-021234350de1
status:attached: true

CSI支持特性

  1. 拓扑支持:依据节点拓扑挂载存储卷,提升数据访问效率。
  2. 存储卷扩容:用户修改PVC存储请求字段就能扩容,不过只能扩容不能缩容。
  3. 单节点卷数量限制:限制单个节点挂载存储卷的数量。
  4. 存储卷监控:存储商实现相关接口,Kubelet获取存储卷容量、使用量等指标。
  5. Secret:通过Secret处理存储过程中的私密数据。
  6. 块设备:三方存储厂商实现特定接口,K8s提供工具包支持块设备使用。
  7. 卷快照/卷克隆能力:可对存储卷进行快照和克隆,用于数据备份、恢复和快速创建新卷。

好了完结撒花!


http://www.ppmy.cn/server/166013.html

相关文章

FPGA的IP核接口引脚含义-快解

疑问 手册繁琐,怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌,手册确实比较详细但繁琐,如何快速知晓该部分信息,涛tao道长给你们说,简单得很,一般新入门的道友有所不知,往往后面…

机器学习 - 需要了解的条件概率、高斯分布、似然函数

似然函数是连接数据与参数的桥梁,通过“数据反推参数”的逆向思维,成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”,这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…

C++开发(软件开发)常见面试题

目录 1、C里指针和数组的区别 2、C中空指针请使用nullptr不要使用NULL 3、http/https区别和头部结构? 4、有了mac地址为什么还要ip地址?ip地址的作用 5、有了路由器为什么还要交换机? 6、面向对象三大特性 7、友元函数 8、大端小端 …

拥抱开源,助力创新:IBM永久免费云服务器助力开源项目腾飞

近年来,开源项目蓬勃发展,为全球科技进步做出了巨大贡献。然而,服务器成本高昂常常成为开源项目的巨大障碍。许多优秀的项目因缺乏资源而难以持续发展,甚至夭折。令人振奋的是,IBM云计算平台推出了一项重磅活动&#x…

11. 9 构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南

构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南 关键词: 聊天对话记忆系统、多用户会话管理、LangChain生产部署、Redis记忆存储、高并发对话系统 一、服务级聊天记忆系统核心需求 多用户隔离:支持同时处理数千个独立对话持久化存储:对话历史不因服务重启丢…

LCR 004. 只出现一次的数字 II

文章目录 1.题目2.思路3.代码 1.题目 LCR 004. 只出现一次的数字 II 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 **三次 。**请你找出并返回那个只出现了一次的元素。 示例 1: **输入:**nums [2…

ASP.NET Core JWT

目录 Session的缺点 JWT(Json Web Token) 优点: 登录流程 JWT的基本使用 生成JWT 解码JWT 用JwtSecurityTokenHandler对JWT解码 注意 Session的缺点 对于分布式集群环境,Session数据保存在服务器内存中就不合适了&#…

Mysql系列之--字符集

1、字符集 1.1、字符集简介 我们知道在计算机中只能存储二进制,那么如何将字符存储到计算机中,这个时候就需要将字符映射称为二进制,将所有字符映射为二进制就需要映射表。建立映射表需要注意: 1、明确哪些字符需要映射为二进制…