3.5. 使用 Cinder 的持久性存储

OpenShift Container Platform 支持 OpenStack Cinder。我们假设您对 Kubernetes 和 OpenStack 有一定的了解。

Cinder 卷可以动态置备。持久性卷不与某个特定项目或命名空间相关联,它们可以在 OpenShift Container Platform 集群间共享。持久性卷声明是针对某个项目或者命名空间的,相应的用户可请求它。

其他资源

  • 如需了解有关 OpenStack Block Storage 如何为虚拟硬盘提供持久块存储管理的信息,请参阅 OpenStack Cinder

3.5.1. 使用 Cinder 手动置备

当存储可以被挂载为 OpenShift Container Platform 中的卷之前,它必须已存在于底层的存储系统中。

先决条件

  • 为 Red Hat OpenStack Platform(RHOSP)配置 OpenShift Container Platform
  • Cinder 卷 ID

3.5.1.1. 创建持久性卷

您必须在对象定义中定义持久性卷 (PV) ,然后才能在 OpenShift Container Platform 中创建它:

流程

  1. 将对象定义保存到文件中。

    cinder-persistentvolume.yaml

    apiVersion: "v1"
    kind: "PersistentVolume"
    metadata:
      name: "pv0001" 1
    spec:
      capacity:
        storage: "5Gi" 2
      accessModes:
        - "ReadWriteOnce"
      cinder: 3
        fsType: "ext3" 4
        volumeID: "f37a03aa-6212-4c62-a805-9ce139fab180" 5

    1
    持久性卷声明或 Pod 使用的卷名称。
    2
    为这个卷分配的存储量。
    3
    为 Red Hat OpenStack Platform(RHOSP)Cinder 卷指定 cinder
    4
    当这个卷被第一次挂载时,文件系统会被创建。
    5
    要使用的 Cinder 卷。
    重要

    在卷被格式化并置备后,不要更改 fstype 参数的值。更改此值可能会导致数据丢失和 Pod 失败。

  2. 创建在上一步中保存的对象定义文件。

    $ oc create -f cinder-persistentvolume.yaml

3.5.1.2. 持久性卷格式化

因为 OpenShift Container Platform 在首次使用卷前会进行格式化,所以可以使用未格式化的 Cinder 卷作为 PV。

在 OpenShift Container Platform 挂载卷并将其传递给容器之前,它会检查在 PV 定义中是否包含由 fsType 参数指定的文件系统。如果没有使用文件系统格式化该设备,该设备中的所有数据都会被删除,并使用指定的文件系统自动格式化该设备。

3.5.1.3. Cinder 卷安全

如果在应用程序中使用 Cinder PV,请在其部署配置中配置安全性。

前提条件

  • 必须创建一个使用适当 fsGroup 策略的 SCC。

流程

  1. 创建一个服务帐户并将其添加到 SCC:

    $ oc create serviceaccount <service_account>
    $ oc adm policy add-scc-to-user <new_scc> -z <service_account> -n <project>
  2. 在应用程序的部署配置中,提供服务帐户名称和 securityContext

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: frontend-1
    spec:
      replicas: 1  1
      selector:    2
        name: frontend
      template:    3
        metadata:
          labels:  4
            name: frontend 5
        spec:
          containers:
          - image: openshift/hello-openshift
            name: helloworld
            ports:
            - containerPort: 8080
              protocol: TCP
          restartPolicy: Always
          serviceAccountName: <service_account> 6
          securityContext:
            fsGroup: 7777 7
    1
    要运行的 Pod 副本数。
    2
    要运行的 Pod 的标签选择器。
    3
    控制器创建的 Pod 模板。
    4
    Pod 上的标签。它们必须包含标签选择器中的标签。
    5
    扩展任何参数后的最大名称长度为 63 个字符。
    6
    指定您创建的服务帐户。
    7
    为 Pod 指定 fsGroup