在集群中安装 Portworx

在 IBM Cloud 目录中供应 Portworx 服务实例。 创建服务实例后,使用 Helm 在集群上安装最新的 Portworx 企业版 (px-enterprise)。 此外,Stork 还安装在您的 Red Hat OpenShift on IBM Cloud 集群上。 Stork 是 Portwortx 存储调度程序。 借助 Stork,您可以将 Pod 与其数据进行同地部署,并创建和恢复 Portworx 卷的快照。

在寻找有关如何更新或除去 Portworx 的指示信息? 参见 更新 Portworx移除 Portworx

蒙特利尔区域的私有集群目前尚不支持 Portworx Enterprise 和 Portworx 备份的默认安装方式。 如需在蒙特利尔的私有集群中安装 Portworx Enterprise 或 Portworx 备份,请联系 Portworx 支持团队。 如需了解更多信息,请参阅 Portworx 支持

开始之前:

要安装 Portworx,请执行以下操作:

  1. “IBM Cloud”目录中打开“Portworx”服务,并按以下方式填写相关字段:

    1. 选择 Red Hat OpenShift on IBM Cloud 集群所在的区域。

    2. 查看 Portworx 定价信息。

    3. 输入 Portworx 服务实例的名称。

    4. 选择集群所在的资源组。

    5. 标记字段中,输入要安装 Portworx 的集群的名称。 创建 Portworx 服务实例后,您将无法看到安装了 Portworx 的集群。 为了日后更轻松地找到该集群,请确保输入集群名称和所有其他信息作为标记。

    6. 输入 IBM Cloud API 密钥以检索您有权访问的集群的列表。 如果没有 API 密钥,请参阅管理用户 API 密钥。 输入 API 密钥后,将显示 Kubernetes 或 OpenShift 集群名称 字段。

    7. 输入唯一的 Portworx 集群名称

    8. 云驱动器 菜单中:

      1. 选择 使用云驱动器 (仅限 VPC 集群) 为 Portworx动态供应 Block Storage for VPC。 选择 使用云驱动器后,选择要供应的块存储驱动器的 存储类名大小
      2. 选择 使用已连接的驱动器 (经典,VPC 或 Satellite) 以使用已连接到工作程序节点的块存储器。
    9. Portworx metadata key-value store 下拉列表中,选择要用于存储 Portworx 元数据的 key-value store 的类型。 选择 Portworx KVDB 以在 Portworx 安装期间自动创建键值存储,或者如果要使用现有 Databases for etcd 实例,请选择 Databases for etcd。 如果选择 Databases for etcd,那么将显示 Etcd API 端点Etcd 密钥名称 字段。

    10. 名称空间: 输入要在其中部署 Portworx 资源的名称空间。

    11. 仅 Databases for etcd 必需: 输入 Databases for etcd 服务实例的信息。

      1. 检索 etcd 端点和 Kubernetes 私钥的名称(即,先前为 Databases for etcd 服务实例创建的 Kubernetes 私钥)。
      2. Etcd API 端点字段中,输入您先前检索到的 Databases for etcd 服务实例的 API 端点。 请确保以 etcd:<etcd_endpoint1>;etcd:<etcd_endpoint2> 的格式输入端点。 如果有多个端点,请包含所有端点,并用分号 (;) 来分隔各端点。
      3. Etcd 私钥名称字段中,输入在集群中创建的用于存储 Databases for etcd 服务凭证的 Kubernetes 私钥的名称。
    12. Kubernetes 或 OpenShift 集群名称下拉列表中,选择要安装 Portworx 的集群。 如果未列出您的集群,请确保选择正确的 IBM Cloud 区域。 如果区域正确,请验证您是否具有查看和使用集群的正确许可权。 请确保选择的集群符合 Portworx 的最低硬件要求

    13. 可选:从 “Portworx”密钥存储类型下拉列表中,选择您要用于存储卷加密密钥的密钥存储类型。

      • Kubernetes 私钥:如果要在集群的 Kubernetes 私钥中存储您自己的定制密钥来加密卷,请选择此选项。 安装 Portworx 之前,私钥不能存在。 您可以在安装 Portworx 之后创建私钥。 如需了解更多信息,请参阅 Portworx 文档
      • IBM Key Protect:如果要使用 IBM Key Protect 中的根密钥来加密卷,请选择此选项。 确保按照指示信息来创建 IBM Key Protect 服务实例,并在安装 Portworx 之前,在 portworx 项目的 Kubernetes 私钥中存储用于访问服务实例的凭证。
    14. 可选: 如果要设置日志设备或 KVDB 设备,请在 高级选项 字段中输入设备详细信息。 从日志设备的以下选项中进行选择。

      • 输入 j;auto 以允许 Portworx 在要用于日志的某个块存储设备上自动创建 3 GB 分区。
      • 输入 j;</device/path> 以将特定设备用于日志。 例如,输入 j;/dev/vde 以使用位于 /dev/vde 的磁盘。 要查找要用于日志的设备的路径,请登录到工作程序节点并运行 lsblk
      • 输入 kvdb_dev;<device path> 以指定要在其中存储内部 KVDB 数据的设备。 例如,kvdb_dev;/dev/vdd。 要查找要使用的设备的路径,请登录到工作程序节点并运行 lsblk。 要将特定设备用于 KVDB 数据,必须具有 3GB 的可用存储设备或至少 3 个工作程序节点上的可用存储设备。 此外,这些设备在每个工作节点上必须位于同一路径上。 例如: /dev/vdd
  2. 单击创建以开始在集群中安装 Portworx。 此过程可能需要几分钟才能完成。 服务详细信息页面将打开,其中包含有关如何验证 Portworx 安装,创建持久卷声明 (PVC) 以及将 PVC 安装到应用程序的指示信息。

  3. IBM Cloud 资源列表中,找到您创建的 Portworx 服务。

  4. 查看 Status 列以确定安装是成功还是失败。 阶段状态更新可能需要几分钟时间。

  5. 如果 Status 更改为 Provision failure,请按照指示信息来启动对安装失败原因的故障诊断。

  6. 如果 Status 更改为 Provisioned,请验证 Portworx 安装是否成功完成,以及是否已识别到所有本地磁盘并已将这些磁盘添加到 Portworx 存储层。

    1. 列出 kube-system 项目中的 Portworx pod。 如果看到一个或多个 portworxstorkstork-scheduler pod,说明安装成功。 Pod 的数量等于您的 Portworx 集群中的工作节点数量。 所有 pod 都必须处于 Running 状态。
        oc get pods -n kube-system | grep 'portworx\|stork'
        ```
        示例输出
        ```sh {: screen}
        portworx-594rw                          1/1       Running     0          20h
        portworx-rn6wk                          1/1       Running     0          20h
        portworx-rx9vf                          1/1       Running     0          20h
        stork-6b99cf5579-5q6x4                  1/1       Running     0          20h
        stork-6b99cf5579-slqlr                  1/1       Running     0          20h
        stork-6b99cf5579-vz9j4                  1/1       Running     0          20h
        stork-scheduler-7dd8799cc-bl75b         1/1       Running     0          20h
        stork-scheduler-7dd8799cc-j4rc9         1/1       Running     0          20h
        stork-scheduler-7dd8799cc-knjwt         1/1       Running     0          20h
        ```
    2. 登录到其中一个 `portworx` pod,并列出 Portworx 集群的状态。
    ```sh {: pre}
        oc exec <portworx_pod> -it -n kube-system -- /opt/pwx/bin/pxctl status
        ```
        示例输出
        ```sh {: screen}
        Status: PX is operational
        License: Trial (expires in 30 days)
        Node ID: 10.176.48.67
        IP: 10.176.48.67
        Local Storage Pool: 1 pool
        POOL    IO_PRIORITY    RAID_LEVEL    USABLE    USED    STATUS    ZONE    REGION
          0    LOW        raid0        20 GiB    3.0 GiB    Online    dal10    us-south
        Local Storage Devices: 1 device
        Device    Path                        Media Type        Size        Last-Scan
            0:1    /dev/mapper/3600a09803830445455244c4a38754c66    STORAGE_MEDIUM_MAGNETIC    20 GiB        17 Sep 18 20:36 UTC
                total                            -            20 GiB
        Cluster Summary
        Cluster ID: mycluster
            Cluster UUID: a0d287ba-be82-4aac-b81c-7e22ac49faf5
        Scheduler: kubernetes
        Nodes: 2 node(s) with storage (2 online), 1 node(s) without storage (1 online)
          IP        ID        StorageNode    Used    Capacity    Status    StorageStatus    Version        Kernel            OS
          10.184.58.11    10.184.58.11    Yes        3.0 GiB    20 GiB        Online    Up        1.5.0.0-bc1c580    4.4.0-133-generic    Ubuntu 20.04.5 LTS
          10.176.48.67    10.176.48.67    Yes        3.0 GiB    20 GiB        Online    Up (This node)    1.5.0.0-bc1c580    4.4.0-133-generic    Ubuntu 20.04.5 LTS
          10.176.48.83    10.176.48.83    No        0 B    0 B        Online    No Storage    1.5.0.0-bc1c580    4.4.0-133-generic    Ubuntu 20.04.5 LTS
        Global Storage Pool
          Total Used        :  6.0 GiB
          Total Capacity    :  40 GiB
        ```
    3. 通过查看 CLI 输出的 **Cluster Summary** 部分中的 **StorageNode** 列,验证希望包含在 Portworx 存储层中的所有工作程序节点是否都包含在内。 `Yes` 位于存储层的 worker 节点在 **StorageNode** 列中显示为xml-ph-0000@deepl.internal。
    
        由于 Portworx 在集群中作为 DaemonSet 运行,当部署 Portworx 时,系统会自动检测现有工作节点上的原始块存储,并将这些存储添加到 Portworx 数据层中。 若向集群添加工作节点并在这些节点上配置原始块存储,请在新增的工作节点上重启 Portworx Pod,以便 DaemonSet 能检测到存储卷。
        {: note}
    
    4. 通过查看 CLI 输出的 **Cluster Summary** 部分中的 **Capacity** 列,验证每个存储节点是否都已列出并具有正确的原始块存储量。
    
    5. 查看分配给属于 Portworx 集群的磁盘的 Portworx I/O 分类。 在设置 Portworx 集群期间,将检查每个磁盘以确定设备的性能概要文件。 概要文件分类取决于工作程序节点连接到的网络的速度以及您拥有的存储设备类型。 SDS 工作程序节点的磁盘分类为 `high`。 如果您手动将磁盘挂载到虚拟工作节点上,则由于虚拟工作节点网络速度较慢,这些磁盘将被归类为 `low`。
    ```sh {: pre}
        oc exec -it <portworx_pod> -n kube-system -- /opt/pwx/bin/pxctl cluster provision-status
        ```
        示例输出
    
        ```sh {: screen}
        NODE        NODE STATUS    POOL    POOL STATUS    IO_PRIORITY    SIZE    AVAILABLE    USED    PROVISIONED    RESERVEFACTOR    ZONE    REGION        RACK
        10.184.58.11    Up        0    Online        LOW        20 GiB    17 GiB        3.0 GiB    0 B        0        dal12    us-south    default
        10.176.48.67    Up        0    Online        LOW        20 GiB    17 GiB        3.0 GiB    0 B        0        dal10    us-south    default
        10.176.48.83    Up        0    Online        HIGH        3.5 TiB    3.5 TiB        10 GiB    0 B        0        dal10    us-south    default
        ```
    
    
    

创建 Portworx 卷

开始使用 Kubernetes 动态配置功能创建 Portworx 卷。

  1. 列出集群中的可用存储类,并检查是否可以使用在 Portworx 安装期间设置的现有 Portworx 存储类。 预定义的存储类已针对数据库使用情况进行优化,并可跨 pod 共享数据。

    oc get sc | grep portworx
    

    要查看存储类的详细信息,请运行 oc describe storageclass <storageclass_name>

  2. 如果不想使用现有存储类,请创建定制存储类。 有关可在存储类中指定的受支持选项的完整列表,请参阅《 使用动态配额 》。

    1. 为存储类创建配置文件。
        kind: StorageClass
        apiVersion: storage.k8s.io/v1
        metadata:
          name: <storageclass_name>
        provisioner: kubernetes.io/portworx-volume
        parameters:
          repl: "<replication_factor>"
          secure: "<true_or_false>"
          priority_io: "<io_priority>"
          shared: "<true_or_false>"
        ```
        `metadata.name`
        :   输入存储类的名称。
    
        `parameters.repl`
        :   输入要跨不同工作程序节点存储的数据的副本数。 允许的数字为 `1`,`2`  `3`。 例如,如果您输入 `3`,那么您的数据就会在您的 Portworx 集群中的三个不同工作节点上进行复制。 要以高可用性方式存储数据,请使用多专区集群,并跨不同专区中的 3 个工作程序节点复制数据。
                        您必须拥有足够的 worker 节点来满足您的复制需求。 例如,如果有两个工作程序节点,但指定三个副本,那么使用此存储类创建 PVC 会失败。
            {: note}
    
        `parameters.secure`
        :   指定是否要使用 IBM Key Protect 对卷中的数据进行加密。 在以下选项之间进行选择。
            - `true`: 输入 `true`,以启用 Portworx 卷的加密功能。 要加密卷,您必须具有 IBM Key Protect 服务实例以及用于保存客户根密钥的 Kubernetes 私钥。 有关如何为 Portworx 卷设置加密的更多信息,请参阅[加密 Portworx 卷](/docs/openshift?topic=openshift-storage_portworx_encryption)。
            - `false`: 当您登录 `false` 时,您的 Portworx 卷并未加密。 如果您未指定此选项,您的 Portworx 卷默认情况下不会被加密。 即使您在存储类中禁用了加密,也可以选择在 PVC 中启用卷加密。  PVC 中创建的设置优先于存储类中的设置。
    
        `parameters.priority_io`
        :   输入要为数据请求的 Portworx I/O 优先级。 可用选项为 `high`、`medium`  `low`。 在设置 Portworx 集群期间,将检查每个磁盘以确定设备的性能概要文件。 配置文件的分类取决于您的工作节点网络带宽以及存储设备的类型。 SDS 工作程序节点的磁盘分类为 `high`。 如果您手动将磁盘挂载到虚拟工作节点上,则由于虚拟工作节点网络速度较慢,这些磁盘将被归类为 `low`。
            :   当您创建具有存储类的 PVC 时,在 `parameters/repl` 中指定的副本数量将覆盖 I/O 优先级。 例如,如果指定要在高速磁盘上存储的 3 个副本,但在集群中只有一个工作程序节点具有高速磁盘,那么 PVC 创建仍会成功。 数据会在高速和低速磁盘上进行复制。
    
        `parameters.shared`
        :   定义是否要允许多个 pod 访问同一卷。 在以下选项之间进行选择:
            - True:如果将此选项设置为 `true`,则分布在不同区域的工作节点上的多个Pod可以访问同一个卷。
            - 错误:如果将此选项设置为 `false`,则只有当多个Pod部署在连接了该卷所依托的物理磁盘的工作节点上时,才能从这些Pod访问该卷。 如果您的 Pod 部署在另一个工作节点上,该 Pod 将无法访问该卷。
    
    2. 创建存储类。
    ```sh {: pre}
        oc apply -f storageclass.yaml
        ```
    3. 验证存储类是否已创建。
    ```sh {: pre}
        oc get sc
        ```
    
  3. 创建持久卷声明 (PVC)。

    1. 为 PVC 创建配置文件。
        kind: PersistentVolumeClaim
        apiVersion: v1
        metadata:
          name: mypvc
        spec:
          accessModes:
            - <access_mode>
          resources:
            requests:
              storage: <size>
          storageClassName: portworx-shared-sc
        ```
        `metadata.name`
        :   为您的 PVC 输入一个名称,例如 `mypvc`。
    
        `spec.accessModes`
        :   输入您要使用的 [Kubernetes 访问模式](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes){: external}。
    
        `resources.requests.storage`
        :   输入要从 Portworx 集群分配的存储量(以千兆字节为单位)。 例如,要从 Portworx 集群分配 2 千兆字节,请输入 `2Gi`。 可以指定的存储量受 Portworx 集群中可用存储量的限制。 如果您在存储类中指定的复制因子大于 1,则您在 PVC 中指定的存储空间将在多个工作节点上被预留。
    
        `spec.storageClassName`
        :   输入先前选择或创建并要用于供应 PV 的存储类的名称。 该示例 YAML 文件使用了 `portworx-shared-sc` 存储类。
    
    2. 创建 PVC。
    ```sh {: pre}
        oc apply -f pvc.yaml
        ```
    3. 验证 PVC 是否已创建并绑定到持久卷 (PV)。 此过程可能需要几分钟时间。
    ```sh {: pre}
        oc get pvc
        ```
    
    
    

将卷安装到应用程序

要从应用程序访问存储器,必须将 PVC 安装到应用程序。

  1. 为安装 PVC 的部署创建配置文件。

    有关如何使用 Portworx 部署有状态集的提示,请参阅 StatefulSets。 Portworx 文档还包含以下部署示例:CassandraElasticSearch (搭配Kibana) WordPress Kafka (搭配 MySQL )

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <deployment_name>
      labels:
        app: <deployment_label>
    spec:
      selector:
        matchLabels:
          app: <app_name>
      template:
        metadata:
          labels:
            app: <app_name>
        spec:
          schedulerName: stork
          containers:
          - image: <image_name>
            name: <container_name>
          securityContext:
              fsGroup: <group_ID>
            volumeMounts:
            - name: <volume_name>
              mountPath: /<file_path>
          volumes:
          - name: <volume_name>
            persistentVolumeClaim:
              claimName: <pvc_name>
    
    metadata.labels.app
    部署的标签。
    spec.selector.matchLabels.appspec.template.metadata.labels.app
    应用程序的标签。
    template.metadata.labels.app
    部署的标签。
    spec.schedulerName
    Stork 用作您的 Portworx 集群的调度器。 借助 Stork,您可以将 Pod 与其数据部署在同一位置,在发生存储错误时实现 Pod 的无缝迁移,并更轻松地创建和恢复 Portworx 卷的快照。
    spec.containers.image
    要使用的映像的名称。 要列出 IBM Cloud Container Registry 帐户中的可用映像,请运行 ibmcloud cr image-list
    spec.containers.name
    要部署到集群的容器的名称。
    spec.containers.securityContext.fsGroup
    可选:若要使用非 root 用户访问存储,请在部署 YAML 文件的 fsGroup 部分中指定 Pod 的安全上下文 ,并定义要授予访问权限的用户集。 如需了解更多信息,请参阅 《 使用非root用户访问 Portworx 卷 》。
    spec.containers.volumeMounts.mountPath
    在容器中安装卷的目录的绝对路径。 如果您想在不同的应用程序之间共享一个卷,可以为每个应用程序指定 卷的子路径
    spec.containers.volumeMounts.name
    要安装到 pod 中的卷的名称。
    volumes.name
    要安装到 pod 中的卷的名称。 通常,该名称与 volumeMounts/name 相同。
    volumes.persistentVolumeClaim.claimName
    绑定要使用的 PV 的 PVC 的名称。
  2. 创建部署。

    oc apply -f deployment.yaml
    
  3. 验证 PV 是否已成功安装到应用程序。

    oc describe deployment <deployment_name>
    

    安装点位于 Volume Mounts 字段中,卷位于 Volumes 字段中。

    Volume Mounts:
            /var/run/secrets/kubernetes.io/serviceaccount from default-token-tqp61 (ro)
            /volumemount from myvol (rw)
    ...
    Volumes:
        myvol:
        Type:    PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:    mypvc
        ReadOnly:    false
    
  4. 验证是否可以将数据写入 Portworx 集群。

    1. 登录到安装 PV 的 pod。
        oc exec <pod_name> -it bash
        ```
    2. 浏览到在应用程序部署中定义的卷安装路径。
    3. 创建文本文件。
    ```sh {: pre}
        echo "This is a test" > test.txt
        ```
    4. 读取所创建的文件。
    ```sh {: pre}
        cat test.txt
        ```