Kubernetes 和 Trident 对象
您可以通过读取和写入资源对象来使用 REST API 与 Kubernetes 和 Trident 进行交互。Kubernetes 与 Trident , Trident 与存储以及 Kubernetes 与存储之间的关系由多个资源对象决定。其中一些对象通过 Kubernetes 进行管理,而另一些对象则通过 Trident 进行管理。
对象如何相互交互?
了解对象,对象的用途以及对象交互方式的最简单方法可能是,遵循 Kubernetes 用户的单个存储请求:
-
用户创建
PersistentVolumeClaim
请求新的PersistentVolume
的大小StorageClass
之前由管理员配置的。 -
Kubernetes
StorageClass
将Trident标识为其配置程序、并包含一些参数、用于指示Trident如何为请求的类配置卷。 -
Trident独立查看
StorageClass
名称相同、用于标识匹配项Backends
和StoragePools
可用于为类配置卷。 -
Trident在匹配的后端配置存储并创建两个对象:A
PersistentVolume
在Kubernetes中、此命令告诉Kubernetes如何查找、挂载和处理卷、以及在Trident中保留两个卷之间关系的卷PersistentVolume
和实际存储。 -
Kubernetes绑定
PersistentVolumeClaim
到新的PersistentVolume
。包含的PodPersistentVolumeClaim
将此PersistentVolume挂载到其运行所在的任何主机上。 -
用户创建
VolumeSnapshot
现有PVC、使用VolumeSnapshotClass
这就是Trident。 -
Trident 标识与 PVC 关联的卷,并在其后端创建卷的快照。它还会创建
VolumeSnapshotContent
这将指示Kubernetes如何识别快照。 -
用户可以创建
PersistentVolumeClaim
使用VolumeSnapshot
作为源。 -
Trident可确定所需的快照、并执行与创建相同的一组步骤
PersistentVolume
和 AVolume
。
要进一步了解 Kubernetes 对象,强烈建议您阅读 "永久性卷" Kubernetes 文档的一节。 |
Kubernetes PersistentVolumeClaim
对象
一个Kubernetes PersistentVolumeClaim
对象是Kubernetes集群用户发出的存储请求。
除了标准规范之外,如果用户要覆盖在后端配置中设置的默认值, Trident 还允许用户指定以下特定于卷的标注:
标注 | 卷选项 | 支持的驱动程序 |
---|---|---|
trident.netapp.io/fileSystem |
文件系统 |
ontap-san , solidfire-san , E 系列 -iscsi , ontap-san-economy. |
trident.netapp.io/cloneFromPVC |
cloneSourceVolume |
ontap-nas , ontap-san , solidfire-san , AWS-CVS , azure-netapp-files , GCP-CVS , ontap-san-economy. |
trident.netapp.io/splitOnClone |
splitOnClone |
ontap-NAS , ontap-san |
trident.netapp.io/protocol |
协议 |
任意 |
trident.netapp.io/exportPolicy |
导出策略 |
ontap-nas , ontap-nas-economy-、 ontap-nas-flexgroup |
trident.netapp.io/snapshotPolicy |
snapshotPolicy |
ontap-nas , ontap-nas-economy. ontap-nas-flexgroup , ontap-san |
trident.netapp.io/snapshotReserve |
SnapshotReserve |
ontap-nas , ontap-nas-flexgroup , ontap-san , AWS-CVS , GCP-CVS |
trident.netapp.io/snapshotDirectory |
snapshotDirectory |
ontap-nas , ontap-nas-economy-、 ontap-nas-flexgroup |
trident.netapp.io/unixPermissions |
unixPermissions |
ontap-nas , ontap-nas-economy-、 ontap-nas-flexgroup |
trident.netapp.io/blockSize |
块大小 |
solidfire-san |
如果创建的PV具有 Delete
reclaiming policy、Trident会在PV释放时(即用户删除PVC时)同时删除PV和后备卷。如果删除操作失败, Trident 会将 PV 标记为相应的 PV ,并定期重试此操作,直到操作成功或 PV 手动删除为止。PV使用时 Retain
策略中、Trident会忽略该策略、并假定管理员将从Kubernetes和后端清理该卷、以便在删除卷之前对其进行备份或检查。请注意,删除 PV 不会通过发生原因 Trident 删除后备卷。您应使用REST API将其删除 (tridentctl
)。
Trident 支持使用 CSI 规范创建卷快照:您可以创建卷快照并将其用作数据源来克隆现有 PVC 。这样, PV 的时间点副本就可以以快照的形式公开给 Kubernetes 。然后,可以使用快照创建新的 PV 。请查看 On-Demand Volume Snapshots
以了解其工作原理。
Trident还提供 cloneFromPVC
和 splitOnClone
用于创建克隆的标注。您可以使用这些标注克隆 PVC ,而无需使用 CSI 实施(在 Kubernetes 1.13 及更早版本上),或者您的 Kubernetes 版本不支持测试版卷快照( Kubernetes 1.16 及更早版本)。请注意, Trident 19.10 支持从 PVC 克隆的 CSI 工作流。
您可以使用 cloneFromPVC 和 splitOnClone 使用CSI Trident以及传统非CSI前端的标注。
|
以下是一个示例:如果用户已有一个名为的PVC mysql
、用户可以创建一个名为的新PVC mysqlclone
使用标注、例如 trident.netapp.io/cloneFromPVC: mysql
。设置了此标注后, Trident 将克隆与 mysql PVC 对应的卷,而不是从头开始配置卷。
请考虑以下几点:
-
建议克隆空闲卷。
-
一个 PVC 及其克隆应位于同一个 Kubernetes 命名空间中,并具有相同的存储类。
-
使用
ontap-nas
和ontap-san
驱动程序、可能需要设置PVC标注trident.netapp.io/splitOnClone
与结合使用trident.netapp.io/cloneFromPVC
。使用trident.netapp.io/splitOnClone
设置为true
、Trident会将克隆的卷与父卷拆分、从而将克隆的卷与其父卷的生命周期完全分离、从而降低了存储效率。未设置trident.netapp.io/splitOnClone
或将其设置为false
这样可以减少后端的空间消耗、而不会在父卷和克隆卷之间创建依赖关系、因此除非先删除克隆、否则无法删除父卷。拆分克隆是有意义的一种情形,即克隆空数据库卷时,该卷及其克隆会发生很大的差异,无法从 ONTAP 提供的存储效率中受益。
。 sample-input
目录包含用于Trident的PVC定义示例。有关与 Trident 卷关联的参数和设置的完整问题描述,请参见 Trident 卷对象。
Kubernetes PersistentVolume
对象
一个Kubernetes PersistentVolume
对象表示可供Kubernetes集群使用的一段存储。它的生命周期与使用它的 POD 无关。
Trident创建 PersistentVolume 根据Kubernetes集群所配置的卷、自动将这些对象注册到Kubernetes集群中。您不应自行管理它们。
|
创建引用基于Trident的PVC时 StorageClass
、Trident会使用相应的存储类配置一个新卷、并为该卷注册一个新的PV。在配置已配置的卷和相应的 PV 时, Trident 会遵循以下规则:
-
Trident 会为 Kubernetes 生成 PV 名称及其用于配置存储的内部名称。在这两种情况下,它都可以确保名称在其范围内是唯一的。
-
卷的大小与 PVC 中请求的大小尽可能匹配,但可能会根据平台将其取整为最接近的可分配数量。
Kubernetes StorageClass
对象
Kubernetes StorageClass
对象在中按名称指定 PersistentVolumeClaims
使用一组属性配置存储。存储类本身可标识要使用的配置程序,并按配置程序所了解的术语定义该属性集。
它是需要由管理员创建和管理的两个基本对象之一。另一个是 Trident 后端对象。
一个Kubernetes StorageClass
使用Trident的对象如下所示:
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: <Name>
provisioner: csi.trident.netapp.io
mountOptions: <Mount Options>
parameters:
<Trident Parameters>
这些参数是 Trident 专用的,可告诉 Trident 如何为类配置卷。
存储类参数包括:
属性 | Type | Required | Description |
---|---|---|---|
属性 |
map[string]string |
否 |
请参见下面的属性部分 |
存储池 |
map[string]StringList |
否 |
后端名称映射到中的存储池列表 |
附加 StoragePools |
map[string]StringList |
否 |
后端名称映射到中的存储池列表 |
排除 StoragePools |
map[string]StringList |
否 |
后端名称映射到中的存储池列表 |
存储属性及其可能值可以分类为存储池选择属性和 Kubernetes 属性。
存储池选择属性
这些参数决定了应使用哪些 Trident 管理的存储池来配置给定类型的卷。
属性 | Type | 值 | 优惠 | 请求 | 支持 |
---|---|---|---|---|---|
介质1 |
string |
HDD ,混合, SSD |
Pool 包含此类型的介质;混合表示两者 |
指定的介质类型 |
ontap-nas , ontap-nas-economy. ontap-nas-flexgroup , ontap-san , solidfire-san |
配置类型 |
string |
精简,厚 |
Pool 支持此配置方法 |
指定的配置方法 |
厚:全 ONTAP 和 E 系列 iSCSI ;精简:全 ONTAP 和 solidfire-san |
后端类型 |
string |
ontap-nas , ontap-nas-economy. ontap-nas-flexgroup , ontap-san , solidfire-san , E 系列 iSCSI , AWS-CVS , GCP-CVS , azure-netapp-files , ontap-san-economy. |
池属于此类型的后端 |
指定后端 |
所有驱动程序 |
snapshots |
池 |
true false |
Pool 支持具有快照的卷 |
启用了快照的卷 |
ontap-NAS , ontap-san , solidfire-san , AWS-CVS , GCP-CVS |
克隆 |
池 |
true false |
Pool 支持克隆卷 |
启用了克隆的卷 |
ontap-NAS , ontap-san , solidfire-san , AWS-CVS , GCP-CVS |
加密 |
池 |
true false |
池支持加密卷 |
已启用加密的卷 |
ontap-nas , ontap-nas-economy-、 ontap-nas-flexgroups , ontap-san |
IOPS |
内部 |
正整数 |
Pool 能够保证此范围内的 IOPS |
卷保证这些 IOPS |
solidfire-san |
1 : ONTAP Select 系统不支持
在大多数情况下,请求的值直接影响配置;例如,请求厚配置会导致卷配置较厚。但是, Element 存储池会使用其提供的 IOPS 最小值和最大值来设置 QoS 值,而不是请求的值。在这种情况下,请求的值仅用于选择存储池。
理想情况下、您可以使用 attributes
您需要单独为满足特定类需求所需的存储质量建模。Trident会自动发现并选择与的_all_匹配的存储池 attributes
您指定的。
如果您发现自己无法使用 attributes
要自动为某个类选择合适的池、您可以使用 storagePools
和 additionalStoragePools
用于进一步细化池甚至选择一组特定池的参数。
您可以使用 storagePools
参数以进一步限制与指定的任何池匹配的池集 attributes
。换言之、Trident使用由标识的池的交叉点 attributes
和 storagePools
用于配置的参数。您可以单独使用参数,也可以同时使用这两者。
您可以使用 additionalStoragePools
参数以扩展Trident用于配置的一组池、而不管选择的任何池如何 attributes
和 storagePools
parameters
您可以使用 excludeStoragePools
用于筛选Trident用于配置的一组池的参数。使用此参数将删除任何匹配的池。
在中 storagePools
和 additionalStoragePools
参数、每个条目采用的形式 <backend>:<storagePoolList>
、其中 <storagePoolList>
是指定后端的存储池列表、以英文逗号分隔。例如、的值 additionalStoragePools
可能如下所示 ontapnas_192.168.1.100:aggr1,aggr2;solidfire_192.168.1.101:bronze
。这些列表接受后端值和列表值的正则表达式值。您可以使用 tridentctl get backend
以获取后端及其池的列表。
Kubernetes 属性
这些属性不会影响 Trident 在动态配置期间选择的存储池 / 后端。相反,这些属性仅提供 Kubernetes 永久性卷支持的参数。工作节点负责文件系统创建操作,并且可能需要文件系统实用程序,例如 xfsprogs 。
属性 | Type | 值 | Description | 相关驱动程序 | Kubernetes 版本 |
---|---|---|---|---|---|
FSType |
string |
ext4 , ext3 , xfs 等 |
块卷的文件系统类型 |
solidfire-san , ontap-san , ontap-san-economy. |
全部 |
Trident安装程序包提供了几个示例存储类定义、用于中的Trident sample-input/storage-class-*.yaml
。删除 Kubernetes 存储类也会删除相应的 Trident 存储类。
Kubernetes VolumeSnapshotClass
对象
Kubernetes VolumeSnapshotClass
对象类似于 StorageClasses
。它们有助于定义多个存储类,并由卷快照引用以将快照与所需的快照类关联。每个卷快照都与一个卷快照类相关联。
答 VolumeSnapshotClass
要创建快照、应由管理员定义。此时将使用以下定义创建卷快照类:
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
name: csi-snapclass
driver: csi.trident.netapp.io
deletionPolicy: Delete
。 driver
指定请求的卷快照的Kubernetes csi-snapclass
类由Trident处理。。 deletionPolicy
指定必须删除快照时要执行的操作。时间 deletionPolicy
设置为 Delete
、卷快照对象以及存储集群上的底层快照会在删除快照时被删除。或者、也可以将其设置为 Retain
这意味着 VolumeSnapshotContent
并保留物理快照。
Kubernetes VolumeSnapshot
对象
一个Kubernetes VolumeSnapshot
对象是创建卷快照的请求。就像 PVC 代表用户对卷发出的请求一样,卷快照也是用户为现有 PVC 创建快照的请求。
收到卷快照请求后、Trident会自动管理在后端为卷创建快照的操作、并通过创建唯一快照来公开快照
VolumeSnapshotContent
对象。您可以从现有 PVC 创建快照,并在创建新 PVC 时将这些快照用作 DataSource 。
VolumeSnapshot 的生命周期与源 PVC 无关:即使删除了源 PVC ,快照也会持续存在。删除具有关联快照的 PVC 时, Trident 会将此 PVC 的后备卷标记为 " 正在删除 " 状态,但不会将其完全删除。删除所有关联快照后,卷将被删除。 |
Kubernetes VolumeSnapshotContent
对象
一个Kubernetes VolumeSnapshotContent
对象表示从已配置的卷创建的快照。它类似于 PersistentVolume
和表示存储集群上配置的快照。类似于 PersistentVolumeClaim
和 PersistentVolume
对象、创建快照时、 VolumeSnapshotContent
对象保持与的一对一映射 VolumeSnapshot
对象、该对象已请求创建快照。
Trident创建 VolumeSnapshotContent 根据Kubernetes集群所配置的卷、自动将这些对象注册到Kubernetes集群中。您不应自行管理它们。
|
。 VolumeSnapshotContent
对象包含用于唯一标识快照的详细信息、例如 snapshotHandle
。这 snapshotHandle
是PV名称和名称的唯一组合 VolumeSnapshotContent
对象。
收到快照请求后, Trident 会在后端创建快照。创建快照后、Trident会配置 VolumeSnapshotContent
对象、从而将快照公开到Kubernetes API。
Kubernetes CustomResourceDefinition
对象
Kubernetes 自定义资源是 Kubernetes API 中的端点,由管理员定义并用于对类似对象进行分组。Kubernetes 支持创建自定义资源以存储对象集合。您可以通过运行来获取这些资源定义 kubectl get crds
。
自定义资源定义( CRD )及其关联的对象元数据由 Kubernetes 存储在其元数据存储中。这样就无需为 Trident 创建单独的存储。
从19.07版开始、Trident会使用多个 CustomResourceDefinition
用于保留Trident对象身份的对象、例如Trident后端、Trident存储类和Trident卷。这些对象由 Trident 管理。此外, CSI 卷快照框架还引入了一些定义卷快照所需的 CRD 。
CRD 是一种 Kubernetes 构造。上述资源的对象由 Trident 创建。例如、使用创建后端时 tridentctl
、对应的 tridentbackends
创建CRD对象供Kubernetes使用。
有关 Trident 的 CRD ,请注意以下几点:
-
安装 Trident 时,系统会创建一组 CRD ,并可像使用任何其他资源类型一样使用。
-
从先前版本的Trident (使用的版本)升级时
etcd
为了保持状态)、Trident安装程序会从迁移数据etcd
键值数据存储并创建相应的CRD对象。 -
使用卸载Trident时
tridentctl uninstall
命令中、Trident Pod会被删除、但创建的CRD不会被清理。请参见 "卸载 Trident" 了解如何从头开始完全删除和重新配置 Trident 。
Trident StorageClass
对象
Trident会为Kubernetes创建匹配的存储类 StorageClass
指定的对象 csi.trident.netapp.io
/netapp.io/trident
在其配置程序字段中。存储类名称与Kubernetes的名称匹配 StorageClass
它所代表的对象。
使用Kubernetes时、这些对象会在Kubernetes时自动创建 StorageClass 使用Trident作为配置程序进行注册。
|
存储类包含一组卷要求。Trident 会将这些要求与每个存储池中的属性进行匹配;如果匹配,则该存储池是使用该存储类配置卷的有效目标。
您可以使用 REST API 创建存储类配置以直接定义存储类。但是、对于Kubernetes部署、我们希望在注册新Kubernetes时创建这些部署 StorageClass
对象。
Trident 后端对象
后端表示存储提供程序,其中 Trident 配置卷;单个 Trident 实例可以管理任意数量的后端。
这是您自己创建和管理的两种对象类型之一。另一个是Kubernetes StorageClass 对象。
|
有关如何构建这些对象的详细信息,请参见后端配置。
Trident StoragePool
对象
存储池表示可在每个后端配置的不同位置。对于 ONTAP ,这些聚合对应于 SVM 中的聚合。对于 NetApp HCI/SolidFire ,这些 QoS 分段对应于管理员指定的 QoS 分段。对于 Cloud Volumes Service ,这些区域对应于云提供商区域。每个存储池都有一组不同的存储属性,用于定义其性能特征和数据保护特征。
与此处的其他对象不同,存储池候选对象始终会自动发现和管理。
Trident Volume
对象
卷是基本配置单元,由后端端点组成,例如 NFS 共享和 iSCSI LUN 。在Kubernetes中、这些关系直接对应于 PersistentVolumes
。创建卷时,请确保其具有存储类,此类可确定可配置该卷的位置以及大小。
在 Kubernetes 中,这些对象会自动进行管理。您可以查看它们以查看 Trident 配置的内容。 |
删除具有关联快照的 PV 时,相应的 Trident 卷将更新为 * 正在删除 * 状态。要删除 Trident 卷,您应删除该卷的快照。 |
卷配置定义了配置的卷应具有的属性。
属性 | Type | Required | Description |
---|---|---|---|
version |
string |
否 |
Trident API 版本( "1" ) |
name |
string |
是的。 |
要创建的卷的名称 |
存储类 |
string |
是的。 |
配置卷时要使用的存储类 |
size |
string |
是的。 |
要配置的卷大小(以字节为单位) |
协议 |
string |
否 |
要使用的协议类型; "file" 或 "block" |
内部名称 |
string |
否 |
存储系统上的对象名称;由 Trident 生成 |
cloneSourceVolume |
string |
否 |
ONTAP ( NAS , SAN ) & SolidFire AWS-* 和 AWS-CVS* :要从中克隆的卷的名称 |
splitOnClone |
string |
否 |
ONTAP ( NAS , SAN ):将克隆从其父级拆分 |
snapshotPolicy |
string |
否 |
Snapshot-* :要使用的 ONTAP 策略 |
SnapshotReserve |
string |
否 |
Snapshot-* :为快照预留的卷百分比 ONTAP |
导出策略 |
string |
否 |
ontap-nas* :要使用的导出策略 |
snapshotDirectory |
池 |
否 |
ontap-nas* :是否显示快照目录 |
unixPermissions |
string |
否 |
ontap-nas* :初始 UNIX 权限 |
块大小 |
string |
否 |
SolidFire — * :块 / 扇区大小 |
文件系统 |
string |
否 |
文件系统类型 |
生成Trident internalName
创建卷时。这包括两个步骤。首先、它会预先添加存储前缀(默认值 trident
或后端配置中的前缀)添加到卷名称、从而生成表单的名称 <prefix>-<volume-name>
。然后,它将继续清理名称,替换后端不允许使用的字符。对于ONTAP 后端、它会将连字符替换为下划线(因此、内部名称将变为 <prefix>_<volume-name>
)。对于 Element 后端,它会将下划线替换为连字符。对于对所有对象名称施加 30 个字符限制的 E 系列, Trident 会为每个卷的内部名称生成随机字符串。对于对唯一卷创建令牌实施 16 到 36 个字符限制的 CVS ( AWS ), Trident 会为每个卷的内部名称生成一个随机字符串。
您可以使用卷配置使用REST API直接配置卷、但在Kubernetes部署中、我们希望大多数用户都使用标准Kubernetes PersistentVolumeClaim
方法Trident 会在配置过程中自动创建此卷对象。
Trident Snapshot
对象
快照是卷的时间点副本,可用于配置新卷或还原状态。在Kubernetes中、这些关系直接对应于 VolumeSnapshotContent
对象。每个快照都与一个卷相关联,该卷是快照的数据源。
每个 Snapshot
对象包括以下属性:
属性 | Type | Required | Description |
---|---|---|---|
version |
string |
是的。 |
Trident API 版本( "1" ) |
name |
string |
是的。 |
Trident Snapshot 对象的名称 |
内部名称 |
string |
是的。 |
存储系统上 Trident Snapshot 对象的名称 |
volumeName |
string |
是的。 |
为其创建快照的永久性卷的名称 |
volumeInternalName |
string |
是的。 |
存储系统上关联的 Trident 卷对象的名称 |
在 Kubernetes 中,这些对象会自动进行管理。您可以查看它们以查看 Trident 配置的内容。 |
当Kubernetes时 VolumeSnapshot
对象请求已创建、Trident可通过在备用存储系统上创建快照对象来工作。。 internalName
的快照对象是通过合并前缀来生成的 snapshot-
使用 UID
的 VolumeSnapshot
对象(例如、 snapshot-e8d8a0ca-9826-11e9-9807-525400f3f660
)。 volumeName
和 volumeInternalName
通过获取后备卷的详细信息来填充。