K8S 存储机制介绍

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

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

CSI 组件与容器化部署架构

K8S 存储机制介绍_第1张图片
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 存储机制介绍)