IBM Cloud Docs
设置 Block Storage for VPC

设置 Block Storage for VPC

Block Storage for VPC 为您的虚拟服务器实例提供虚拟机监控程序安装的高性能数据存储,您可以在VPC内进行配置。

您可以在具有不同 GB 大小和 IOPS 的预定义存储层之间进行选择,以满足工作负载的需求。 要了解 Block Storage for VPC 是否为适合您的存储选项,请参阅选择存储解决方案。 有关定价信息,请参阅 Block Storage for VPC的定价

VPC 群集默认启用Block Storage for VPC群集插件。

IBM Cloud Block Storage for VPC

在此快速入门指南中,通过创建 PVC 以动态供应卷,在集群中创建 10Gi 5IOPS 层 Block Storage for VPC 卷。 然后,创建用于安装 PVC 的应用程序部署。

只要在同一节点上调度 Block Storage for VPC 卷,这些卷可由多个 pod 安装。

  1. 为 PVC 创建文件并将其命名为 pvc.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      storageClassName: ibmc-vpc-block-5iops-tier
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
    
  2. 在集群中创建 PVC。

    oc apply -f pvc.yaml
    
  3. 绑定 PVC 后,创建使用 PVC 的应用程序部署。 为部署创建文件,并将其命名为 deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
        name: my-deployment
        labels:
          app: my-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - image: ngnix # Your containerized app image.
            name: my-container
            volumeMounts:
            - name: my-volume
              mountPath: /mount-path
          volumes:
          - name: my-volume
            persistentVolumeClaim:
              claimName: my-pvc
    
  4. 在集群中创建部署。

    oc apply -f deployment.yaml
    

有关更多信息,请参阅以下链接。

向应用程序添加 Block Storage for VPC

选择 Block Storage for VPC 概要文件,并创建持久卷声明,以便为集群动态供应 Block Storage for VPC。 动态供应将自动创建匹配的持久卷,并在 IBM Cloud 帐户中订购物理存储设备。

  1. 决定能最好地满足您所需的容量和性能需求的 Block Storage for VPC 概要文件

  2. 为 Block Storage for VPC 概要文件选择相应的存储类。

    缺省情况下,所有 IBM 预定义的存储类都会为 Block Storage for VPC 设置 ext4 文件系统。 如果要使用其他文件系统(例如,xfsext3),请创建定制存储类

    • 10 IOPS/GB: ibmc-vpc-block-10iops-tieribmc-vpc-block-retain-10iops-tier
    • 5 IOPS/GB: ibmc-vpc-block-5iops-tieribmc-vpc-block-retain-5iops-tier
    • 3 IOPS/GB: ibmc-vpc-block-general-purposeibmc-vpc-block-retain-general-purpose
    • 定制: ibmc-vpc-block-customibmc-vpc-block-retain-custom
  3. 决定 Block Storage for VPC 配置。

    1. 选择存储器的大小。 确保您选择的 Block Storage for VPC 概要文件支持该大小。
    2. 选择在删除集群或持久卷声明 (PVC) 后是否要保留数据。
      • 如果要保留数据,请选择 retain 存储类。 删除 PVC 时,仅会删除 PVC。 持久卷 (PV)、IBM Cloud 帐户中的物理存储设备以及数据仍会存在。 要回收存储器并再次在集群中使用,必须除去 PV,并执行使用现有 Block Storage for VPC 的步骤。
      • 如果要在删除 PVC 时删除 PV、数据和物理 Block Storage for VPC,请选择不带 retain 的存储类。
  4. 创建配置文件以定义持久卷声明,并将配置保存为 YAML 文件。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <pvc_name> # Enter a name for your PVC.
    spec:
      accessModes:
      - <access-mode> # ReadWriteOnce or ReadWriteOncePod
      resources:
        requests:
          storage: 10Gi # Enter the size. Make sure that the size is supported in the profile that you chose.
      storageClassName: <storage_class> # Enter the storage class name that you selected earlier.
    
  5. 在集群中创建 PVC。

    oc apply -f pvc.yaml
    
  6. 验证 PVC 是否已创建并与 PV 绑定。 此过程可能需要几分钟时间。

    oc describe pvc <pvc_name>
    

    示例输出

    Name:          mypvv
    Namespace:     default
    StorageClass:  ibmc-vpc-block-5iops-tier
    Status:        Bound
    Volume:        
    Labels:        <none>
    Annotations:   oc.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"csi-block-pvc-good","namespace":"default"},"spec":{...
                volume.beta.kubernetes.io/storage-provisioner: vpc.block.csi.ibm.io
    Finalizers:    [kubernetes.io/pvc-protection]
    Capacity: 10Gi   
    Access Modes:  
    VolumeMode:    Filesystem
    Events:
        Type       Reason                Age               From                         Message
        ----       ------                ----              ----                         -------
        Normal     ExternalProvisioning  9s (x3 over 18s)  persistentvolume-controller  waiting for a volume to be created, either by external provisioner "vpc.block.csi.ibm.io" or manually created by system administrator
    Mounted By:  <none>
    
  7. 为应用程序创建部署配置文件,并将 PVC 安装到应用程序。

    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:
          containers:
          - image: <image_name>
            name: <container_name>
            volumeMounts:
            - name: <volume_name>
              mountPath: /<file_path>
          volumes:
          - name: <volume_name>
            persistentVolumeClaim:
              claimName: <pvc_name>
    
    labels.app
    在元数据部分中,输入部署的标签。
    matchLabels.applabels.app
    在规范选择器和模板元数据部分中,输入应用程序的标签。
    image
    指定您要使用的容器镜像的名称。 要列出 IBM Cloud Container Registry 帐户中的可用映像,请运行 ibmcloud cr image-list
    name
    指定要在 pod 中部署的容器的名称。
    mountPath
    在容器卷安装部分中,指定在容器中安装 PVC 的目录的绝对路径。
    name
    在“容器卷安装”部分中,输入要安装到 pod 的卷的名称。 可以输入所需的任何名称。
    name
    在“卷”部分中,输入要安装到 pod 的卷的名称。 通常情况下,这个名字与 volumeMounts.name 相同。
    claimName
    在卷持久卷声明部分中,输入先前创建的 PVC 的名称。
  8. 在集群中创建部署。

    oc apply -f deployment.yaml
    
  9. 验证 PVC 是否已成功安装到应用程序。 pod 可能需要几分钟时间才能进入 Running 状态。

    在部署应用程序期间,您可能会在 CLI 输出的 Unable to mount volumesEvents** 部分中看到间歇性的 ** 错误。 Block Storage for VPC 集群附加组件会自动重试将存储设备安装到您的应用程序中。 请多等待几分钟,以便存储器安装到应用程序。

    oc describe deployment <deployment_name>
    

    示例输出

    ...
    Volumes:
    myvol:
        Type:    PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:    mypvc
        ReadOnly:    false
    

使用现有 Block Storage for VPC 实例

如果您有现有的物理 Block Storage for VPC 设备想要在群集中使用,您可以手动创建PV和PVC来静态配置存储。

只能将卷连接到一个工作程序节点。 请确保卷与工作程序节点位于同一专区中,以便连接成功。

  1. 确定要连接到 VPC 集群中工作程序节点的卷。 注意音量ID

    ibmcloud is volumes
    
  2. 列出卷的详细信息。 请注意 大小区域IOPS。 这些值用于创建 PV。

    ibmcloud is volume <volume_id>
    
  3. 检索 VPC 集群中工作程序节点的列表。 请注意与存储卷位于同一专区中的工作程序节点的 专区

    ibmcloud oc worker ls -c <cluster_name>
    
  4. 可选:如果已使用 retain 存储类供应了物理 Block Storage for VPC 实例,那么在除去 PVC 时不会除去 PV 和物理存储器。 要在集群中使用物理 Block Storage for VPC 设备,必须先除去现有 PV。

    1. 列出集群中的 PV,并查找属于 Block Storage for VPC 设备的 PV。 该 PV 处于 released 状态。

      oc get pv
      
    2. 除去该 PV。

      oc delete pv <pv_name>
      
  5. 为 PV 创建配置文件。 包括您之前检索到的 ID 、大小 、区域IOPS

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: <pv_name> # Example: my-persistent-volume
    spec:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: <vpc_block_storage_size> # Example: 20Gi
      csi:
        driver: vpc.block.csi.ibm.io
        fsType: ext4
        volumeAttributes:
          iops: "<vpc_block_storage_iops>" # Example: "3000"
          volumeId: <vpc_block_storage_ID> # Example: a1a11a1a-a111-1111-1a11-1111a11a1a11
          zone: "<vpc_block_zone>" # Example: "eu-de-3"
          region: "<vpc_block_region>"
        volumeHandle: <vpc_block_storage_ID>
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: failure-domain.beta.kubernetes.io/zone
              operator: In
              values:
              - <worker_node_zone> # Example: eu-de-3
            - key: failure-domain.beta.kubernetes.io/region
              operator: In
              values:
              - <worker_node_region> # Example: eu-de
            - key: kubernetes.io/hostname
              operator: In
              values:
              - <worker_node_primary_IP>
      persistentVolumeReclaimPolicy: Retain
      storageClassName: ""
      volumeMode: Filesystem
    
    name
    在元数据部分中,输入 PV 的名称。
    storage
    在“规范容量”部分中,输入先前检索的 Block Storage for VPC 卷的大小 (以千兆字节 (Gi) 为单位)。 例如,如果您的设备容量为100GB,请输入 100Gi
    iops
    在 spec CSI 卷属性部分中,输入先前检索的 Block Storage for VPC 卷的最大 IOPS。
    zone
    在“规范 CSI 卷属性”部分中,输入与先前检索的位置匹配的 VPC 块区域。 例如,如果您所在地区是 Washington DC-1,则将 us-east-1 作为您的区域。 如需查看可用区域列表,请发送电子邮件至 ibmcloud is zones。 要查找可用 VPC 专区和位置的概述,请参阅在其他区域中创建 VPC。 指定 "zone" 时,请提及 "region" 参数。
    region
    要在其中连接存储器的工作程序节点的区域。
    worker_node_primary_IP
    要在其中连接存储器的工作程序节点的主 IP。 您可以通过运行 ibmcloud oc worker ls 来查找工作程序节点的主 IP。
    volumeIdspec.csi.volumeHandle
    在 spec CSI 卷属性部分中,输入先前检索的 Block Storage for VPC 卷的标识。
    storageClassName
    对于规格存储类名称,请输入空字符串。
    matchExpressions
    在规范节点亲缘关系部分中,输入节点选择器术语以与区域匹配。 对于密钥,请输入 failure-domain.beta.kubernetes.io/zone。 对于该值,输入要在其中附加存储器的工作程序节点的区域。
    matchExpressions
    在规范节点亲缘关系部分中,输入节点选择器术语以与区域匹配。 对于密钥,请输入 failure-domain.beta.kubernetes.io/region。 对于该值,请输入要在其中附加存储器的工作程序节点的区域。
  6. 在集群中创建 PV。

    oc apply -f pv.yaml
    
  7. 验证是否已在集群中创建 PV。

    oc get pv
    
  8. 为 PVC 创建另一个配置文件。 为了使 PVC 与先前创建的 PV 相匹配,必须为存储器大小和访问方式选择相同的值。 在存储类字段中,输入空字符串以与 PV 相匹配。 如果这些字段中的任何一个与PV不匹配,则通过动态配置自动创建新的PV和 Block Storage for VPC 实例。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <pvc_name>
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: <vpc_block_storage_size>
      storageClassName: ""
    
  9. 创建 PVC。

    oc apply -f pvc.yaml
    
  10. 验证 PVC 是否已创建并与先前创建的 PV 绑定。 此过程可能需要几分钟时间。

oc describe pvc <pvc_name>
  1. 创建使用 PVC 的部署或 pod。
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:
      containers:
      - image: <image_name>
        name: <container_name>
        volumeMounts:
        - name: <volume_name>
          mountPath: /<file_path>
      volumes:
      - name: <volume_name>
        persistentVolumeClaim:
          claimName: <pvc_name>
      nodeSelector:
        kubernetes.io/hostname: "<worker_node_primary_IP>"

更新 Block Storage for VPC 集群附加组件

您可以使用 addon update 命令更新 Block Storage for VPC 集群附加组件。

在更新附加组件之前,请查看 更改日志

在从以前的版本更新到“5.x 版本之前,必须没有处于”failure 状态的卷快照。 有关更多信息,请参阅 为什么不能删除我的Block Storage for VPC卷快照资源?

  1. 检查更新是否可用。 如果更新可用,那么会使用星号标记插件版本,并显示最新版本。 请注意最新版本,因为稍后将使用此值。

    ibmcloud oc cluster addons --cluster <cluster_name_or_ID>
    

    示例输出

    Name                   Version                 Health State   Health Status   
    vpc-block-csi-driver   1.0.0* (2.0.0 latest)   normal         Addon Ready
    
  2. 更新附加组件。 请注意,根据您安装的版本,更新命令有所不同。

    5.0 和更高版本 运行 addon update 命令。

    ibmcloud oc cluster addon update vpc-block-csi-driver --cluster CLUSTER [-f] [-q] [--version VERSION] [-y]
    

    版本 5.0 之前的所有版本 禁用并启用附加组件。

    ibmcloud oc cluster addon disable vpc-block-csi-driver --cluster CLUSTER [-f] [-q]
    
    ibmcloud oc cluster addon enable vpc-block-csi-driver --cluster CLUSTER [-f] [-q] [--version VERSION] [-y]
    
  3. 验证附加组件是否处于 Addon Ready 状态。 附加组件可能需要几分钟才能就绪。

    ibmcloud oc cluster addon ls --cluster <cluster_name_or_ID>
    

    示例输出

    Name                   Version   Health State   Health Status   
    vpc-block-csi-driver   2.0.0     normal         Addon Ready
    

    如果使用 ibmc-vpc-block-10iops-tier 存储类以外的缺省存储类,那么必须更改 addon-vpc-block-csi-driver-configmap ConfigMap中的缺省存储类设置。 有关更多信息,请参阅 更改缺省存储类

  4. 如果您根据缺省 Block Storage for VPC 存储类创建了自己的存储类,那么必须重新创建这些存储类以更新参数。 有关更多信息,请参阅 在更新到 V 4.2后重新创建您自己的存储类

在更新到 V 4.2 之后重新创建您自己的存储类

对于 V 4.2,存储类的缺省参数已更改。 不再使用 sizeRangeiopsRange 参数。 如果您创建了任何使用这些参数的自己的存储类,那么必须编辑自己的存储类以除去这些参数。 要更改您自己的存储类中的参数,必须删除并重新创建这些参数。 先前,每个存储类都提供了 sizeRangeiopsRange 作为参考信息。 对于 V 4.2,已除去这些引用。 现在,有关块存储器概要文件,大小和 IOP 的信息,请参阅 块存储器概要文件 参考。

  1. 要查找您自己的存储类的详细信息,请运行以下命令。

    oc describe sc STORAGECLASS
    
  2. 如果存储类使用 sizeRangeiopsRange,请获取存储类 YAML 并将其保存到文件中。

    oc get sc STORAGECLASS -o yaml
    
  3. 在从先前命令的输出保存的文件中,除去 sizeRangeiopsRange 参数。

  4. 从集群中删除存储类。

    oc delete sc STORAGECLASS
    
  5. 使用先前创建的文件在集群中重新创建存储类。

    oc apply -f custom-storage-class.yaml
    

为 Block Storage for VPC 设置加密

使用密钥管理服务 (KMS) 提供程序 (例如 IBM® Key Protect) 来创建在 Block Storage for VPC 实例中使用的专用根密钥,以在数据写入存储器时对其进行加密。 创建私有根密钥后,使用您的根密钥创建自己的存储类别或 Kubernetes 密钥,然后使用该存储类别或密钥来配置您的 Block Storage for VPC 实例。

对 Block Storage for VPC 启用加密会影响大约 20% 的性能。 但是,确切的影响取决于工作程序节点和存储卷配置。 在启用加密时,请考虑允许对性能产生影响。

  1. 创建要使用的 KMS 提供程序的实例。

  2. 在您的KMS实例中创建一个根密钥。

  3. 设置服务对服务授权。 授权 Block Storage for VPC 访问 IBM® Key Protect。 确保让 Block Storage for VPC 至少有 Reader 访问 KMS 实例的权限。

  4. 确定要在定制存储类中还是在 Kubernetes 私钥中存储 Key Protect 根密钥 CRN。 然后,执行以下步骤来创建定制存储类或 Kubernetes 私钥。

    示例定制存储类。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: <storage_class_name> # Enter a name for your storage class.
    provisioner: vpc.block.csi.ibm.io
    parameters:
      profile: "5iops-tier"
      csi.storage.k8s.io/fstype: "ext4"
      billingType: "hourly"
      encrypted: "true"
      encryptionKey: "<encryption_key>"
      resourceGroup: ""
      zone: ""
      tags: ""
      generation: "gc"
      classVersion: "1"
    reclaimPolicy: "Delete"
    
    encrypted
    在参数中,输入 true 以创建用于为 Block Storage for VPC 卷设置加密的存储类。 如果您将此选项设置为 true,则必须提供要在 parameters.encryptionKey 中使用的 Key Protect 服务实例的根密钥CRN。
    encryptionKey
    在参数中,输入之前获取的根密钥CRN。

    示例:Kubernetes 密码。

    apiVersion: v1
    kind: Secret
    type: vpc.block.csi.ibm.io
    metadata:
      name: <secret_name>
      namespace: <namespace_name>
    stringData:
      encrypted: <true_or_false>
    data
      encryptionKey: <encryption_key>
    
    name
    输入私钥的名称。
    namespace
    输入要在其中创建私钥的名称空间。
    encrypted
    在参数中,输入 true 以设置 Block Storage for VPC 卷的加密。
    encryptionKey
    在这些参数中,输入要用于加密 Block Storage for VPC 卷的 Key Protect 服务实例的根密钥 CRN。 若要以密文形式使用您的根密钥CRN,您必须先通过运行 echo -n "<root_key_CRN>" | base64 将其转换为 base64。
  5. 按照 将 Block Storage for VPC 添加到您的应用程序中的 步骤4-9,创建一个带有自定义存储类的PVC,为 Block Storage for VPC 配置使用您的 Key Protect 根密钥加密。 然后,将此存储器安装到应用程序 pod。

    应用程序可能需要几分钟时间来安装存储器,然后才能进入 Running 状态。

  6. 验证数据是否已加密。 列出您的 Block Storage for VPC 卷,并记下您创建的实例的ID。 存储实例 Name 等于创建 PVC 时自动创建的 PV 的名称。

    ibmcloud is vols
    

    示例输出

    ID                                     Name                                       Status      Capacity   IOPS   Profile           Attachment type   Created                     Zone         Resource group
    a395b603-74bf-4703-8fcb-b68e0b4d6960   pvc-479d590f-ca72-4df2-a30a-0941fceeca42   available   10         3000   5iops-tier        data              2019-08-17T12:29:18-05:00   us-south-1   a8a12accd63b437bbd6d58fb6a462ca7
    
  7. 使用卷ID 列出您的 Block Storage for VPC 实例的详细信息,以确保您的 Key Protect 根密钥存储在存储实例中。 可以在 CLI 输出的 Encryption key 字段中找到根密钥。

    ibmcloud is vol <volume_ID>
    

    示例输出

    ID                                     a395b603-74bf-4703-8fcb-b68e0b4d6960   
    Name                                   pvc-479d590f-ca72-4df2-a30a-0941fceeca42   
    Status                                 available   
    Capacity                               10   
    IOPS                                   3000   
    Profile                                5iops-tier   
    Encryption key                         crn:v1:bluemix:public:kms:us-south:a/6ef045fd2b43266cfe8e6388dd2ec098:53369322-958b-421c-911a-c9ae8d5156d1:key:47a985d1-5f5e-4477-93fc-12ce9bae343f   
    Encryption                             user_managed   
    Resource group                         a8a12accd63b437bbd6d58fb6a462ca7
    Created                                2019-08-17T12:29:18-05:00
    Zone                                   us-south-1   
    Volume Attachment Instance Reference
    

定制缺省存储器设置

您可以使用自定义存储类别或 Kubernetes 密码来更改一些默认的PVC设置,从而创建具有自定义设置的 Block Storage for VPC。

使用自定义存储类别的秘密和指定我的参数有什么好处?
作为集群管理员,如果您希望集群用户创建的所有PVC都使用特定配置进行预置,并且不希望集群用户覆盖默认配置,则可以创建自定义存储类
但是,当需要多个配置并且您不希望为每个可能的 PVC 配置创建定制存储类时,可以使用缺省 PVC 设置以及对通用 Kubernetes 私钥的引用来创建一个定制存储类。 如果集群用户必须覆盖定制存储类的缺省设置,那么他们可以通过创建保存自己的定制设置的 Kubernetes 私钥来实现这一点。

当您要为您的 Block Storage for VPC 实例设置加密时,如果您想将 Key Protect 根密钥CRN编码为 base64,而不是直接在自定义存储类中提供密钥,也可以使用 Kubernetes 密钥。

更改缺省存储类

对于 V 4.2,Block Storage for VPC 集群附加组件将缺省存储类设置为 ibmc-vpc-block-10iops-tier 类。 如果您具有除 ibmc-vpc-block-10iops-tier 以外的缺省存储类,并且 PVC 使用缺省存储类,那么这可能会导致多个缺省存储类,从而导致 PVC 创建失败。 要使用除 ibmc-vpc-block-10iops-tier 以外的缺省存储类,可以更新 addon-vpc-block-csi-driver-configmap 以将 IsStorageClassDefault 更改为 false。

Block Storage for VPC 集群附加组件的缺省存储类是 ibmc-vpc-block-10iops-tier 存储类。

  1. 编辑 addon-vpc-block-csi-driver-configmap

    oc edit cm addon-vpc-block-csi-driver-configmap -n kube-system
    
  2. IsStorageClassDefault 设置更改为 false

  3. 保存并退出。

  4. 等待 15 分钟,并通过获取 ibmc-vpc-block-10iops-tier 存储类的详细信息来验证更改。

    oc get sc ibmc-vpc-block-10iops-tier -o yaml
    

创建您自己的存储类

使用 Block Storage for VPC 实例的首选设置来创建您自己的定制存储类。

如果要执行以下操作,您可以创建自己的存储类:

  • 设置定制 IOPs 值。
  • 使用非 ext4 的文件系统类型设置 Block Storage for VPC。
  • 设置加密。
  1. 查看 存储类参考 以确定要用于存储类的 profile。 如果要为 Block Storage for VPC指定定制 IOP,那么还可以查看 定制概要文件

    如果要使用预先安装的存储类作为模板,那么可以使用 oc get sc <storageclass> -o yaml 命令来获取存储类的详细信息。

  2. 创建定制存储类配置文件。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: <storage_class_name>
    provisioner: vpc.block.csi.ibm.io
    parameters:
      profile: "<profile>"
      csi.storage.k8s.io/fstype: "<file_system_type>"
      billingType: "hourly"
      encrypted: "<encrypted_true_false>"
      encryptionKey: "<encryption_key>"
      resourceGroup: ""
      zone: "<zone>"
      region: "<region>"
      tags: "<tags>"
      generation: "gc"
      classVersion: "1"
      iops: "<iops>" # Only specify this parameter if you are using a "custom" profile.
    allowVolumeExpansion: (true|false) # Select true or false. Only supported on version 3.0.1 and later
    volumeBindingMode: <volume_binding_mode>
      # csi.storage.k8s.io/provisioner-secret-name: # Uncomment and add secret parameters to enforce encryption.
      # csi.storage.k8s.io/provisioner-secret-namespace:
    reclaimPolicy: "<reclaim_policy>"
    
    name
    输入存储类的名称。
    profile
    输入您在上一步中选择的概要文件,或者输入 custom 以使用定制 IOPs 值。 要查找特定配置文件支持的存储容量,请参阅 分层 IOPS 配置文件。 使用此存储类的任何 PVC 都必须指定此范围内的大小值。
    csi.storage.k8s.io/fstype
    在参数中,输入您的 Block Storage for VPC 实例的文件系统。 选择 xfsext3ext4。 如果要修改卷的所有权或许可权,那么必须在自己的存储类中指定 csi.storage.k8s.io/fstype,并且 PVC 必须将 ReadWriteOnce 作为 accessMode。 Block Storage for VPC 驱动程序使用 ReadWriteOnceWithFSType fsGroupPolicy。 有关更多信息,请参阅 CSI 驱动程序文档
    encrypted
    在参数中,输入 true 以创建用于为 Block Storage for VPC 卷设置加密的存储类。 如果您将此选项设置为 true,则必须提供要在 parameterencryptionKey 中使用的 Key Protect 服务实例的根密钥CRN。 有关加密数据的更多信息,请参阅为 Block Storage for VPC 设置加密
    encryptionKey
    如果您输入了 true 用于 parameters.encrypted,请输入您要用于加密 Block Storage for VPC 卷的 Key Protect 服务实例的根密钥 CRN。 有关加密数据的更多信息,请参阅为 Block Storage for VPC 设置加密
    zone
    在参数中,输入要在其中创建 Block Storage for VPC 实例的 VPC 区域。 确保使用的是工作程序节点连接到的专区。 要列出您的工作节点使用的 VPC 区域,请运行 ibmcloud oc cluster get --cluster <cluster_name_or_ID> 并查看 CLI 输出中的 “工作区域”字段。 如果您没有指定区域,系统将自动为您的 Block Storage for VPC 实例选择一个工人节点区域。
    region
    要在其中连接存储器的工作程序节点的区域。
    tags
    在参数中,输入要应用于 Block Storage for VPC 实例的以空格分隔的标记列表。 标记可帮助您更轻松地找到实例,或者根据常见特征(例如,应用程序或它所用于的环境)对实例分组。
    iops
    如果您在 profile 中输入了 custom,请输入您希望 Block Storage for VPC 使用的IOP值。 请参阅 Block Storage for VPC 定制 IOP 概要文件 表,以获取按卷大小列出的受支持 IOP 范围的列表。
    reclaimPolicy
    输入存储类的回收策略。 如果要在除去 PVC 时保留 PV、物理存储设备和数据,请输入 Retain。 如果要在除去 PVC 时删除 PV、物理存储设备和数据,请输入 Delete
    allowVolumeExpansion
    输入存储类的卷扩展策略。 如果您想允许音量扩大,请输入 true。 如果您不想允许音量扩大,请输入 false
    volumeBindingMode
    选择是否要延迟 Block Storage for VPC 实例创建,直到使用此存储器的第一个 pod 准备就绪可安排为止。 要延迟创建,请输入 WaitForFirstConsumer。 要在创建 PVC 时创建实例,请输入 Immediate
  3. 在集群中创建定制存储类。

    oc apply -f custom-storageclass.yaml
    
  4. 验证存储类是否在集群中可用。

    oc get sc
    

    示例输出

    NAME                                    PROVISIONER            AGE
    ibmc-vpc-block-10iops-tier              vpc.block.csi.ibm.io   4d21h
    ibmc-vpc-block-5iops-tier               vpc.block.csi.ibm.io   4d21h
    ibmc-vpc-block-custom                   vpc.block.csi.ibm.io   4d21h
    ibmc-vpc-block-general-purpose          vpc.block.csi.ibm.io   4d21h
    ibmc-vpc-block-retain-10iops-tier       vpc.block.csi.ibm.io   4d21h
    ibmc-vpc-block-retain-5iops-tier        vpc.block.csi.ibm.io   4d21h
    ibmc-vpc-block-retain-custom            vpc.block.csi.ibm.io   4d21h
    ibmc-vpc-block-retain-general-purpose   vpc.block.csi.ibm.io   4d21h
    <custom-storageclass>             vpc.block.csi.ibm.io   4m26s
    
  5. 执行向应用程序添加 Block Storage for VPC 中的步骤来使用定制存储类创建 PVC,以供应 Block Storage for VPC。 然后,将此存储器安装到样本应用程序。

  6. 可选: 验证 Block Storage for VPC 文件系统类型

验证 Block Storage for VPC 文件系统

您可以创建定制存储类,以供应使用其他文件系统(例如,xfsext3)的 Block Storage for VPC。 缺省情况下,会为所有 Block Storage for VPC 实例供应 ext4 文件系统。

  1. 执行步骤以使用要利用的文件系统来创建定制存储类

  2. 按照 将 Block Storage for VPC 添加到您的应用中的 步骤4-9,创建一个具有自定义存储类的PVC,为 Block Storage for VPC 配置不同的文件系统。 然后,将此存储器安装到应用程序 pod。

    应用程序可能需要几分钟时间来安装存储器,然后才能进入 Running 状态。

  3. 验证存储器是否已安装有正确的文件系统。 列出集群中的 pod,并记下用于安装存储器的 pod 的 Name

    oc get pods
    
  4. 登录到 pod。

    oc exec <pod_name> -it bash
    
  5. 列出 pod 中的安装路径。

    mount | grep /dev/xvdg
    

    xfs 的输出示例。

    /dev/xvdg on /test type xfs (rw,relatime,attr2,inode64,noquota)
    
  6. 退出 pod。

    exit
    

更新 VolumeAttachLimit

在 Block Storage for VPC 集群附加组件的版本 5.2 和更高版本中,您可以通过编辑 configmap 来编辑可附加到每个节点的最大卷数。 默认值为 12

必须核准您的帐户才能使用此功能。

  1. 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。

  2. 编辑配置映射。 将 VALUE 替换为要设置的卷连接限制。

    kubectl patch configmap/addon-vpc-block-csi-driver-configmap \       
    -n kube-system \
    --type merge \
    -p '{"data":{"VolumeAttachmentLimit":"VALUE"}}'
    
  3. 等待 kube-system 名称空间中的 ibm-vpc-block-csi-node pod 重新启动。 验证 pod 是否已重新启动。

    kubectl get pods -n kube-system -w| grep block-csi
    
  4. 现在,您可以通过使用动态供应或手动创建附件将卷附加到工作程序节点。 有关更多信息,请参阅 将 Block Storage for VPC 添加到应用程序使用现有 Block Storage for VPC 实例

在 Kubernetes 私钥中存储定制 PVC 设置

在 Kubernetes 私钥中指定 PVC 设置,并在定制存储类中引用此私钥。 然后,使用定制存储类通过在私钥中设置的定制参数来创建 PVC。

我有哪些选项可以使用 Kubernetes 这个秘密?
作为集群管理员,您可以选择是否要允许每个集群用户覆盖存储类的缺省设置,或者是否要创建集群中每个用户都必须使用的私钥并对 Key Protect 根密钥 CRN 强制实施 Base64 编码。
每个用户都可以定制缺省设置
在这种情况下,集群管理员创建一个自定义存储类,其中包含默认 PVC 设置和对通用 Kubernetes 密钥的引用。 集群用户可以通过创建一个包含所需 PVC 设置的 Kubernetes 密钥来覆盖存储类的默认设置。 为了使秘密中的自定义设置应用于您的 Block Storage for VPC 实例,您必须创建一个与您的 Kubernetes 秘密同名的PVC。
对 Key Protect 根密钥实施 base64 编码
在这种情况下,您可以创建一个自定义存储类,其中包含默认 PVC 设置以及对静态 Kubernetes 密钥的引用,该密钥可以覆盖或增强自定义存储类的默认设置。 您的集群用户无法通过创建自己的 Kubernetes 密钥来覆盖默认设置。 集群用户必须改为使用在定制存储类和私钥中选择的配置来供应 Block Storage for VPC。 使用这种方法的好处是,当您想要加密 Block Storage for VPC 实例中的数据时,您可以对 Key Protect 服务实例的根密钥CRN强制执行 base64 编码,而不仅仅是创建 自定义存储类
在开始使用 Kubernetes 密码进行PVC设置之前,我需要了解什么?
某些PVC设置,例如 reclaimPolicyfstypevolumeBindingMode,无法在 Kubernetes 保密设置中设置,必须在存储类别中设置。 作为集群管理员,如果要允许集群用户覆盖缺省设置,那么必须确保设置足够的定制存储类来引用通用 Kubernetes 私钥,以便用户可以使用不同的 reclaimPolicyfstypevolumeBindingMode 设置来供应 Block Storage for VPC。

允许每个用户定制缺省 PVC 设置

  1. 以集群管理员身份,执行创建定制存储类的步骤。 在自定义存储类 YAML 文件中,在 metadata.parameters 部分引用 Kubernetes 密钥,如下所示。 确保按原样添加代码,而不更改变量名称。

    csi.storage.k8s.io/provisioner-secret-name: ${pvc.name}
    csi.storage.k8s.io/provisioner-secret-namespace: ${pvc.namespace}
    
  2. 以集群用户身份,创建 Kubernetes 私钥,用于定制存储类的缺省设置。

    apiVersion: v1
    kind: Secret
    type: vpc.block.csi.ibm.io
    metadata:
      name: <secret_name>
      namespace: <namespace_name>
    stringData:
      iops: "<IOPS_value>"
      zone: "<zone>"
      tags: "<tags>"
      encrypted: <true_or_false>
      resourceGroup: "<resource_group>"
    data
      encryptionKey: <encryption_key>
    
    name
    输入 Kubernetes 私钥的名称。
    namespace
    输入要在其中创建私钥的名称空间。 要在 PVC 中引用私钥,必须在私钥所在的名称空间中创建 PVC。
    iops
    在字符串数据部分中,输入要允许用于 Block Storage for VPC 实例的 IOPS 范围。 输入的范围必须与计划使用的 Block Storage for VPC 层相匹配。
    zone
    在字符串数据部分中,输入要在其中创建 Block Storage for VPC 实例的 VPC 区域。 确保使用的是工作程序节点连接到的专区。 要列出您的工作节点使用的 VPC 区域,请运行 ibmcloud oc cluster get --cluster <cluster_name_or_ID> 并查看 CLI 输出中的 “工作区域”字段。 如果您没有指定区域,系统将自动为您的 Block Storage for VPC 实例选择一个工人节点区域。
    tags
    在字符串数据部分中,输入创建 PVC 时要使用的标记的逗号分隔列表。 标签可以帮助您在创建存储实例后找到它。
    resourceGroup
    在字符串数据部分,输入您希望 Block Storage for VPC 实例访问的资源组 ID。 如果您没有加入资源组,实例将自动获得访问权限,可以访问集群所属资源组的资源。
    encrypted
    在字符串数据部分中,输入 true 以创建用于为 Block Storage for VPC 卷设置加密的私钥。 如果您将此选项设置为 true,则必须提供要在 parameters.encryptionKey 中使用的 Key Protect 服务实例的根密钥CRN。 有关加密数据的更多信息,请参阅为您的 Block Storage for VPC设置加密
    encryptionKey
    在数据部分,如果您将 parameters.encrypted 输入为 true,则输入您要用于加密 Block Storage for VPC 卷的 Key Protect 服务实例的根密钥 CRN。 若要以密文形式使用您的根密钥CRN,您必须先通过运行 echo -n "<root_key_CRN>" | base64 将其转换为 base64。 有关加密数据的更多信息,请参阅为 Block Storage for VPC 设置加密
  3. 创建 Kubernetes 私钥。

    oc apply -f secret.yaml
    
  4. 执行向应用程序添加 Block Storage for VPC 中的步骤来使用定制设置创建 PVC。 确保使用集群管理员创建的定制存储类来创建 PVC,并将用于私钥的名称用于 PVC。 对私钥和 PVC 使用相同的名称会触发存储器提供者在 PVC 中应用私钥的设置。

对 Key Protect 根密钥 CRN 强制实施 Base64 编码

  1. 以集群管理员身份,创建 Kubernetes 私钥,其中包含 Key Protect 根密钥 CRN 的 Base64 编码值。 要检索根密钥 CRN,请参阅为 Block Storage for VPC 设置加密

    apiVersion: v1
    kind: Secret
    type: vpc.block.csi.ibm.io
    metadata:
      name: <secret_name>
      namespace: <namespace_name>
    stringData:
      encrypted: <true_or_false>
      resourceGroup: "<resource_group>"
    data:
      encryptionKey: <encryption_key>
    
    name
    输入 Kubernetes 私钥的名称。
    namespace
    输入要在其中创建私钥的名称空间。 要在 PVC 中引用私钥,必须在私钥所在的名称空间中创建 PVC。
    encrypted
    在字符串数据部分中,输入 true 以创建用于为 Block Storage for VPC 卷设置加密的私钥。 如果您将此选项设置为 true,则必须提供要在 parameters.encryptionKey 中使用的 Key Protect 服务实例的根密钥CRN。 有关加密数据的更多信息,请参阅为您的 Block Storage for VPC设置加密
    encryptionKey
    在数据部分,如果您将 parameters.encrypted 输入为 true,则输入您要用于加密 Block Storage for VPC 卷的 Key Protect 服务实例的根密钥 CRN。 若要以密文形式使用您的根密钥CRN,您必须先通过运行 echo -n "<root_key_CRN>" | base64 将其转换为64进制。 有关加密数据的更多信息,请参阅 为 Block Storage for VPC 设置加密
  2. 创建 Kubernetes 私钥。

    oc apply -f secret.yaml
    
  3. 执行创建定制存储类的步骤。 在自定义存储类 YAML 文件中,在 metadata.parameters 部分引用 Kubernetes 密钥,如下所示。 确保输入先前创建的 Kubernetes 私钥的名称以及在其中创建该私钥的名称空间。

    csi.storage.k8s.io/provisioner-secret-name: <secret_name>
    csi.storage.k8s.io/provisioner-secret-namespace: <secret_namespace>
    
  4. 以集群用户身份,执行向应用程序添加 Block Storage for VPC 中的步骤来通过定制存储类创建 PVC。

设置卷扩展

要供应支持扩展的卷,必须使用将 allowVolumeExpansion 设置为 true 的存储类。

只能扩展由应用程序 pod 安装的卷。

登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。

  1. 如果您未使用 V 4.2 或更高版本的附加组件,请 更新集群中的 Block Storage for VPC 集群附加组件

  2. 创建 PVC,该 PVC 使用支持卷扩展的存储类。

  3. 部署使用 PVC 的应用程序。 创建应用程序时,请记下指定的 mountPath

  4. 通过应用程序 pod 安装 PVC 后,可以通过编辑 PVC 中 spec.resources.requests.storage 字段的值来扩展卷。 要扩展卷,请编辑 PVC 并增大 spec.resources.requests.storage 字段中的值。

    oc edit pvc <pvc-name>
    

    示例

    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
    
  5. 保存并关闭PVC。

  6. 可选: 验证卷是否已扩展。 获取 PVC 的详细信息,并记录 PV 名称。

    oc get pvc <pvc-name>
    
  7. 描述 PV 并记下卷标识。

    oc describe PV
    
  8. 获取 Block Storage for VPC 卷的详细信息并验证容量。

    ibmcloud is vol <volume-ID>
    

在附加组件版本 4.2 之前手动扩展卷

完成以下步骤以手动展开在附加组件版本 4.2 之前创建的现有 Block Storage for VPC 卷。

只能扩展由应用程序 pod 安装的卷。

  1. 获取应用程序的详细信息,并记录 PVC 名称和 mountPath

    oc get pod <pod-name> -n <pod-namespace> -o yaml
    
  2. 获取 PVC 的详细信息,并记录 PV 名称。

    oc get pvc
    
  3. 描述 PV 并获取 volumeId

    oc describe pv `pv-name` | grep volumeId
    

    卷标识 r011-a1aaa1f1-3aaa-4a73-84aa-0aa32e11a1a1 的示例输出。

    volumeId=r011-a1aaa1f1-3aaa-4a73-84aa-0aa32e11a1a1
    
  4. 使用 PATCH 请求调整卷大小。 以下示例将卷大小调整为 250 GiB。

    curl -sS -X PATCH -H "Authorization: <iam_token>" "https://<region>.iaas.cloud.ibm.com/v1/volumes/<volumeId>?generation=2&version=2020-06-16" -d '{"capacity":250}'
    
    <iam_token>
    您的 IAM 令牌。 要找回您的IAM令牌,请发送电子邮件至 ibmcloud iam oauth-tokens
    <region>
    集群所在的区域,例如 us-south
    <volumeId>
    先前检索的卷标识。 例如,r011-a1aaa1f1-3aaa-4a73-84aa-0aa32e11a1a1
    <capacity>
    GiB, 中增加的容量,例如 250
  5. 登录您的应用程序。

    oc exec <pod-name> -it -- bash
    
  6. 运行以下命令以使用主机二进制文件。

    chroot /host
    
  7. 获取文件系统详细信息并记录要更新的 Filesystem 路径。 您还可以 grep 用于应用程序 pod 中指定的安装路径。df -h | grep <mount-path>

    df -h
    

    示例输出

    Filesystem      Size  Used Avail Use% Mounted on
    overlay          98G   64G   29G  70% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs            32G     0   32G   0% /sys/fs/cgroup
    shm              64M     0   64M   0% /dev/shm
    /dev/vda2        98G   64G   29G  70% /etc/hosts
    /dev/vdg        9.8G   37M  9.8G   1% /mount-path # Note the Filesystem path that corresponds to the mountPath that you specified in your app.
    tmpfs            32G   40K   32G   1% /run/secrets/kubernetes.io/serviceaccount
    tmpfs            32G     0   32G   0% /proc/acpi
    tmpfs            32G     0   32G   0% /proc/scsi
    tmpfs            32G     0   32G   0% /sys/firmware
    
  8. 调整文件系统的大小。

    sudo resize2fs <filesystem-path>
    

    示例命令

    sudo resize2fs /dev/vdg
    
  9. 验证文件系统是否已调整大小。

    df -h
    

备份和复原数据

Block Storage for VPC 上的数据在您所在区域的冗余故障专区中受到保护。 要手动备份数据,请使用 Kubernetes oc cp 命令。

您可以使用 oc cp 命令将文件和目录复制到集群中的pod或特定容器中,或将它们从这些容器中复制出来

开始之前: 访问 Red Hat OpenShift 集群

要备份或复原数据,请从以下选项中进行选择:

将数据从本地机器复制到集群中的pod。

oc cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath>

将集群中的数据复制到本地计算机。

oc cp <namespace>/<pod>:<pod_filepath>/<filename> <local_filepath>/<filename>

将数据从本地机器复制到集群中运行于容器中的特定容器。

oc cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath> -c CONTAINER

了解卷请求容量

VPC 块 CSI 驱动程序使用以下公式计算卷容量。

  • 如果在 Gi 中提供了值:rBytes(requestedBytes) = X * 1024^3

  • 如果在 G 中提供了值:rBytes(requestedBytes) = X * 10^9

请求的值等于 (((rBytes+ GiB - 1) / GiB) * GiB) / GiB

例如:

  • 如果提供了值 20Gi (应用上述公式),那么创建的卷为 20GB
  • 如果提供了值 20G,那么创建的卷为 19GB

有时,创建的卷的容量小于所请求的值。 请注意,计费适用于创建的卷,而不是请求的卷。