28.11.3. 场景 2:如何为集群启用默认 StorageClass 行为


在这个示例中,cluster-adminstorage-admin 为所有没有在其声明中隐式指定了 StorageClass 的其他用户和项目启用一个默认存储类。这对 cluster-adminstorage-admin 有助于提供轻松管理存储卷,而无需在集群中设置或通信专用 StorageClasses

这个示例基于 第 28.11.2 节 “情况 1:使用两种 StorageClass 类型的基本动态置备” 构建。cluster-adminstorage-admin 将创建另一个 StorageClass 以设计为 默认的 StorageClass

例 28.18. 默认 StorageClass 对象定义

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: generic 1
  annotations:
    storageclass.kubernetes.io/is-default-class: "true" 2
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  zone: us-east1-d
1
StorageClass 的名称,该名称需要在集群中唯一。
2
将这个 StorageClass 标记为默认存储类的注解。在这个 API 版本中必须使用 "true" quoted。如果没有此注解,OpenShift Container Platform 会考虑它不是 默认 StorageClass

作为 cluster-adminstorage-admin 将定义保存到 YAML 文件(generic-gce.yaml),然后创建 StorageClasses

# oc create -f generic-gce.yaml
storageclass "generic" created

# oc get storageclass
NAME       TYPE
generic    kubernetes.io/gce-pd
fast       kubernetes.io/gce-pd
slow       kubernetes.io/gce-pd

作为常规用户,在不满足任何 StorageClass 要求的情况下创建一个新的声明定义,并将它保存到文件(generic-pvc.yaml)。

例 28.19. 默认 存储声明对象定义

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: pvc-engineering2
spec:
 accessModes:
  - ReadWriteMany
 resources:
   requests:
     storage: 5Gi

执行它并检查声明是否绑定:

# oc create -f generic-pvc.yaml
persistentvolumeclaim "pvc-engineering2" created
                                                                   3s
# oc get pvc
NAME               STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
pvc-engineering    Bound     pvc-e9b4fef7-8bf7-11e6-9962-42010af00004   10Gi       RWX           41m
pvc-engineering2   Bound     pvc-a9f70544-8bfd-11e6-9962-42010af00004   5Gi        RWX           7s  1
1
pvc-engineering2 默认绑定到动态置备的卷。

作为 cluster-adminstorage-admin,查看目前定义的持久性卷:

# oc get pv
NAME                                       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                     REASON    AGE
pvc-a9f70544-8bfd-11e6-9962-42010af00004   5Gi        RWX           Delete          Bound     rh-eng/pvc-engineering2             5m 1
pvc-ba4612ce-8b4d-11e6-9962-42010af00004   5Gi        RWO           Delete          Bound     mytest/gce-dyn-claim1               21h
pvc-e9b4fef7-8bf7-11e6-9962-42010af00004   10Gi       RWX           Delete          Bound     rh-eng/pvc-engineering              46m 2
1
这个 PV 会绑定到来自 default StorageClassdefault 动态卷。
2
这个 PV 使用 快速 StorageClass第 28.11.2 节 “情况 1:使用两种 StorageClass 类型的基本动态置备” 绑定到第一个 PVC。

使用 GCE (未动态置备)创建手动置备的磁盘。然后创建一个 持久性卷,以连接到新的 GCE 磁盘(pv-manual-gce.yaml)。

例 28.20. 手动 PV 对象片段

apiVersion: v1
kind: PersistentVolume
metadata:
 name: pv-manual-gce
spec:
 capacity:
   storage: 35Gi
 accessModes:
   - ReadWriteMany
 gcePersistentDisk:
   readOnly: false
   pdName: the-newly-created-gce-PD
   fsType: ext4

执行对象定义文件:

# oc create -f pv-manual-gce.yaml

现在再次查看 PV。请注意,pv-manual-gce可用

# oc get pv
NAME                                       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM                     REASON    AGE
pv-manual-gce                              35Gi       RWX           Retain          Available                                       4s
pvc-a9f70544-8bfd-11e6-9962-42010af00004   5Gi        RWX           Delete          Bound       rh-eng/pvc-engineering2             12m
pvc-ba4612ce-8b4d-11e6-9962-42010af00004   5Gi        RWO           Delete          Bound       mytest/gce-dyn-claim1               21h
pvc-e9b4fef7-8bf7-11e6-9962-42010af00004   10Gi       RWX           Delete          Bound       rh-eng/pvc-engineering              53m

现在,创建与 generic-pvc.yaml PVC 定义相同的另一个声明,但更改名称且不设置存储类名称。

例 28.21. 声明对象定义

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: pvc-engineering3
spec:
 accessModes:
  - ReadWriteMany
 resources:
   requests:
     storage: 15Gi

因为在这个实例中启用了 默认 StorageClass,所以手动创建的 PV 不满足声明请求。用户接收新的动态置备的持久性卷。

# oc get pvc
NAME               STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
pvc-engineering    Bound     pvc-e9b4fef7-8bf7-11e6-9962-42010af00004   10Gi       RWX           1h
pvc-engineering2   Bound     pvc-a9f70544-8bfd-11e6-9962-42010af00004   5Gi        RWX           19m
pvc-engineering3   Bound     pvc-6fa8e73b-8c00-11e6-9962-42010af00004   15Gi       RWX           6s
重要

由于在这个系统上启用了 默认 StorageClass,因此手动创建的持久性卷以通过上述声明绑定且没有绑定新的动态置备的卷,所以需要在默认 StorageClass 中创建 PV。

由于在这个系统中启用了 默认 StorageClass,您需要在手动创建的持久性卷的默认 StorageClass 中创建 PV,以便绑定到上述声明,且没有绑定到该声明的新动态置备卷。

要解决这个问题,cluster-adminstorage-admin 用户只需要创建另一个 GCE 磁盘或删除第一个手动 PV,并使用分配 StorageClass 名称(pv-manual-gce2.yaml)的 PV 对象定义:

例 28.22. 使用 default StorageClass 名称的手动 PV Spec

apiVersion: v1
kind: PersistentVolume
metadata:
 name: pv-manual-gce2
spec:
 capacity:
   storage: 35Gi
 accessModes:
   - ReadWriteMany
 gcePersistentDisk:
   readOnly: false
   pdName: the-newly-created-gce-PD
   fsType: ext4
 storageClassName: generic 1
1
之前创建的 通用 StorageClass 的名称。

执行对象定义文件:

# oc create -f pv-manual-gce2.yaml

列出 PV:

# oc get pv
NAME                                       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM                     REASON    AGE
pv-manual-gce                              35Gi       RWX           Retain          Available                                       4s 1
pv-manual-gce2                             35Gi       RWX           Retain          Bound       rh-eng/pvc-engineering3             4s 2
pvc-a9f70544-8bfd-11e6-9962-42010af00004   5Gi        RWX           Delete          Bound       rh-eng/pvc-engineering2             12m
pvc-ba4612ce-8b4d-11e6-9962-42010af00004   5Gi        RWO           Delete          Bound       mytest/gce-dyn-claim1               21h
pvc-e9b4fef7-8bf7-11e6-9962-42010af00004   10Gi       RWX           Delete          Bound       rh-eng/pvc-engineering              53m
1
原始的手动 PV 仍未绑定且可用。这是因为在 默认 StorageClass 中没有创建它。
2
第二个 PVC(除名称以外)绑定到 Available 手动创建 PV pv-manual-gce2
重要

请注意,所有动态部署的卷都默认为 RECLAIMPOLICY Delete。当 PVC 动态绑定到 PV 后,GCE 卷会被删除,并会丢失所有数据。但是,手动创建的 PV 的默认 RECLAIMPOLICYRetain

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.