k8s篇-存储插件(flexvolume与CSI)

什么是存储插件:

容器一旦被删除,在运行时容器内部产生的所有文件数据,也会随同容器销毁而一起被清理掉,所以提供了volume方式将容器产生的临时数据持久化保存下来。

在k8s中,可通过pod.spec.volumes属性,查看默认支持的各种类型的Volume:本地存储(emptyDir / hostPath)、网络存储(如NFS)等。

k8s还提供了插件机制,允许其他类型的外部存储服务以插件方式,接入到Kubernetes系统中来。

有两种接入方式:In-Tree(在k8s源码内部实现,随k8s一起发布,更新慢不灵活) 和 Out-Of-Tree(独立于k8s,目前主要有CSI和FlexVolume两种,CSI为主流)。

存储插件的功能,最终是为应用创建出对应的volume使用。

FlexVolume插件

Flexvolume方式:需要先在每个节点上,安装存储插件的执行脚本(或可执行文件),此脚本需要实现flexvolume的相关存储接口。

当运行一个POD应用,要执行mount动作时,k8s通过kubelet调用VolumePlugin,然后直接执行插件脚本来完成的,这个插件脚本可以是shell,也可以是二进制文件,只要实现了相关的存储接口功能就行。

插件执行脚本的默认存放路径为:/usr/libexec/kubernetes/kubelet-plugins/volume/exec/<vendor~driver>/<driver>

路径中vendor~driver名称,与Pod中flexVolume.driver字段值要匹配,如foo~cifs/cifs,对应pod的driver名称就是foo/cifs。

存储接口包括:

init: 初始化存储插件时调用
attach: 将存储卷挂载到Node节点上
detach: 将存储卷从Node上卸载
waitforattach: 等待attach操作成功
isattached: 检查存储卷是否已经挂载
mountdevice: 将设备挂载到指定目录中
unmountdevice: 将设备取消挂载
mount: 将存储卷挂载到指定目录中
unmount: 将存储卷取消挂载

类似NFS存储服务,无需实现 attach/detach 这些接口,只需要实现 init/mount/umount 这三个接口即可。

执行脚本中,实现这些接口,需要返回如下json数据:

{
    "status": "<Success/Failure/Not supported>",
    "message": "<Reason for success/failure>",
    "device": "<Path to the device attached. This field is valid only for attach & waitforattach call-outs>"
    "volumeName": "<Cluster wide unique name of the volume. Valid only for getvolumename call-out>"
    "attached": <True/False (Return true if volume is attached on the node. Valid only for isattached call-out)>
    "capabilities": <Only included as part of the Init response>
    {
        "attach": <True/False (

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值