第 5 章 使用 Container Storage Interface (CSI)
5.1. 配置 CSI 卷
容器存储接口(CSI)允许 Red Hat OpenShift Service on AWS 使用支持 CSI 接口的存储后端 提供的持久性存储。
Red Hat OpenShift Service on AWS 4 支持 CSI 规格版本 1.6.0。
5.1.1. CSI 架构
CSI 驱动程序通常由容器镜像提供。这些容器不知道其运行的 AWS 上的 Red Hat OpenShift Service。要在 Red Hat OpenShift Service on AWS 中使用与 CSI 兼容的存储后端,集群管理员必须部署几个组件,作为 Red Hat OpenShift Service on AWS 和存储驱动程序间的桥接。
下图显示了在 Red Hat OpenShift Service on AWS 集群中在 pod 中运行的组件的高级概述。
对于不同的存储后端,可以运行多个 CSI 驱动程序。每个驱动程序需要其自身的外部控制器部署,以及带驱动程序和 CSI 注册器的守护进程集。
5.1.1.1. 外部 CSI 控制器
外部 CSI 控制器是一个部署,它部署带有五个容器的一个或多个 pod:
-
snapshotter 容器监视
VolumeSnapshot
和VolumeSnapshotContent
对象,并负责创建和删除VolumeSnapshotContent
对象。 -
resizer 容器是一个 sidecar 容器,它会在 PersistentVolumeClaim 对象中监视
PersistentVolumeClaim
更新,并在对PersistentVolumeClaim
对象请求更多存储时针对 CSI 端点触发ControllerExpandVolume
操作。 -
外部 CSI attacher 容器将来自 Red Hat OpenShift Service on AWS 的
attach
和detach
调用转换为相应的 CSI 驱动程序的ControllerPublish
和ControllerUnpublish
调用。 -
一个外部 CSI 置备程序容器,它可将 Red Hat OpenShift Service on AWS 的
provision
和delete
调用转换为相应的 CSI 驱动程序的CreateVolume
和DeleteVolume
调用。 - 一个 CSI 驱动程序容器。
CSI attacher 和 CSI provisioner 容器使用 UNIX 域套接字与 CSI 驱动程序容器进行交互,确保没有 CSI 通讯会离开 pod。从 pod 以外无法访问 CSI 驱动程序。
attach
、detach
、provision
和删除操作
通常需要 CSI 驱动程序在存储后端中使用凭证。在 infrastructure 节点上运行 CSI controller pod,因此即使在一个计算节点上发生严重的安全破坏时,凭据也不会暴露给用户进程。
当不支持第三方的 attach
或 detach
操作时,还需要为 CSI 驱动程序运行外部的附加器。外部附加器不会向 CSI 驱动程序发出任何 ControllerPublish
或 ControllerUnpublish
操作。但是,它仍然必须运行才能实现所需的 Red Hat OpenShift Service on AWS attachment API。
5.1.1.2. CSI 驱动程序守护进程集
CSI 驱动程序守护进程集在每个节点上运行一个 pod,它允许 Red Hat OpenShift Service on AWS 挂载 CSI 驱动程序提供的存储,并使用它作为持久性卷(PV)。安装了 CSI 驱动程序的 pod 包含以下容器:
-
一个 CSI 驱动程序注册器,它会在节点上运行的
openshift-node
服务中注册 CSI 驱动程序。在节点上运行的openshift-node
进程然后使用节点上可用的 UNIX 域套接字直接连接到 CSI 驱动程序。 - 一个 CSI 驱动程序。
在节点上部署的 CSI 驱动程序应该在存储后端中拥有尽量少的凭证。Red Hat OpenShift Service on AWS 只使用节点插件的 CSI 调用集合,如 NodePublish
/NodeUnpublish
和 NodeStage
/NodeUnstage
(如果这些调用已被实现)。
5.1.2. Red Hat OpenShift Service on AWS 支持的 CSI 驱动程序
Red Hat OpenShift Service on AWS 默认安装某些 CSI 驱动程序,为用户提供树状卷插件无法进行的存储选项。
要创建挂载到这些支持的存储资产中的 CSI 置备持久性卷,Red Hat OpenShift Service on AWS 默认安装必要的 CSI 驱动程序 Operator、CSI 驱动程序和所需的存储类。如需有关 Operator 和驱动程序的默认命名空间的更多信息,请参阅特定 CSI Driver Operator 的文档。
下表描述了在 AWS 上安装 Red Hat OpenShift Service 的 CSI 驱动程序及其支持的 CSI 功能,如卷快照和调整大小。
除了下表中列出的驱动程序外,ROSA 还提供第三方存储供应商提供的 CSI 驱动程序功能。红帽不会监督第三方置备程序或连接的 CSI 驱动程序,供应商完全控制源代码、部署、操作和 Kubernetes 兼容性。这些卷置备程序被视为客户管理,相应的供应商负责提供支持。如需更多信息,请参阅 AWS 上的 Red Hat OpenShift Service 的共享职责。
CSI 驱动程序 | CSI 卷快照 | CSI 克隆 | CSI 调整大小 | 内联临时卷 |
---|---|---|---|---|
AWS EBS |
✅ |
|
✅ |
|
AWS EFS |
|
|
|
|
LVM 存储 |
✅ |
✅ |
✅ |
|
5.1.3. 动态置备
动态置备持久性存储取决于 CSI 驱动程序和底层存储后端的功能。CSI 驱动程序的供应商应该记录如何在 Red Hat OpenShift Service on AWS 中创建存储类以及进行配置的参数。
创建的存储类可以被配置为启用动态置备。
流程
创建一个默认存储类,以保证所有不需要特殊存储类的 PVC 由安装的 CSI 驱动程序来置备。
# oc create -f - << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage-class> 1 annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: <provisioner-name> 2 parameters: EOF
5.1.4. 使用 CSI 驱动程序示例
以下示例在没有对该模板进行任何修改的情况下安装了一个默认的 MySQL 模板,。
先决条件
- CSI 驱动程序已被部署。
- 为动态置备创建了存储类。
流程
创建 MySQL 模板:
# oc new-app mysql-persistent
输出示例
--> Deploying template "openshift/mysql-persistent" to project default ...
# oc get pvc
输出示例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql Bound kubernetes-dynamic-pv-3271ffcb4e1811e8 1Gi RWO cinder 3s