当前位置: 首页 > article >正文

Kubernetes(K8s)_16_CSI

Kubernetes(K8s)_16_CSI

  • CSI
    • CSI实现
      • CSI接口
      • CSI插件

CSI

CSI(Container Storage Interface): 实现容器存储的规范

  1. 本质: Dynamic ProvisioningAttach/DetachMount/Unmount等功能的抽象
  2. CSI功能通过3个gRPC暴露服务: IdentityServer、ControllerServer、NodeServer
  3. CSI的实现仅暴露服务, 调用由部署时选择的插件代理(kubelet通过Socket调用服务)

如: CSI架构

image


CSI实现

CSI实现: CSI功能实现并与组件拼装

  1. CSI进程需包含3个gRPC, 但其部署形式不相同
  2. CSI功能实现后, 需选择对应的插件进行调用(外部才可使用)

如: CSI注册流程(注册成功后为每个节点创建个CSINode)

image

  1. kubelet通过fsnotify监听/var/lib/kubelet/plugins_registry插件目录
  2. node-driver-registrar配置节点的CSI运行环境
    • 根据参数获取CSI的Socket文件, 并调用GetPluginInfo方法获取CSI的插件信息
    • 插件目录下创建名为<CSIName>-reg.sock的Socket
  3. kubelet监听到插件目录下Socket文件创建, 完成CSI注册
    • 将监听到新建的Socket信息存储内存中的desiredStateOfWorld
    • Reconciler协程周期性完成CSI注册(周期性启动)
      • 每次启动对比actualStateOfWorlddesiredStateOfWorld以获取需处理的CSI
      • 调用需注册的node-driver-registrarGetInfo方法获取CSI元数据相关信息
      • 基于元数据信息调用CSI的NodeGetInfo方法获取节点相关信息
      • 根据获取信息通过API Server更新节点的Annotations
      • 成功更新节点信息后通过API Server创建/更新CSINode
      • 调用node-driver-registrarNotifyRegistrationStatus方法通知注册结果

// 注册完成后Reconciler协程同样周期性对比状态以获取需处理事件(向期望状态收敛)


CSI接口

IdentityServer: 提供插件信息(名称和功能等元数据)

  1. node-driver-registrar插件以DaemonSet形式部署在相同Pod内
// https://github1s.com/container-storage-interface/spec/blob/master/lib/go/csi/csi.pb.go#L6251-L6256

// IdentityServer
type IdentityServer interface {
    GetPluginInfo(context.Context, *GetPluginInfoRequest) (*GetPluginInfoResponse, error)
    GetPluginCapabilities(context.Context, *GetPluginCapabilitiesRequest)  (*GetPluginCapabilitiesResponse, error)
    Probe(context.Context, *ProbeRequest) (*ProbeResponse, error)
}

ControllerServer: 卷的事件处理(集群级别)

  1. external-XXX插件以选举Deployment或副本数为1的StatefulSet形式部署在相同Pod内
  2. 属于有状态服务, 但与部署节点无关
// https://github1s.com/container-storage-interface/spec/blob/master/lib/go/csi/csi.pb.go#L6505-L6521

// ControllerServer CSI对应的Controller需实现的API
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)
    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)
    ControllerGetVolume(context.Context, *ControllerGetVolumeRequest) (*ControllerGetVolumeResponse, error)
    ControllerModifyVolume(context.Context, *ControllerModifyVolumeRequest) (*ControllerModifyVolumeResponse, error)
}

NodeServer: 节点存储功能

  1. node-driver-registrar插件以DaemonSet形式部署在相同Pod内
// https://github1s.com/container-storage-interface/spec/blob/master/lib/go/csi/csi.pb.go#L7165-L7175

// NodeServer 节点存储服务需实现的API
type NodeServer interface {
    NodeStageVolume(context.Context, *NodeStageVolumeRequest) (*NodeStageVolumeResponse, error)
    NodeUnstageVolume(context.Context, *NodeUnstageVolumeRequest) (*NodeUnstageVolumeResponse, error)
    NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error)
    NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error)
    NodeGetVolumeStats(context.Context, *NodeGetVolumeStatsRequest) (*NodeGetVolumeStatsResponse, error)
    NodeExpandVolume(context.Context, *NodeExpandVolumeRequest) (*NodeExpandVolumeResponse, error)
    NodeGetCapabilities(context.Context, *NodeGetCapabilitiesRequest) (*NodeGetCapabilitiesResponse, error)
    NodeGetInfo(context.Context, *NodeGetInfoRequest) (*NodeGetInfoResponse, error)
}

CSI插件

Kubernetes社区维护的常用插件

插件说明
node-driver-registrar注册CSI
external-provisioner调用CSI实现Dynamic Provisioner
external-attacher调用CSI实现Attach/Detach
external-snapshotter调用CSI实现快照
external-resizer调用CSI实现扩容
external-health-monitor卷的健康检查
  1. 插件均以SideCar形式与CSI部署在相同Pod内
  2. node-driver-registrar是必需组件, 其他扩展插件可视功能需求选择
  3. 扩展插件通过调用CSI实现功能时, 均是调用CSI中的ControllerServer


http://www.kler.cn/a/154972.html

相关文章:

  • Unity教程(十八)战斗系统 攻击逻辑
  • Spark RDD中常用聚合算子源码层面的对比分析
  • AutoHotKey自动热键AHK-正则表达式
  • debian 系统更新升级
  • 微信小程序——01开发前的准备和开发工具
  • Java集合框架之Collection集合遍历
  • 时序预测 | Python实现LSTM长短期记忆神经网络时间序列预测(多图,多指标)
  • C#基础学习--命名空间和程序集
  • C语言之实现贪吃蛇小游戏篇(2)
  • Flink(九)【时间语义与水位线】
  • 开源播放器GSYVideoPlayer + ViewPager2 源码解析
  • 12.1 二叉树简单题
  • Redis--12--Redis分布式锁的实现
  • 【双指针】283. 移动零
  • 内网穿透工具获取一个公网ip
  • 提高wordpress网站收录速度,设置wp后台的“更新服务”功能
  • 【经验总结】网络关闭但ECU没有休眠前如何网络唤醒
  • Java 使用zxing生成二维码
  • Mybatis实用教程之XML实现动态sql
  • springboot教师进修培训管理系统设计与实现java+jsp
  • PX4 Bug汇总
  • 【Python百练——第3练】矩形类及操作
  • 创建内存泄漏(js的问题)
  • 深入Os--静态链接
  • RabbitMQ 笔记
  • C#拼夕夕自动化登录,电商网页自动化操作。WebView2