Kubernetes CSI 存储
Kubernetes
CSI接口(Container Storage Interface,容器存储接口)是第三方存储供应商定制开发k8s存储插件规范,目的是通过可插拔的方式支持存储集成,达到解耦的目的。
介绍
常见术语:
- k8s 存储使用
- SP(Storage Provider) 存储供应商
- CO 容器编排
CSI 的 Cloud Providers 有两种类型:
in-tree类型,运行在 k8s 核心组件内部的存储插件out-of-tree类型,独立在 k8s 组件之外运行的存储插件(推荐)- 通过 gRPC 接口跟 k8s 组件交互
- SideCar
CSI 框架
Kubernetes 存储框架由三个部分组成:
- k8s Core:k8s 核心组件
- 控制面的 apiServer提供 PV、PVC 资源维护
- Node 节点 kubelet 负责容器卷的维护
- k8s External Component:支持 CSI 的扩展组件,一般以 sideCar 的方式提供与第三方存储商的组件组成一个 Pod
- External Component:第三方存储厂商开发,包括3个部分(CSI gRPC 接口):
CSI Identity负责身份认证,控制面和数据面CSI Controller负责 Volume 管理,控制面CSI Node负责 mount/umount volume、检查 volume 状态等功能,数据面
persistentVolumeReclaimPolicy 备份策略
存储类 reclaimPolicy 只支持两种类型:Delete 和 Retain
## 创建了一个存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
# 删除 PV 时,备份 PV 的内容
archiveOnDelete: "true"- PV 策略使用默认
persistentVolumeReclaimPolicy: Delete若开启archiveOnDelete: "true",当 Pod 的数量为 0 时,将自动备份存储到archived-<namespace>-<pv-name>,数量为 1 时,会新建 PV - 配置
persistentVolumeReclaimPolicy: Retain和如下 StorageClass
## 创建了一个存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
# 删除 PV 时,备份 PV 的内容
archiveOnDelete: "true"
# reclaimPolicy: [Delete|Retain]
reclaimPolicy: Retain此时,删除Pod、PVC,查看 PV 未被删掉,状态变为 Released 状态,重新创建 PVC 时会新建 PV,且没有之前的数据
- 指定 PV 创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: html
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-storage
volumeName: pvc-7e727b3e-7127-11ed-9197-dfc3096d2313
volumeMode: Filesystemk8s External Plugin
external-attacher:调用 CSI Controller 服务的ControllerPublishVolume和ControllerUnpublishVolume接口,将volume在 node 上的mount/umountexternal-provisioner:监听PVC对象,并调用CSI Controller服务的CreateVolume和DeleteVolume接口,在cloud provides中创建和删除volumeexternal-resizer:监听PVC对象,并调用CSI Controller服务的NodeExpandVolume接口,对volume扩容操作external-snapshotter:通过CreateSnapshotRequest调用CSI Controller服务的CreateSnapshot、DeleteSnapshot、ListSnapshots接口livenessprobe:健康检查node-driver-registrar:将外部 CSI 插件注册到Kubeletexternal-health-monitor-controller:调用CSI Controller服务的ListVolumes、ControllerGetVolume接口external-health-monitor-agent:调用CSI Controller服务的NodeGetVolumeStats接口
Pod Volume 的三个阶段
- Provision/Delete(创盘/删盘)
- Attach/Detach(挂接/摘除)
- Mount/Unmount(挂载/卸载)
常见的 CSI 实现
- https://github.com/kubernetes-csi/csi-driver-nfs
- https://github.com/ceph/ceph-csi
- https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver
- https://openebs.io/
- csi-s3 a Container Storage Interface (CSI) for S3 (or S3 compatible) storage
- This is still very experimental and should not be used in any production environment
扩展
- Fluid 是一个 Kubernetes 原生的分布式数据集编排和加速引擎
参考
最近更新
最新评论