CSI 从1.9 开始引入用于在K8S和外部存储系统之间建立一套标准接口. 在1.13 GA
CSI 产生的背景是将存储提供方与K8S 代码解耦.
CSI 组件与容器化部署架构
CSI Controller
CSI Controller 的主要功能是对存储资源和存储卷进行管理操作.K8S 中建议部署为单实例pod 可以使用statefulset 或deployment 进行部署, 在controller pod中有两个容器
- 与kube-controller-manager 通信的sidecar 容器, 在 sidecar 容器内, 又可以包含 external-provisioner 和 external-attacher 两个容器
- external-attacher 容器监控 VolumeAttachment 资源对象的变更, 触发针对 CSI 端点的 ControllerPublish 和 ControllerUnpublish 操作
- external-provisioner 容器监控 PersistentVolumeClaim 资源对象的变更, 触发对 CSI 端点的 CreateVolume 和 DeleteVolume操作
- CSI Driver 存储驱动容器, 由第三方存储供应商提供, 需要实现上述接口
CSI NODE
CSI Node 的主要功能是对node 上的Volume进行管理和操作, 在K8S 中建议部署为DeamonSet. 在这个POD 中有一下两个容器
- sidecar 容器 Node-driver-registrar, 主要作用是将存储驱动注册到kubelet中
- 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
- 在APISERVER的启动参数中指定
--enable-admission-plugins=...,DefaultStorageClass
- 然后在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
如果觉得文章有帮助, 请点一下喜欢