4.2. 使用 Azure 持久性存储

OpenShift Container Platform 支持 Microsoft Azure Disk 卷。您可以使用 Azure 为 OpenShift Container Platform 集群置备永久性存储。我们假设您对 Kubernetes 和 Azure 有一定的了解。Kubernetes 持久性卷框架允许管理员提供带有持久性存储的集群,并使用户可以在不了解底层存储架构的情况下请求这些资源。Azure 磁盘卷可以动态部署。持久性卷不与某个特定项目或命名空间相关联,它们可以在 OpenShift Container Platform 集群间共享。持久性卷声明是针对某个项目或者命名空间的,相应的用户可请求它。

重要

OpenShift Container Platform 4.11 及之后的版本为 Azure Disk in-tree 卷插件提供自动迁移到对应的 CSI 驱动程序。

CSI 自动迁移应该可以无缝进行。迁移不会改变您使用所有现有 API 对象的方式,如持久性卷、持久性卷声明和存储类。有关迁移的更多信息,请参阅 CSI 自动迁移

重要

存储的高可用性功能由底层的存储架构提供。

其他资源

4.2.1. 创建 Azure 存储类

存储类用于区分和划分存储级别和使用。通过定义存储类,用户可以获得动态置备的持久性卷。

流程

  1. 在 OpenShift Container Platform 控制台中点击 StorageStorage Classes
  2. 在存储类概述中,点击 Create Storage Class
  3. 在出现的页面中定义所需选项。

    1. 输入一个名称来指代存储类。
    2. 输入描述信息(可选)。
    3. 选择 reclaim 策略。
    4. 从下拉列表中选择 kubernetes.io/azure-disk

      1. 输入存储帐户类型。这与您的 Azure 存储帐户 SKU 层对应。有效选项为 Premium_LRSStandard_LRSStandardSSD_LRSUltraSSD_LRS
      2. 输入帐户类型。有效选项为 shareddedicatedmanaged.

        重要

        红帽仅在存储类中支持使用 kind: Managed

        使用 SharedDedicated 时,Azure 会创建非受管磁盘,而 OpenShift Container Platform 为机器 OS(root)磁盘创建一个受管磁盘。但是,因为 Azure Disk 不允许在节点上同时使用受管和非受管磁盘,所以使用 SharedDedicated 创建的非受管磁盘无法附加到 OpenShift Container Platform 节点。

    5. 根据需要为存储类输入附加参数。
  4. Create 创建存储类。

4.2.2. 创建持久性卷声明

先决条件

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

流程

  1. 在 OpenShift Container Platform 控制台中,点击 StoragePersistent Volume Claims
  2. 在持久性卷声明概述页中,点 Create Persistent Volume Claim
  3. 在出现的页面中定义所需选项。

    1. 从下拉菜单中选择之前创建的存储类。
    2. 输入存储声明的唯一名称。
    3. 选择访问模式。此选择决定了存储声明的读写访问权限。
    4. 定义存储声明的大小。
  4. 点击 Create 创建持久性卷声明,并生成一个持久性卷。

4.2.3. 卷格式

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

这将可以使用未格式化的 Azure 卷作为持久性卷,因为 OpenShift Container Platform 在第一次使用前会对其进行格式化。

4.2.4. 用于部署带有使用 PVC 的巨型磁盘的机器的机器集

您可以创建在 Azure 上运行的机器集,该机器集用来部署带有巨型磁盘的机器。ultra 磁盘是高性能存储,用于要求最苛刻的数据工作负载。

in-tree 插件和 CSI 驱动程序都支持使用 PVC 启用巨型 磁盘。您还可以在不创建 PVC 的情况下将巨型磁盘部署为数据磁盘。

4.2.4.1. 使用机器集创建带有巨型磁盘的机器

您可以通过编辑机器集 YAML 文件在 Azure 上部署带有巨型磁盘的机器。

先决条件

  • 已有 Microsoft Azure 集群。

流程

  1. 运行以下命令,复制现有的 Azure MachineSet 自定义资源(CR)并编辑它:

    $ oc edit machineset <machine-set-name>

    其中 <machine-set-name> 是您要使用巨型磁盘置备机器的机器集。

  2. 在指示的位置中添加以下行:

    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    spec:
      template:
        spec:
          metadata:
            labels:
              disk: ultrassd 1
          providerSpec:
            value:
              ultraSSDCapability: Enabled 2
    1
    指定标签,用于选择此机器集创建的节点。此流程使用 disk.ulssd 用于这个值。
    2
    这些行支持使用 ultra 磁盘。
  3. 运行以下命令,使用更新的配置创建机器集:

    $ oc create -f <machine-set-name>.yaml
  4. 创建一个包含以下 YAML 定义的存储类:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ultra-disk-sc 1
    parameters:
      cachingMode: None
      diskIopsReadWrite: "2000" 2
      diskMbpsReadWrite: "320" 3
      kind: managed
      skuname: UltraSSD_LRS
    provisioner: disk.csi.azure.com 4
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer 5
    1
    指定存储类的名称。此流程使用 ultra-disk-sc 作为这个值。
    2
    指定存储类的 IOPS 数量。
    3
    指定存储类的吞吐量,单位为 MBps。
    4
    对于 Azure Kubernetes Service(AKS)版本 1.21 或更高版本,请使用 disk.csi.azure.com。对于 AKS 的早期版本,请使用 kubernetes.io/azure-disk
    5
    可选:指定此参数以等待创建使用磁盘的 pod。
  5. 创建一个持久性卷声明(PVC)来引用包含以下 YAML 定义的 ultra-disk-sc 存储类:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ultra-disk 1
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: ultra-disk-sc 2
      resources:
        requests:
          storage: 4Gi 3
    1
    指定 PVC 的名称。此流程使用 ultra-disk 作为这个值。
    2
    此 PVC 引用了 ultra-disk-sc 存储类。
    3
    指定存储类的大小。最小值为 4Gi
  6. 创建包含以下 YAML 定义的 pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-ultra
    spec:
      nodeSelector:
        disk: ultrassd 1
      containers:
      - name: nginx-ultra
        image: alpine:latest
        command:
          - "sleep"
          - "infinity"
        volumeMounts:
        - mountPath: "/mnt/azure"
          name: volume
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: ultra-disk 2
    1
    指定启用巨型磁盘的机器集标签。此流程使用 disk.ulssd 用于这个值。
    2
    这个 pod 引用了 ultra-disk PVC。

验证

  1. 运行以下命令验证机器是否已创建:

    $ oc get machines

    机器应处于 Running 状态。

  2. 对于正在运行并附加节点的机器,请运行以下命令验证分区:

    $ oc debug node/<node-name> -- chroot /host lsblk

    在这个命令中,oc debug node/<node-name> 会在节点 <node-name> 上启动一个 debugging shell,并传递一个带有 -- 的命令。传递的命令 chroot /host 提供对底层主机操作系统二进制文件的访问,lsblk 显示连接至主机操作系统计算机的块设备。

后续步骤

  • 要在 pod 中使用大量磁盘,请创建使用挂载点的工作负载。创建一个类似以下示例的 YAML 文件:

    apiVersion: v1
    kind: Pod
    metadata:
      name: ssd-benchmark1
    spec:
      containers:
      - name: ssd-benchmark1
        image: nginx
        ports:
          - containerPort: 80
            name: "http-server"
        volumeMounts:
        - name: lun0p1
          mountPath: "/tmp"
      volumes:
        - name: lun0p1
          hostPath:
            path: /var/lib/lun0p1
            type: DirectoryOrCreate
      nodeSelector:
        disktype: ultrassd

4.2.4.2. 启用 ultra 磁盘的机器集的故障排除资源

使用本节中的信息从您可能会遇到的问题了解和恢复。

4.2.4.2.1. 无法挂载由巨型磁盘支持的持久性卷声明

如果挂载了被巨型磁盘支持的持久性卷声明的问题,pod 会一直处于 ContainerCreating 状态,并触发警报。

例如,如果没有在支持托管 pod 的节点的机器上设置 additionalCapabilities.ultraSSDEnabled 参数,则会出现以下出错信息:

StorageAccountType UltraSSD_LRS can be used only when additionalCapabilities.ultraSSDEnabled is set.
  • 要解决这个问题,请运行以下命令来描述 pod:

    $ oc -n <stuck_pod_namespace> describe pod <stuck_pod_name>