美文网首页
K8S 存储机制介绍

K8S 存储机制介绍

作者: 陈sir的知识图谱 | 来源:发表于2019-07-12 10:32 被阅读0次

    CSI 从1.9 开始引入用于在K8S和外部存储系统之间建立一套标准接口. 在1.13 GA

    CSI 产生的背景是将存储提供方与K8S 代码解耦.

    CSI 组件与容器化部署架构

    image.png

    CSI Controller

    CSI Controller 的主要功能是对存储资源和存储卷进行管理操作.K8S 中建议部署为单实例pod 可以使用statefulset 或deployment 进行部署, 在controller pod中有两个容器

    1. 与kube-controller-manager 通信的sidecar 容器, 在 sidecar 容器内, 又可以包含 external-provisioner 和 external-attacher 两个容器
      1. external-attacher 容器监控 VolumeAttachment 资源对象的变更, 触发针对 CSI 端点的 ControllerPublish 和 ControllerUnpublish 操作
      2. external-provisioner 容器监控 PersistentVolumeClaim 资源对象的变更, 触发对 CSI 端点的 CreateVolume 和 DeleteVolume操作
    2. CSI Driver 存储驱动容器, 由第三方存储供应商提供, 需要实现上述接口

    CSI NODE

    CSI Node 的主要功能是对node 上的Volume进行管理和操作, 在K8S 中建议部署为DeamonSet. 在这个POD 中有一下两个容器

    1. sidecar 容器 Node-driver-registrar, 主要作用是将存储驱动注册到kubelet中
    2. CSI Driver 存储驱动容器, 由第三方存储供应商提供, 主要接受 kubelet 调用, 需要实现一些列与 node 相关的 CSI 接口, 例如 NodePublishVolume (用于将 Volume 挂在到目标路径)和 NodeUnPublishVolume (用于从容器中卸载Volume)

    node-driver-registar 容器与 kubelet 通过 node 主机的一个 hostPath 目录下的unix socket 进行通信. CSI Driver 容器与 kubelet 通过node 主机的另一个 hostPath 目录下的Unix socket进行通信, 同事需要将 kubelet 的工作目录(默认为/var/lib/kubelet) 挂在给CSI driver 容器.

    CSI 存储插件使用示例

    • API Server 配置:
    --allow-privileged=true--feature-gates=CSIPersistentVolume=true,MountPropagation=true--runtime-config=storage.k8s.io/v1alpha1=true
    
    • Controller-manager 配置:
    --feature-gates=CSIPersistentVolume=true
    
    • Kubelet 配置:
    --allow-privileged=true--feature-gates=CSIPersistentVolume=true,MountPropagation=true
    

    部署文档 样例文档

    StorageClass

    Storageclass 作为存储资源的抽象定义, 其作用是屏蔽后端存储细节, 同事减轻管理员手工管理PV的工作. 实现动态资源供应.

    storageclass 的定义主要包括

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: standard
    provisioner: kubernetes.io/aws-ebs
    parameters:
      type: gp2
    reclaimPolicy: Retain
    mountOptions:
      - debug
    volumeBindingMode: Immediate
    
    • provisioner: 供应者 ,看作存储驱动

    目前支持的驱动列表如下

    olume Plugin Internal Provisioner Config Example
    AWSElasticBlockStore AWS EBS
    AzureFile Azure File
    AzureDisk Azure Disk
    CephFS - -
    Cinder OpenStack Cinder
    FC - -
    Flexvolume - -
    Flocker -
    GCEPersistentDisk GCE PD
    Glusterfs Glusterfs
    iSCSI - -
    Quobyte Quobyte
    NFS - -
    RBD Ceph RBD
    VsphereVolume vSphere
    PortworxVolume Portworx Volume
    ScaleIO ScaleIO
    StorageOS StorageOS
    Local - Local
    • parameters: 不同的provisioner 需要不同的的参数

    设置默认的StorageClass

    1. 在APISERVER的启动参数中指定
    --enable-admission-plugins=...,DefaultStorageClass
    
    1. 然后在SC 定义中添加annotation storageclass.kubernetes.io/is-default-class="true"
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: standard
      annotations:
        storageclass.kubernetes.io/is-default-class="true"
    provisioner: kubernetes.io/aws-ebs
    parameters:
      type: gp2
    reclaimPolicy: Retain
    mountOptions:
      - debug
    volumeBindingMode: Immediate
    

    如果觉得文章有帮助, 请点一下喜欢

    相关文章

      网友评论

          本文标题:K8S 存储机制介绍

          本文链接:https://www.haomeiwen.com/subject/zftekctx.html