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

Kubernetes 和 Trident 对象

贡献者

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

对象如何相互交互?

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

  1. 用户创建一个 PersistentVolumeClaim ,请求管理员先前配置的 Kubernetes StorageClass 中具有特定大小的新 PersistentVolume

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

  3. Trident 会查看自己的 StorageClass 并使用相同的名称来标识匹配的 BackendStoragePools ,它可以使用这些卷为该类配置卷。

  4. Trident 会在匹配的后端配置存储并创建两个对象: Kubernetes 中的 A PersistentVolume 用于告知 Kubernetes 如何查找,挂载和处理卷; Trident 中的一个卷用于保留 PersistentVolume 与实际存储之间的关系。

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

  6. 用户使用指向 Trident 的 VolumeSnapshotClass 创建现有 PVC 的 VolumeSnapshot

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

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

  9. Trident 可识别所需的快照,并执行与创建 PersistentVolumeVolume 相同的一组步骤。

提示 要进一步了解 Kubernetes 对象,强烈建议您阅读 "永久性卷" Kubernetes 文档的一节。

Kubernetes PersistentVolumeClaim 对象

Kubernetes PersistentVolumeClaim 对象是 Kubernetes 集群用户发出的存储请求。

除了标准规范之外,如果用户要覆盖在后端配置中设置的默认值, Trident 还允许用户指定以下特定于卷的标注:

标注 卷选项 支持的驱动程序

trident.netapp.io/fileSystem

文件系统

ontap-san、solidfire-san、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 reclaime 策略,则在释放 PV 时(即用户删除 PVC 时), Trident 会同时删除 PV 和后备卷。如果删除操作失败, Trident 会将 PV 标记为相应的 PV ,并定期重试此操作,直到操作成功或 PV 手动删除为止。如果 PV 使用 ` retain` 策略, Trident 会忽略该策略,并假定管理员将从 Kubernetes 和后端清理该策略,以便在删除卷之前对其进行备份或检查。请注意,删除 PV 不会通过发生原因 Trident 删除后备卷。您应使用 REST API (tridentctl )将其删除。

Trident 支持使用 CSI 规范创建卷快照:您可以创建卷快照并将其用作数据源来克隆现有 PVC 。这样, PV 的时间点副本就可以以快照的形式公开给 Kubernetes 。然后,可以使用快照创建新的 PV 。请查看 ` + 按需卷快照 +` 了解其工作原理。

Trident还提供 cloneFromPVCsplitOnClone 用于创建克隆的标注。您可以使用这些标注克隆PVC、而无需使用CSI实施。

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

请考虑以下几点:

  • 建议克隆空闲卷。

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

  • 使用 ontap-nasontap-san 驱动程序时,可能需要将 PVC 标注 trident.netapp.io/splitOnClonetrident.netapp.io/cloneFromPVC 结合使用。当 trident.netapp.io/splitOnClone 设置为 true 时, Trident 会将克隆的卷与父卷拆分,从而将克隆的卷与其父卷的生命周期完全分离,从而降低存储效率。如果不设置 trident.netapp.io/splitOnClone 或将其设置为 false ,则会减少后端的空间占用,而会在父卷和克隆卷之间创建依赖关系,因此除非先删除克隆,否则无法删除父卷。拆分克隆是有意义的一种情形,即克隆空数据库卷时,该卷及其克隆会发生很大的差异,无法从 ONTAP 提供的存储效率中受益。

sample-input 目录包含用于Trident的PVC定义示例。请参见 有关与三项技术的卷关联的参数和设置的完整问题描述。

Kubernetes PersistentVolume 对象

Kubernetes PersistentVolume 对象表示可供 Kubernetes 集群使用的一段存储。它的生命周期与使用它的 POD 无关。

备注 Trident 会创建 PersistentVolume 对象,并根据其配置的卷自动将其注册到 Kubernetes 集群中。您不应自行管理它们。

创建引用基于 Trident 的 S存储类 的 PVC 时, Trident 会使用相应的存储类配置新卷并为该卷注册新的 PV 。在配置已配置的卷和相应的 PV 时, Trident 会遵循以下规则:

  • Trident 会为 Kubernetes 生成 PV 名称及其用于配置存储的内部名称。在这两种情况下,它都可以确保名称在其范围内是唯一的。

  • 卷的大小与 PVC 中请求的大小尽可能匹配,但可能会根据平台将其取整为最接近的可分配数量。

Kubernetes StorageClass 对象

Kubernetes StorageClass 对象在 PersistentVolumeClass 中按名称指定,用于使用一组属性配置存储。存储类本身可标识要使用的配置程序,并按配置程序所了解的术语定义该属性集。

它是需要由管理员创建和管理的两个基本对象之一。另一个是 Trident 后端对象。

使用 Trident 的 Kubernetes StorageClass 对象如下所示:

apiVersion: storage.k8s.io/v1
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 支持此配置方法

指定的配置方法

Thick:All ONTAP ;Thin:All ONTAP & solidfire-san

后端类型

string

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

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

您可以使用 addtionalStoragePools 参数扩展 Trident 用于配置的池集,而不管 attributesstoragePools 参数选择的任何池如何。

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

storagePoolsaddtionalStoragePools 参数中,每个条目的格式为 ` <backend>: <storagePoolList>` ,其中 ` <storagePoolList>` 是指定后端的存储池列表,以逗号分隔。例如, addtionalStoragePools 的值可能类似于 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.

全部

允许卷扩展

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.26

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

    • 在存储类中设置 FSType

    • PVC 访问模式为 RW 。

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

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

  • Trident 安装程序包提供了几个示例存储类定义,可用于 sample-input/storage-class-* 。 yaml 中的 Trident 。删除 Kubernetes 存储类也会删除相应的 Trident 存储类。

Kubernetes VolumeSnapshotClass 对象

Kubernetes VolumeSnapshotClass 对象类似于 StorageClasses 。它们有助于定义多个存储类,并由卷快照引用以将快照与所需的快照类关联。每个卷快照都与一个卷快照类相关联。

要创建快照,管理员应定义 VolumeSnapshotClass 。此时将使用以下定义创建卷快照类:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: csi-snapclass
driver: csi.trident.netapp.io
deletionPolicy: Delete

driver 指定给 Kubernetes ,由 Trident 处理对 csI-snapclass 类的卷快照请求。deeltionPolicy 指定必须删除快照时要执行的操作。如果将 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 对象保持一对一映射。

VolumeSnapshotContent 对象包含用于唯一标识快照的详细信息,例如 snapshotHandle 。此 snapshotHandle 是 PV 名称和 VolumeSnapshotContent 对象名称的唯一组合。

收到快照请求后, Trident 会在后端创建快照。创建快照后, Trident 会配置一个 VolumeSnapshotContent 对象,从而将快照公开到 Kubernetes API 。

备注 通常、您不需要管理 `VolumeSnapshotContent`对象。但是、如果要在Trident外部创建、则会出现一个例外情况"导入卷快照"

Kubernetes CustomResourceDefinition 对象

Kubernetes 自定义资源是 Kubernetes API 中的端点,由管理员定义并用于对类似对象进行分组。Kubernetes 支持创建自定义资源以存储对象集合。您可以通过运行 kubectl get crds 来获取这些资源定义。

自定义资源定义( CRD )及其关联的对象元数据由 Kubernetes 存储在其元数据存储中。这样就无需为 Trident 创建单独的存储。

Trident使用 `CustomResourceDefinition`对象保留Trident对象的身份、例如Trident后端、Trident存储类和Trident卷。这些对象由 Trident 管理。此外, CSI 卷快照框架还引入了一些定义卷快照所需的 CRD 。

CRD 是一种 Kubernetes 构造。上述资源的对象由 Trident 创建。例如,使用 tridentctl 创建后端时,会创建一个对应的 tridentbackend CRD 对象,供 Kubernetes 使用。

有关 Trident 的 CRD ,请注意以下几点:

  • 安装 Trident 时,系统会创建一组 CRD ,并可像使用任何其他资源类型一样使用。

  • 使用卸载Trident时 tridentctl uninstall 命令中、Trident Pod会被删除、但创建的CRD不会被清理。请参见 "卸载 Trident" 了解如何从头开始完全删除和重新配置 Trident 。

Trident `StorageClass`对象

Trident会为Kubernetes创建匹配的存储类 StorageClass 指定的对象 csi.trident.netapp.io 在其配置程序字段中。存储类名称与Kubernetes的名称匹配 StorageClass 它所代表的对象。

备注 使用 Kubernetes 时,如果注册了使用 Trident 作为配置程序的 Kubernetes StorageClass ,则会自动创建这些对象。

存储类包含一组卷要求。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 会在备用存储系统上创建 Snapshot 对象。此快照对象的 internalName 是通过将前缀 snapshot-VolumeSnapshot 对象的 UID (例如, snapshot-e8d8a0ca-9826-11e9-9807-525400f3f660 )组合而生成的。VolumeNamevolumeInternalName 可通过获取后备卷的详细信息来填充。

Trident `ResourceQuota`对象

Trident守护进程使用优先级类(KubeNet中可用的最高优先级类)、以确保Trident可以在正常节点关闭期间识别和清理卷、并允许Trident守护进程 `system-node-critical`Pod抢占资源压力较高的集群中优先级较低的工作负载。

为此、Trident会使用一个 `ResourceQuota`对象来确保满足Trident守护程序集上的"system-node critical"优先级类。在部署和创建守护进程之前、Trident会查找对象、如果未发现、则会应用该 `ResourceQuota`对象。

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

以下是一个`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

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

kubectl delete quota trident-csi -n trident