简体中文版经机器翻译而成,仅供参考。如与英语版出现任何冲突,应以英语版为准。

Kubernetes 和 Trident 对象

贡献者

您可以通过读取和写入资源对象来使用 REST API 与 Kubernetes 和 Trident 进行交互。Kubernetes 与 Trident , Trident 与存储以及 Kubernetes 与存储之间的关系由多个资源对象决定。其中一些对象通过 Kubernetes 进行管理,而另一些对象则通过 Trident 进行管理。

对象如何相互交互?

了解对象,对象的用途以及对象交互方式的最简单方法可能是,遵循 Kubernetes 用户的单个存储请求:

  1. 用户创建 PersistentVolumeClaim 请求新的 PersistentVolume 的大小 StorageClass 之前由管理员配置的。

  2. Kubernetes StorageClass 将Trident标识为其配置程序、并包含一些参数、用于指示Trident如何为请求的类配置卷。

  3. Trident独立查看 StorageClass 名称相同、用于标识匹配项 BackendsStoragePools 可用于为类配置卷。

  4. Trident在匹配的后端配置存储并创建两个对象:A PersistentVolume 在Kubernetes中、此命令告诉Kubernetes如何查找、挂载和处理卷、以及在Trident中保留两个卷之间关系的卷 PersistentVolume 和实际存储。

  5. Kubernetes绑定 PersistentVolumeClaim 到新的 PersistentVolume。包含的Pod PersistentVolumeClaim 将此PersistentVolume挂载到其运行所在的任何主机上。

  6. 用户创建 VolumeSnapshot 现有PVC、使用 VolumeSnapshotClass 这就是Trident。

  7. Trident 标识与 PVC 关联的卷,并在其后端创建卷的快照。它还会创建 VolumeSnapshotContent 这将指示Kubernetes如何识别快照。

  8. 用户可以创建 PersistentVolumeClaim 使用 VolumeSnapshot 作为源。

  9. Trident可确定所需的快照、并执行与创建相同的一组步骤 PersistentVolume 和 A Volume

提示 要进一步了解 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 , 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 , 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还提供 cloneFromPVCsplitOnClone 用于创建克隆的标注。您可以使用这些标注克隆 PVC ,而无需使用 CSI 实施(在 Kubernetes 1.13 及更早版本上),或者您的 Kubernetes 版本不支持测试版卷快照( Kubernetes 1.16 及更早版本)。请注意, Trident 19.10 支持从 PVC 克隆的 CSI 工作流。

备注 您可以使用 cloneFromPVCsplitOnClone 使用CSI Trident以及传统非CSI前端的标注。

以下是一个示例:如果用户已有一个名为的PVC mysql、用户可以创建一个名为的新PVC mysqlclone 使用标注、例如 trident.netapp.io/cloneFromPVC: mysql。设置了此标注后, Trident 将克隆与 mysql PVC 对应的卷,而不是从头开始配置卷。

请考虑以下几点:

  • 建议克隆空闲卷。

  • 一个 PVC 及其克隆应位于同一个 Kubernetes 命名空间中,并具有相同的存储类。

  • 使用 ontap-nasontap-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>
allowVolumeExpansion: true
volumeBindingMode: Immediate

这些参数是 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 , GCP-CVS , azure-netapp-files , ontap-san-economy.

池属于此类型的后端

指定后端

所有驱动程序

snapshots

true false

Pool 支持具有快照的卷

启用了快照的卷

ontap-nas , ontap-san , solidfire-san , gcp-cvs

克隆

true false

Pool 支持克隆卷

启用了克隆的卷

ontap-nas , ontap-san , solidfire-san , 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 要自动为某个类选择合适的池、您可以使用 storagePoolsadditionalStoragePools 用于进一步细化池甚至选择一组特定池的参数。

您可以使用 storagePools 参数以进一步限制与指定的任何池匹配的池集 attributes。换言之、Trident使用由标识的池的交叉点 attributesstoragePools 用于配置的参数。您可以单独使用参数,也可以同时使用这两者。

您可以使用 additionalStoragePools 参数以扩展Trident用于配置的一组池、而不管选择的任何池如何 attributesstoragePools parameters

您可以使用 excludeStoragePools 用于筛选Trident用于配置的一组池的参数。使用此参数将删除任何匹配的池。

在中 storagePoolsadditionalStoragePools 参数、每个条目采用的形式 <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-nas , ontap-nas-economy. ontap-nas-flexgroup , ontap-san , ontap-san-economy-、 E 系列 -iscsi

全部

允许卷扩展

boolean

true false

启用或禁用对增加 PVC 大小的支持

ontap-nas , ontap-nas-economy. ontap-nas-flexgroup , ontap-san , ontap-san-economy. solidfire-san , gcp-cvs , azure-netapp-files

1.11 及更高版本

卷绑定模式

string

即时, WaitForFirstConsumer"

选择何时进行卷绑定和动态配置

全部

1.19 - 1.24

提示
  • fsType 参数用于控制SAN LUN所需的文件系统类型。此外、Kubernetes还会使用 fsType 在存储类中以指示文件系统已存在。可以使用控制卷所有权 fsGroup 仅当出现此情况时、Pod的安全上下文才会显示 fsType 已设置。请参见 "Kubernetes :为 Pod 或容器配置安全上下文" 有关使用设置卷所有权的概述 fsGroup 环境。Kubernetes将应用 fsGroup 只有在以下情况下才为值:

    • fsType 在存储类中设置。

    • PVC 访问模式为 RW 。

    对于 NFS 存储驱动程序, NFS 导出中已存在文件系统。以便使用 fsGroup 存储类仍需要指定 fsType。您可以将其设置为 nfs 或任何非空值。

  • 请参见 "展开卷" 有关卷扩展的更多详细信息。

  • 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 和表示存储集群上配置的快照。类似于 PersistentVolumeClaimPersistentVolume 对象、创建快照时、 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 — * :要从中克隆的卷的名称

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 后端,它会将下划线替换为连字符。

您可以使用卷配置使用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- 使用 UIDVolumeSnapshot 对象(例如、 snapshot-e8d8a0ca-9826-11e9-9807-525400f3f660)。 volumeNamevolumeInternalName 通过获取后备卷的详细信息来填充。

Astra Trident ResourceQuota 对象

Trident的降级使用 system-node-critical 优先级类—Kubernetes中可用的最高优先级类—用于确保Astra Trident能够在正常节点关闭期间识别和清理卷、并允许Trident demonset Pod抢占资源压力较高的集群中优先级较低的工作负载。

为此、Astra Trident采用了 ResourceQuota 用于确保满足Trident子集上的"系统节点关键"优先级类的对象。在部署和创建emonset之前、Astra Trident会查找 ResourceQuota 对象、如果未发现、则应用此对象。

如果您需要对默认资源配额和优先级类进行更多控制、可以生成 custom.yaml 或配置 ResourceQuota 使用Helm图表的对象。

以下是一个`ResourceQuota`对象的示例、该对象会优先处理Trident子集。

apiVersion: <version>
kind: ResourceQuota
metadata:
  name: trident-csi
  labels:
    app: node.csi.trident.netapp.io
spec:
  scopeSelector:
     matchExpressions:
       - operator : In
         scopeName: PriorityClass
         values: ["system-node-critical"]

有关资源配额的详细信息、请参见 "Kubernetes:资源配额"

清理 ResourceQuota 如果安装失败

在极少数情况下、安装会在之后失败 ResourceQuota 对象已创建、请先尝试 "正在卸载" 然后重新安装。

如果不起作用、请手动删除 ResourceQuota 对象。

删除 ResourceQuota

如果您希望控制自己的资源分配、则可以删除Astra Trident ResourceQuota 使用命令的对象:

kubectl delete quota trident-csi -n trident