MicroShift is Developer Preview software only.
For more information about the support scope of Red Hat Developer Preview software, see Developer Preview Support Scope.存储
第 1 章 红帽构建的 MicroShift 存储概述 复制链接链接已复制到粘贴板!
红帽构建的 MicroShift 支持多种存储类型,包括内部存储和云供应商。您可以在红帽 MicroShift 集群构建中管理持久性和非持久性数据的容器存储。
1.1. 存储类型 复制链接链接已复制到粘贴板!
红帽构建的 MicroShift 存储被广泛分为两类,即临时存储和持久性存储。
1.1.1. 临时存储 复制链接链接已复制到粘贴板!
Pod 和容器具有临时或临时性,面向无状态应用。临时存储可让管理员和开发人员更好地管理其某些操作的本地存储。若要读取临时存储的详细信息,请单击 了解临时存储。
1.1.2. 持久性存储 复制链接链接已复制到粘贴板!
容器中部署的有状态应用需要持久存储。红帽构建的 MicroShift 使用名为持久性卷(PV)的预置备存储框架来允许集群管理员置备持久性存储。这些卷中的数据可能超过单个 pod 的生命周期。开发人员可以使用持久性卷声明(PVC)来请求存储要求。如需持久性存储详情,请阅读 了解持久性存储。
1.1.3. 动态存储置备 复制链接链接已复制到粘贴板!
使用动态置备可让您按需创建存储卷,消除预置备存储的需求。有关动态置备如何在红帽构建的 MicroShift 中工作的更多信息,请参阅动态置备。
第 2 章 了解红帽构建的 MicroShift 的临时存储 复制链接链接已复制到粘贴板!
临时存储是非结构化的,临时的。它通常与不可变应用程序一起使用。本指南讨论临时存储用于红帽 MicroShift 的构建方式。
2.1. 概述 复制链接链接已复制到粘贴板!
除了持久性存储外,Pod 和容器还需要临时或短暂的本地存储才能进行操作。此临时存储的生命周期不会超过每个 pod 的生命周期,且此临时存储无法在 pod 间共享。
Pod 使用临时本地存储进行涂销空间、缓存和日志。与缺少本地存储相关的问题包括:
- Pod 无法检测到有多少可用的本地存储。
- Pod 无法请求保证的本地存储。
- 本地存储是一个最佳资源。
- pod 可能会因为其他 pod 填充本地存储而被驱除。只有在足够的存储被重新声明前,不会接受这些新 pod。
与持久性卷不同,临时存储是非结构化的,空间在节点上运行的所有 pod 共享,系统的其他使用,以及红帽构建的 MicroShift。临时存储框架允许 Pod 指定其临时本地存储需求。它还允许红帽构建 MicroShift 来保护节点不受过度使用本地存储的影响。
虽然临时存储框架允许管理员和开发人员更好地管理本地存储,但 I/O 吞吐量和延迟不会直接生效。
2.2. 临时存储的类型 复制链接链接已复制到粘贴板!
主分区中始终提供临时本地存储。创建主分区的基本方法有两种: root 和 runtime。
root
默认情况下,该分区包含 kubelet 根目录、/var/lib/kubelet/
和 /var/log/
目录。此分区可以在用户 Pod、OS 和 Kubernetes 系统守护进程间共享。Pod 可以通过 EmptyDir
卷、容器日志、镜像层和容器可写层来消耗这个分区。kubelet 管理这个分区的共享访问和隔离。这个分区是临时的,应用程序无法预期这个分区中的任何性能 SLA(如磁盘 IOPS)。
Runtime
这是一个可选分区,可用于 overlay 文件系统。红帽构建的 MicroShift 会尝试识别并提供共享访问以及这个分区的隔离。容器镜像层和可写入层存储在此处。如果 runtime 分区存在,则 root
分区不包含任何镜像层或者其它可写入的存储。
2.3. 临时存储管理 复制链接链接已复制到粘贴板!
集群管理员可以通过设置配额在非终端状态的所有 Pod 中定义临时存储的限制范围,及临时存储请求数量,来管理项目中的临时存储。开发人员也可以在 Pod 和容器级别设置这个计算资源的请求和限值。
您可以通过指定请求和限值来管理本地临时存储。pod 中的每个容器可以指定以下内容:
-
spec.containers[].resources.limits.ephemeral-storage
-
spec.containers[].resources.requests.ephemeral-storage
临时存储的限制和请求以字节数量来衡量。您可以使用以下后缀之一将存储表示为普通整数或固定点号:E、P、T、G、M、k。您还可以使用两的指数:Ei、Pi、Ti、Gi、Mi Ki。例如,以下数量全部代表大约相同的值:128974848、129e6、129M 和 123Mi。后缀的大小写非常重要。如果您指定了 400m 的临时存储,这个请求 0.4 字节,而不是 400 mebibytes 字节 (400Mi) 或 400 megabytes (400M),这可能是预期的。
以下示例显示了有两个容器的 pod。每个容器请求 2GiB 本地临时存储。每个容器限制为 4GiB 本地临时存储。因此,pod 的请求为 4GiB 本地临时存储,限值为 8GiB 本地临时存储。
pod 规格中的此设置会影响调度程序对调度 pod 的决定,以及 kubelet 如何驱除 pod。首先,调度程序确保调度容器的资源请求总和小于节点的容量。在这种情况下,只有在可用临时存储(可分配资源)超过 4GiB 时,pod 才能分配给节点。
其次,在容器级别上,因为第一个容器设置了资源限值,kubelet 驱除管理器会测量此容器的磁盘用量,并在此容器的存储使用量超过其限制时驱除 pod (4GiB)。在 pod 级别,kubelet 通过添加该 pod 中所有容器的限制来达到总体 pod 存储限制。在本例中,pod 级别的总存储使用量是所有容器的磁盘用量总和,以及 pod 的 emptyDir
卷。如果这个总用量超过整个 pod 存储限制 (4GiB),则 kubelet 也会标记 pod 进行驱除。
2.4. 监控临时存储 复制链接链接已复制到粘贴板!
您可以使用 /bin/df
作为监控临时容器数据所在卷的临时存储使用情况的工具,即 /var/lib/kubelet
和 /var/lib/containers
。如果集群管理员将 /var/lib/containers
放置在单独的磁盘上,则可以使用 df
命令来显示 /var/lib/kubelet
的可用空间。
要在 /var/lib
中显示已用和可用空间的信息,请输入以下命令:
df -h /var/lib
$ df -h /var/lib
输出显示 /var/lib
中的临时存储使用情况:
输出示例
Filesystem Size Used Avail Use% Mounted on /dev/sda1 69G 32G 34G 49% /
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 69G 32G 34G 49% /
第 3 章 用于红帽构建的 MicroShift 的通用临时卷 复制链接链接已复制到粘贴板!
3.1. 概述 复制链接链接已复制到粘贴板!
通用临时卷是临时卷类型,可以由支持持久性卷和动态置备的所有存储驱动程序提供。通用临时卷与 emptyDir
卷类似,它们为从头开始数据提供每个 pod 目录,这通常在置备后为空。
通用临时卷在 pod 规格中内联指定,并遵循 pod 的生命周期。它们与 pod 一起创建和删除。
通用临时卷具有以下功能:
- 存储可以是本地的或者网络附加存储。
- 卷可以有 pod 无法超过的固定大小。
- 根据驱动程序和参数,卷可能有一些初始数据。
- 支持卷上的典型的操作,假设驱动程序支持它们,包括快照、克隆、调整大小和存储容量跟踪。
通用临时卷不支持离线快照和调整大小。
由于这个限制,以下 Container Storage Interface(CSI)驱动程序不支持通用临时卷的以下功能:
- Azure Disk CSI 驱动程序不支持调整大小。
- Cinder CSI 驱动程序不支持快照。
3.2. 生命周期和持久性卷声明 复制链接链接已复制到粘贴板!
卷声明的参数允许在 pod 的卷源内。支持声明(PVC)的标签、注解和整个字段。当创建这样的 pod 时,临时卷控制器随后会在与 pod 相同的命名空间中创建实际的 PVC 对象(来自 创建通用临时卷 流程中显示的模板),并确保在 pod 被删除时删除 PVC。这会以两种方式之一触发卷绑定和置备:
另外,如果存储类使用即时卷绑定。
通过立即绑定,调度程序被强制选择在卷可用后有权访问的节点。
当 pod 放入节点时(
WaitForFirstConsumervolume
绑定模式)。建议这个卷绑定选项用于通用临时卷,因为调度程序可以为 pod 选择适当的节点。
就资源限制而言,具有通用临时存储的 pod 是提供该临时存储的 PVC 的所有者。当 pod 被删除时,Kubernetes 垃圾回收器会删除 PVC,然后,后者通常会触发删除卷,因为存储类的默认重新声明策略是删除卷。您可以使用一个带有保留策略的存储类创建 quasi-ephemeral 本地存储:存储会活跃 pod,在这种情况下,您必须确保卷清理单独发生。虽然这些 PVC 存在,它们可以像任何其他 PVC 一样使用。特别是,可以在卷克隆或快照中被引用为数据源。PVC 对象也保存卷的当前状态。
3.3. 安全性 复制链接链接已复制到粘贴板!
您可以启用通用临时卷功能,以便可以创建 pod 的用户也可以间接创建持久性卷声明 (PVC)。即使这些用户没有直接创建 PVC 的权限,此功能也可以正常工作。集群管理员必须了解这一点。如果这不适用于您的安全模型,请使用准入 Webhook 来拒绝对象,如具有通用临时卷的 pod。
PVC 的一般命名空间配额仍适用,因此即使允许用户使用此新机制,它们也无法使用它来绕过其他策略。
3.4. 持久性卷声明命名 复制链接链接已复制到粘贴板!
自动创建的持久性卷声明(PVC)由 pod 名称和卷名称的组合命名,中间带有连字符(-)。这种命名惯例还引入了不同 pod 之间以及 pod 和手动创建 PVC 之间潜在的冲突。
例如,pod-a
带有卷 scratch
,pod
带有卷 a-scratch
,它们都使用相同的 PVC 名称 pod-a-scratch
。
检测到这样的冲突,如果为 pod 创建,PVC 仅用于临时卷。此检查基于所有权关系。现有 PVC 不会被覆盖或修改,但这不会解决冲突。如果没有正确的 PVC,pod 无法启动。
在在同一命名空间中命名 pod 和卷时要小心,以便不会发生命名冲突。
3.5. 创建通用临时卷 复制链接链接已复制到粘贴板!
流程
-
创建
pod
对象定义,并将其保存到文件中。 在文件中包括通用临时卷信息。
my-example-pod-with-generic-vols.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 通用临时卷声明
第 4 章 了解持久性存储用于红帽构建的 MicroShift 复制链接链接已复制到粘贴板!
管理存储与管理计算资源不同。红帽构建的 MicroShift 使用 Kubernetes 持久性卷(PV)框架来允许集群管理员为集群置备持久性存储。开发者可以使用持久性卷声明 (PVC) 来请求 PV 资源而无需具体了解底层存储基础架构。
4.1. 持久性存储概述 复制链接链接已复制到粘贴板!
PVC 特定于一个命名空间,开发人员创建并使用它作为使用 PV 的方法。PV 资源本身并不特定于任何单一命名空间;它们可以在整个红帽构建的 MicroShift 集群间共享,并从任何命名空间进行声明。在 PV 绑定到 PVC 后,就不会将 PV 绑定到额外的 PVC。这会影响到一个命名空间的 PV 的影响。
PV 由 PersistentVolume
API 对象定义,它代表了集群中现有存储的片段,这些存储可以由集群管理员静态置备,也可以使用 StorageClass
对象动态置备。它与一个节点一样,是一个集群资源。
PV 是卷插件,与 Volumes
资源类似,但PV 的生命周期独立于任何使用它的 pod。PV 对象捕获存储实现的详情,即 LVM、主机文件系统(如 hostpath 或原始块设备)。
存储的高可用性功能由底层的存储架构提供。
与 PersistentVolumes
一样,PersistentVolumeClaims
(PVCs) 是 API 对象,代表开发人员对存储的一个请求。它与一个 pod 类似,pod 会消耗节点资源, PVC 消耗 PV 资源。例如:pod 可以请求特定级别的资源,比如 CPU 和内存,而 PVC 可以请求特定的存储容量和访问模式。OpenShift Container Platform 支持的访问模式也可以在红帽构建的 MicroShift 中定义。但是,因为红帽构建的 MicroShift 不支持多节点部署,所以只有 ReadWriteOnce (RWO)。
4.2. 卷和声明的生命周期 复制链接链接已复制到粘贴板!
PV 是集群中的资源。PVC 是对这些资源的请求,也是对该资源的声明检查。PV 和 PVC 之间的交互有以下生命周期。
4.2.1. 置备存储 复制链接链接已复制到粘贴板!
根据 PVC 中定义的开发人员的请求,集群管理员配置一个或者多个动态置备程序用来置备存储及一个匹配的 PV。
4.2.2. 绑定声明 复制链接链接已复制到粘贴板!
当您创建 PVC 时,您会要求特定的存储量,指定所需的访问模式,并创建一个存储类来描述和分类存储。master 中的控制循环会随时检查是否有新的 PVC,并把新的 PVC 与一个适当的 PV 进行绑定。如果没有适当的 PV,则存储类的置备程序会创建一个适当的 PV。
所有 PV 的大小可能会超过 PVC 的大小。这在手动置备 PV 时尤为如此。为最小化超额,红帽构建的 MicroShift 绑定到与所有其他标准匹配的最小 PV。
如果匹配的卷不存在,或者相关的置备程序无法创建所需的存储,则请求将会处于未绑定的状态。当出现了匹配的卷时,相应的声明就会与其绑定。例如:在一个集群中有多个手动置备的 50Gi 卷。它们无法和一个请求 100Gi 的 PVC 相匹配。当在这个集群中添加了一个 100Gi PV 时, PVC 就可以和这个 PV 绑定。
4.2.3. 使用 pod 和声明的 PV 复制链接链接已复制到粘贴板!
pod 使用声明(claim)作为卷。集群通过检查声明来找到绑定的卷,并为 pod 挂载相应的卷。对于那些支持多个访问模式的卷,您必须指定作为 pod 中的卷需要使用哪种模式。
一旦您的声明被绑定后,被绑定的 PV 就会专属于您,直到您不再需要它。您可以通过在 pod 的 volumes 定义中包括 persistentVolumeClaim
来调度 pod 并访问声明的 PV。
如果将具有高文件数的持久性卷附加到 pod,则这些 pod 可能会失败,或者可能需要很长时间才能启动。如需更多信息,请参阅在 OpenShift 中使用具有高文件计数的持久性卷时,为什么 pod 无法启动或占用大量时间来实现"Ready"状态?
4.2.4. 释放持久性卷 复制链接链接已复制到粘贴板!
当不再需要使用一个卷时,您可以从 API 中删除 PVC 对象,这样相应的资源就可以被重新声明。当声明被删除后,这个卷就被认为是已被释放,但它还不可以被另一个声明使用。这是因为之前声明者的数据仍然还保留在卷中,这些数据必须根据相关政策进行处理。
4.2.5. 持久性卷的重新声明策略 复制链接链接已复制到粘贴板!
持久性卷重新声明(reclaim)策略指定了在卷被释放后集群可以如何使用它。卷重新声明政策包括 Retain
、Recycle
或 Delete
。
-
Retain
策略可为那些支持它的卷插件手动重新声明资源。 -
Recycle
策略在从其请求中释放后,将卷重新放入到未绑定的持久性卷池中。
在 MicroShift 4 的红帽构建中弃用了 Recycle
reclaim 策略。我们推荐使用动态置备功能。
-
Delete
策略删除红帽构建的 MicroShift 以及外部基础架构(如 AWS EBS 或 VMware vSphere)中关联的存储资源中的PersistentVolume
。
动态置备的卷总是被删除。
4.2.6. 手动重新声明持久性卷 复制链接链接已复制到粘贴板!
删除持久性卷声明 (PVC) 时,底层逻辑卷会根据 reclaimPolicy
进行处理。
流程
要以集群管理员的身份手动重新声明 PV:
删除 PV。
oc delete pv <pv-name>
$ oc delete pv <pv-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 外部基础架构(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)中的关联的存储资产在 PV 被删除后仍然存在。
- 清理相关存储资产中的数据。
- 删除关联的存储资产。另外,若要重复使用同一存储资产,请使用存储资产定义创建新 PV。
重新声明的 PV 现在可供另一个 PVC 使用。
4.2.7. 更改持久性卷的重新声明策略 复制链接链接已复制到粘贴板!
更改持久性卷的重新声明策略:
列出集群中的持久性卷:
oc get pv
$ oc get pv
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-b6efd8da-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim1 manual 10s pvc-b95650f8-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim2 manual 6s pvc-bb3ca71d-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim3 manual 3s
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-b6efd8da-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim1 manual 10s pvc-b95650f8-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim2 manual 6s pvc-bb3ca71d-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim3 manual 3s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 选择一个持久性卷并更改其重新声明策略:
oc patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
$ oc patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证您选择的持久性卷是否具有正确的策略:
oc get pv
$ oc get pv
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-b6efd8da-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim1 manual 10s pvc-b95650f8-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim2 manual 6s pvc-bb3ca71d-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Retain Bound default/claim3 manual 3s
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-b6efd8da-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim1 manual 10s pvc-b95650f8-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Delete Bound default/claim2 manual 6s pvc-bb3ca71d-b7b5-11e6-9d58-0ed433a7dd94 4Gi RWO Retain Bound default/claim3 manual 3s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在前面的输出中,绑定到声明
default/claim3
的卷现在具有Retain
重新声明策略。当用户删除声明default/claim3
时,这个卷不会被自动删除。
4.3. 持久性卷(PV) 复制链接链接已复制到粘贴板!
每个 PV 都会包括一个 spec
和 status
,它们分别代表卷的规格和状态,例如:
PersistentVolume
对象定义示例
4.3.1. 容量 复制链接链接已复制到粘贴板!
一般情况下,一个持久性卷(PV)有特定的存储容量。这可以通过使用 PV 的 capacity
属性来设置。
目前,存储容量是唯一可以设置或请求的资源。以后可能会包括 IOPS 、 throughput 等属性。
4.3.2. 支持的访问模式 复制链接链接已复制到粘贴板!
LVMS 是 Red Hat build of MicroShift 唯一支持的 CSI 插件。内置在 OpenShift Container Platform 的 hostPath 和 LV 也支持 RWO。
4.3.3. 阶段 复制链接链接已复制到粘贴板!
卷可以处于以下几个阶段:
阶段 | 描述 |
---|---|
Available | 可用资源,还未绑定到任何声明。 |
Bound | 卷已绑定到一个声明。 |
Released | 以前使用这个卷的声明已被删除,但该资源还没有被集群重新声明。 |
Failed | 卷的自动重新声明失败。 |
使用以下命令可以查看与 PV 绑定的 PVC 名称:
oc get pv <pv-claim>
$ oc get pv <pv-claim>
4.3.3.1. 挂载选项 复制链接链接已复制到粘贴板!
您可以使用属性 mountOptions
在挂载 PV 时指定挂载选项。
例如:
挂载选项示例
- 1
- 在将 PV 挂载到磁盘时使用指定的挂载选项。
以下 PV 类型支持挂载选项:
- AWS Elastic Block Store (EBS)
- Azure Disk
- Azure File
- Cinder
- GCE Persistent Disk
- iSCSI
- 本地卷
- NFS
- Red Hat OpenShift Data Foundation(仅限 Ceph RBD)
- VMware vSphere
Fibre Channel 和 HostPath PV 不支持挂载选项。
4.4. 持久性卷声明 (PVC) 复制链接链接已复制到粘贴板!
每个 PersistentVolumeClaim
对象都会包括一个 spec
和 status
,它们分别代表了声明的规格和状态。例如:
PersistentVolumeClaim
对象定义示例
4.4.1. 存储类 复制链接链接已复制到粘贴板!
另外,通过在 storageClassName
属性中指定存储类的名称,声明可以请求一个特定的存储类。只有具有请求的类的 PV( storageClassName
的值与 PVC 中的值相同)才会与 PVC 绑定。集群管理员可配置动态置备程序为一个或多个存储类提供服务。集群管理员可根据需要创建与 PVC 的规格匹配的 PV。
集群管理员也可以为所有 PVC 设置默认存储类。当配置了默认存储类时, PVC 必须明确要求将存储类 StorageClass
或 storageClassName
设为 ""
, 以便绑定到没有存储类的 PV。
如果一个以上的存储类被标记为默认,则只能在 storageClassName
被显式指定时才能创建 PVC。因此,应只有一个存储类被设置为默认值。
4.4.2. 访问模式 复制链接链接已复制到粘贴板!
声明在请求带有特定访问权限的存储时,使用与卷相同的格式。
4.4.3. Resources 复制链接链接已复制到粘贴板!
象 pod 一样,声明可以请求具体数量的资源。在这种情况下,请求用于存储。同样的资源模型适用于卷和声明。
4.4.4. 声明作为卷 复制链接链接已复制到粘贴板!
pod 通过将声明作为卷来访问存储。在使用声明时,声明需要和 pod 位于同一个命名空间。集群在 pod 的命名空间中找到声明,并使用它来使用这个声明后台的PersistentVolume
。卷被挂载到主机和 pod 中,例如:
挂载卷到主机和 pod 示例
4.5. 使用 fsGroup 减少 pod 超时 复制链接链接已复制到粘贴板!
如果存储卷包含很多文件(1,000,000 或更多),您可能会遇到 pod 超时问题。
这是因为,红帽构建的 MicroShift 会递归更改每个卷内容的所有权和权限,以便在挂载卷时与 pod 的 securityContext
中指定的 fsGroup
匹配。对于大型卷,检查和更改所有权和权限可能会非常耗时,从而会减慢 pod 启动的速度。您可以使用 securityContext
中的 fsGroupChangePolicy
字段来控制红帽构建的 MicroShift 检查和管理卷的所有权和权限的方式。
fsGroupChangePolicy
定义在 pod 中公开卷之前更改卷的所有权和权限的行为。此字段仅适用于支持 fsGroup
- 控制的所有权和权限。此字段有两个可能的值:
-
OnRootMismatch
:仅当 root 目录的权限和所有权与卷的预期权限不匹配时才会更改权限和所有权。这有助于缩短更改卷的所有权和权限所需的时间,以减少 pod 超时。 -
Always
:当卷被挂载时,始终更改卷的权限和所有权。
fsGroupChangePolicy
示例
- 1
OnRootMismatch
指定跳过递归权限更改,这有助于避免 pod 超时问题。
fsGroupChangePolicyfield 对临时卷类型没有影响,如 secret、configMap 和 emptydir。
第 5 章 为红帽构建的 MicroShift 扩展持久性卷 复制链接链接已复制到粘贴板!
了解如何在红帽构建的 MicroShift 中扩展持久性卷。
5.1. 扩展 CSI 卷 复制链接链接已复制到粘贴板!
您可以在存储卷被创建后,使用 Container Storage Interface (CSI) 来扩展它们。
CSI 卷扩展不支持以下内容:
- 在扩展卷失败时进行恢复
- 缩小
先决条件
- 底层 CSI 驱动程序支持调整大小。
- 使用动态置备。
-
控制
StorageClass
对象的allowVolumeExpansion
被设置为true
。如需更多信息,请参阅"启用卷扩展支持"。
流程
-
对于持久性卷声明(PVC),将
.spec.resources.requests.storage
设置为所需的新大小。 -
观察 PVC 的
status.conditions
字段来查看调整大小是否完成。红帽构建的 MicroShift 会在扩展过程中为 PVC 添加Resizing
条件,该条件会在扩展完成后删除。
5.2. 扩展本地卷 复制链接链接已复制到粘贴板!
您可以使用本地存储操作器(LSO)手动扩展持久性卷(PV)和持久性卷声明(PVC)。
流程
- 扩展底层设备。确定这些设备中提供了适当的容量。
-
通过编辑 PV 的
.spec.capacity
字段来更新对应的 PV 对象以匹配新设备大小。 -
对于用于将 PVC 绑定到 PVet 的存储类,设置
allowVolumeExpansion:true
。 -
对于 PVC,将
.spec.resources.requests.storage
设置为与新大小匹配。
根据需要,kubelet 应该自动扩展卷上的底层文件系统,并更新 PVC 的 status 字段来反映新的大小。
5.3. 使用文件系统扩展持久性卷声明(PVC) 复制链接链接已复制到粘贴板!
根据需要重新定义文件系统大小的卷类型扩展 PVC,如 GCE Persistent Disk 卷(gcePD)、AWS Elastic Block Store EBS (EBS)和 Cinder,分为两个步骤。首先,扩展云供应商中的卷对象。其次,扩展节点上的文件系统。
只有在使用这个卷启动新的 pod 时,才会在该节点中扩展文件系统。
先决条件
-
控制
StorageClass
对象必须将allowVolumeExpansion
设置为true
。
流程
通过编辑
spec.resources.requests
来修改 PVC 并请求一个新的大小。例如,以下命令将ebs
PVC 扩展至 8 Gi:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
spec.resources.requests
更新至更大的 PVC 来扩展 PVC。
重新定义云供应商对象大小后, PVC 被设置为
FileSystemResizePending
。输入以下命令检查条件:oc describe pvc <pvc_name>
$ oc describe pvc <pvc_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
当云供应商对象完成重新定义大小时,
PersistentVolume
对象中的PersistentVolume.Spec.Capacity
会显示新请求的大小。此时,您可从 PVC 创建或重新创建新 Pod 来完成文件系统大小调整。当 Pod 运行后,新请求的大小就可用,同时FileSystemResizePending
条件从 PVC 中删除。
5.4. 在扩展卷失败时进行恢复 复制链接链接已复制到粘贴板!
如果扩展底层存储失败,红帽构建的 MicroShift 管理员可以手动恢复持久性卷声明(PVC)状态并取消调整大小的请求。否则,控制器会持续重试大小的请求。
流程
-
把与 PVC 进行绑定的 PV 的 reclaim 策略设为
Retain
。编辑 PV,把persistentVolumeReclaimPolicy
的值改为Retain
。 - 删除 PVC。
-
手动编辑 PV 并从 PV specs 中删除
claimRef
条目,以确保新创建的 PVC 可以绑定到标记为Retain
的 PV。这会将 PV 标记为Available
。 - 以较小的大小,或底层存储架构可以分配的大小,重新创建 PVC。
-
将 PVC 的
volumeName
值设为 PV 的名称。这使 PVC 只会绑定到置备的 PV。 - 恢复 PV 上的 reclaim 策略。
第 6 章 使用 LVMS 插件进行动态存储 复制链接链接已复制到粘贴板!
红帽构建的 MicroShift 启用动态存储置备,可立即与逻辑卷管理器存储(LVMS)容器存储(CSI)供应商一起使用。LVMS 插件是 TopoLVM 的 Red Hat downstream 版本,它是一个 CSI 插件,用于管理 Kubernetes 的 LVM 卷。
LVMS 为带有适当配置的持久性卷声明 (PVC) 的容器工作负载置备新的逻辑卷管理 (LVM) 逻辑卷 (LV)。每个 PVC 都引用一个存储类,它代表主机节点上的 LVM 卷组(VG)。LV 仅针对调度的 pod 置备。
6.1. LVMS 系统要求 复制链接链接已复制到粘贴板!
在红帽构建的 MicroShift 中使用 LVMS 需要以下系统规格:
6.1.1. 卷组名称 复制链接链接已复制到粘贴板!
LVMS 的默认集成会动态选择默认卷组 (VG)。如果红帽构建的 MicroShift 主机中没有卷组,则 LVMS 会被禁用。
如果红帽构建的 MicroShift 主机中只有一个 VG,则会使用该 VG。如果有多个卷组,则使用组 microshift
。如果没有找到 microshift
组,则 LVMS 将被禁用。
如果要使用特定的 VG,则必须将 LVMS 配置为选择该 VG。您可以在配置文件中更改 VG 的默认名称。详情请查看本文档的"配置 LVMS"部分。
您可以在配置文件中更改 VG 的默认名称。详情请查看本文档的"配置 LVMS"部分。
在启动前,lvmd.yaml
配置文件必须在节点上指定一个现有 VG,且有足够的容量用于工作负载存储。如果 VG 不存在,节点控制器会启动并进入 CrashLoopBackoff
状态。
6.1.2. 卷大小递增 复制链接链接已复制到粘贴板!
LVMS 以 1GB (GB) 为单位递增的形式置备存储。存储请求将向上舍入到最接近的 GB。当 VG 的容量小于 1 GB 时,PersistentVolumeClaim
会注册一个 ProvisioningFailed
事件,例如:
输出示例
Warning ProvisioningFailed 3s (x2 over 5s) topolvm.cybozu.com_topolvm-controller-858c78d96c-xttzp_0fa83aef-2070-4ae2-bcb9-163f818dcd9f failed to provision volume with StorageClass "topolvm-provisioner": rpc error: code = ResourceExhausted desc = no enough space left on VG: free=(BYTES_INT), requested=(BYTES_INT)
Warning ProvisioningFailed 3s (x2 over 5s) topolvm.cybozu.com_topolvm-controller-858c78d96c-xttzp_0fa83aef-2070-4ae2-bcb9-163f818dcd9f failed to provision volume with
StorageClass "topolvm-provisioner": rpc error: code = ResourceExhausted desc = no enough space left on VG: free=(BYTES_INT), requested=(BYTES_INT)
6.2. LVMS 部署 复制链接链接已复制到粘贴板!
在红帽构建的 MicroShift 启动后,LVMS 会自动部署到 openshift-storage
命名空间中的集群。
LVMS 使用 StorageCapacity
跟踪来确保在请求的存储大于卷组可用存储时不会调度带有 LVMS PVC 的 pod。有关 StorageCapacity
跟踪的更多信息,请参阅 Storage Capacity。
6.3. 创建 LVMS 配置文件 复制链接链接已复制到粘贴板!
当红帽构建的 MicroShift 运行时,它将使用 /etc/microshift/lvmd.yaml
中的 LVMS 配置(如果提供的话)。您必须将您创建的任何配置文件放在 /etc/microshift/
目录中。
流程
要创建
lvmd.yaml
配置文件,请运行以下命令:sudo cp /etc/microshift/lvmd.yaml.default /etc/microshift/lvmd.yaml
$ sudo cp /etc/microshift/lvmd.yaml.default /etc/microshift/lvmd.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.4. 配置 LVMS 复制链接链接已复制到粘贴板!
红帽构建的 MicroShift 支持通过 LVM 配置,并允许您指定自定义卷组、精简卷置备参数和保留未分配的卷组空间。您可以随时编辑您创建的 LVMS 配置文件。您必须重启红帽构建的 MicroShift,以便在编辑该文件后部署配置更改。
以下 lvmd.yaml
示例文件显示了基本的 LVMS 配置:
LVMS 配置示例
- 1
- 字符串.gRPC 的 UNIX 域套接字端点。默认为
/run/topolvm/lvmd.sock
。 - 2
map[string]DeviceClass
。device-class
设置。- 3
- 字符串.
device-class
的名称。 - 4
- 字符串.
device-class
创建逻辑卷的组。 - 5
- Unit64.GiB 中的存储容量在卷组中未分配。默认为
0。
- 6
- 布尔值.表示默认使用
device-class
。默认值为false
。 - 7
- Unit.逻辑卷中条带的数目。
- 8
- 字符串.在移动到下一个设备前写入一个设备的数据量。
- 9
- 字符串.传递给
lvcreate
的额外参数,例如[--type=raid1"
]。
竞争条件可防止 LVMS 在同时创建多个 PVC 时准确跟踪分配的空间,并为设备类保留 spare-gb
。使用单独的卷组和逻辑卷类来防止存储高度动态工作负载相互影响。
可以使用专用选项 (stripe
和 stripe-size
) 和 lvcreate-options
来配置条带。可以使用任一选项,但不能一起使用它们。将 stripe
和 stripe-size
与 lvcreate-options
一起使用会导致重复参数到 lvcreate
。您不应该同时设置 lvcreate-options: ["--stripes=n"]
和 stripe: n
。但是,当 lvcreate-options
没有用于条带时,您可以同时使用这两个选项。例如:
stripe: 2 lvcreate-options: ["--mirrors=1"]
stripe: 2
lvcreate-options: ["--mirrors=1"]
6.5. 使用 LVMS 复制链接链接已复制到粘贴板!
LVMS StorageClass
使用一个默认 StorageClass
部署。任何没有自动定义的 .spec.storageClassName
的 PersistentVolumeClaim
对象,都会有一个从默认 StorageClass
置备的 PersistentVolume
。使用以下步骤将逻辑卷置备并挂载到 pod。
流程
要将逻辑卷置备并挂载到 pod,请运行以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow