IBM Cloud Docs
设置 Block Storage for Classic

设置 Block Storage for Classic

IBM Cloud Block Storage for Classic 是一种持久、高性能的 iSCSI 存储,您可以通过使用 Kubernetes 持久卷(PV)将其添加到您的应用程序中。 您可以在具有不同 GB 大小和 IOPS 的预定义存储层之间进行选择,以满足工作负载的需求。 要了解 IBM Cloud Block Storage for Classic 是否是正确的存储选项,请参阅 选择存储解决方案

使用 IBM Cloud Block Storage for Classic 插件时,请记住以下需求。

IBM Cloud Block Storage for Classic 插件仅可用于在经典基础架构上供应的标准 IBM Cloud Kubernetes Service 集群。 如果您具有 VPC 集群,请参阅 设置 Block Storage for Classic

如果您的集群无法访问公共网络,例如防火墙后面的私有集群或仅启用了私有云服务终端节点的集群,请确保您安装了 IBM Cloud Block Storage for Classic 插件版本 1.3.0 或更高版本,以便通过私有网络连接到您的 Block Storage for Classic 实例。

Block Storage for Classic 实例针对单校区多区域。 如果您有多专区集群,请考虑多专区持久性存储选项

经典基础结构

此页面上的步骤仅适用于经典集群。 在 VPC 集群上,缺省情况下会安装 Block Storage for VPC 集群附加组件。 有关更多信息,请参阅 设置 Block Storage for VPC

IBM Cloud Block Storage for Classic

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

首次在集群中使用 Block Storage for Classic ? 安装 Block Storage for Classic 插件 后,请返回此处。

  1. 将以下持久卷声明 (PVC) 配置保存到名为 pvc.yaml 的文件中。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: block-storage-pvc
      labels:
        billingType: "hourly"
        region: us-east
        zone: wdc07
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 45Gi
      storageClassName: ibmc-block-silver
    
  2. 将配置应用于集群以创建 PVC。

    kubectl apply -f pvc.yaml
    
  3. 等待 PVC 处于 Bound 状态。 您可以通过运行以下命令来检查状态。

    kubectl get pvc
    
  4. 在 PVC 为 Bound 之后,创建使用 PVC 的应用程序部署。 将以下部署配置保存到名为 deployment.yaml 的文件中。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
    spec:
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - image: nginx # Use the nginx image, or your own containerized app image.
            name: my-container
            command: ["/bin/sh"]
            args: ["-c", "while true; do date \"+%Y-%m-%d %H:%M:%S\"; sleep 3600; done"] # This app prints the timestamp, then sleeps.
            workingDir: /home
            imagePullPolicy: Always
            ports:
              - containerPort: 80
            volumeMounts:
            - name: my-volume
              mountPath: /mount-path
          volumes:
          - name: my-volume
            persistentVolumeClaim:
              claimName: block-storage-pvc
    
  5. 在集群中创建部署。

    kubectl apply -f deployment.yaml
    
  6. 等待部署为 Ready。 运行以下命令检查部署状态。

    kubectl get deployments
    

    示例输出

    NAME            READY   UP-TO-DATE   AVAILABLE   AGE
    my-deployment   1/1     1            1           3m19s
    
  7. 列出 pod 并验证 my-deployment pod 是否正在运行。

    kubectl get pods
    

    示例输出

    NAME                            READY   STATUS    RESTARTS   AGE
    my-deployment-ccdf87dfb-vzn95   1/1     Running   0          5m27s
    
  8. 获取 pod 日志以验证时间戳记是否已写入。

    kubectl logs
    

    示例输出

    2022-01-21 14:18:59
    

您已成功创建使用 Block Storage for Classic的部署! 有关更多信息,请参阅以下链接。

在仪表盘上安装 IBM Cloud Block Storage for Classic 插件

安装 IBM Cloud Block Storage for Classic 插件,并使用 Helm 图表为 Block Storage for Classic 设置预定义的存储类别。 可以使用这些存储类来创建用于为应用程序供应 Block Storage for Classic 的 PVC。

运行 IBM Cloud Kubernetes Service V 1.24 或更高版本的经典集群不需要安装 IBM Cloud Block Storage for Classic 插件。 缺省情况下,驱动程序和插件安装在这些集群上。

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

  1. 确保工作程序节点应用次要版本的最新补丁,以使用最新的安全设置运行工作程序节点。 补丁版本还可确保更新工作程序节点上的 root 用户密码。

    如果在过去 90 天内未应用更新或重新装入工作程序节点,那么工作程序节点上的 root 用户密码将到期,并且存储插件安装可能失败。

    1. 列出工作程序节点的当前补丁版本。

      ibmcloud ks worker ls --cluster <cluster_name_or_ID>
      

      示例输出

      OK
      ID                                                  Public IP        Private IP     Machine Type           State    Status   Zone    Version
      kube-dal10-crb1a23b456789ac1b20b2nc1e12b345ab-w26   169.xx.xxx.xxx    10.xxx.xx.xxx   b3c.4x16.encrypted     normal   Ready    dal10   1.32_1523*
      

      如果工作程序节点未应用最新补丁版本,那么在 CLI 输出的 *Version** 列中会显示一个星号 (**)。

    2. 查看 Kubernetes 版本信息 以查找最新更改。

    3. 通过重新装入工作程序节点来应用最新的补丁版本。 在重新加载工作节点之前,请按照 ibmcloud ks worker reload命令中的 说明,安全地重新安排工作节点上正在运行的任何容器。 请注意,在重新装入期间,工作程序节点机器将使用最新映像进行更新,并且如果数据未存储在工作程序节点外部,那么将删除数据。

  2. 遵循指示信息 在本地机器上安装 Helm V 3 客户机。

  3. 将 IBM Cloud Helm 图表库添加到要使用 IBM Cloud Block Storage for Classic 插件的集群中。

    如果在 IBM Cloud 帐户中启用了 VRF服务端点,那么可以使用专用 IBM Cloud Helm 存储库在专用网络上保留映像拉取流量。 如果无法在帐户中启用 VRF 或服务端点,请使用公共注册表域: helm repo add iks-charts https://icr.io/helm/iks-charts

    helm repo add iks-charts https://icr.io/helm/iks-charts
    
  4. 更新 Helm 存储库以在此存储库中检索所有最新版本的 Helm chart。

    helm repo update
    
  5. 安装 IBM Cloud Block Storage for Classic 插件,并为安装提供名称,例如 block-storage-plugin。 安装该插件时,会将预定义的块存储类添加到集群中。

    helm install <name> iks-charts/ibmcloud-block-storage-plugin -n <namespace>
    

    示例输出

    NAME:   <name>
    LAST DEPLOYED: Wed Apr 18 10:02:55 2018
    NAMESPACE: default
    STATUS: DEPLOYED
    
    RESOURCES:
    ==> v1beta1/DaemonSet
    NAME                           DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR  AGE
    ibmcloud-block-storage-driver  0        0        0      0           0          <none>         0s
    
    ==> v1beta1/Deployment
    NAME                           DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
    ibmcloud-block-storage-plugin  1        0        0           0          0s
    
    ==> v1/StorageClass
    NAME                      PROVISIONER        AGE
    ibmc-block-bronze         ibm.io/ibmc-block  0s
    ibmc-block-custom         ibm.io/ibmc-block  0s
    ibmc-block-gold           ibm.io/ibmc-block  0s
    ibmc-block-retain-bronze  ibm.io/ibmc-block  0s
    ibmc-block-retain-custom  ibm.io/ibmc-block  0s
    ibmc-block-retain-gold    ibm.io/ibmc-block  0s
    ibmc-block-retain-silver  ibm.io/ibmc-block  0s
    ibmc-block-silver         ibm.io/ibmc-block  0s
    
    ==> v1/ServiceAccount
    NAME                           SECRETS  AGE
    ibmcloud-block-storage-plugin  1        0s
    
    ==> v1beta1/ClusterRole
    NAME                           AGE
    ibmcloud-block-storage-plugin  0s
    
    ==> v1beta1/ClusterRoleBinding
    NAME                           AGE
    ibmcloud-block-storage-plugin  0s
    
    NOTES:
    Thank you for installing: ibmcloud-block-storage-plugin.   Your release is named: <name>
    
  6. 验证安装。

    kubectl get pod -n <namespace> | grep block
    

    示例输出

    ibmcloud-block-storage-driver-kh4mt                              1/1       Running   0          27d       10.118.98.19   10.118.98.19
    ibmcloud-block-storage-plugin-58c5f9dc86-pbl4t                   1/1       Running   0          14d       172.21.0.204   10.118.98.19
    

    看到一个 ibmcloud-block-storage-plugin pod 以及一个或多个 ibmcloud-block-storage-driver pod 时,说明安装成功。 ibmcloud-block-storage-driver pod 的数量等于集群中的工作程序节点数。 所有 pod 都必须处于 Running 状态。

  7. 请确认集群中已添加 Block Storage for Classic 的存储类别。

    kubectl get sc | grep block
    

    示例输出

    ibmc-block-bronze                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-custom                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-gold                        ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-retain-bronze               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-custom               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-gold                 ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-silver               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-silver                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    
  8. 对要供应块存储器的每个集群,重复这些步骤。

现在可以继续创建 PVC,以用于为应用程序供应块存储器。

更新 IBM Cloud Block Storage 插件

现在,可以将现有 IBM Cloud Block Storage 插件升级到最新版本。

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

  1. 更新 Helm 存储库以在此存储库中检索所有最新版本的 Helm chart。

    helm repo update
    
  2. 可选:将最新 Helm chart 下载到本地计算机。 然后,解压缩包并查看 release.md 文件,以了解最新的发行版信息。

    helm pull iks-charts/ibmcloud-block-storage-plugin --untar
    
  3. 找到您在集群中安装的块存储 Helm 图表的版本名称和命名空间。

    helm ls -A
    

    示例输出

    NAME            NAMESPACE   REVISION    UPDATED                             STATUS      CHART                                   APP VERSION
    block-plugin    default     1           2022-01-21 09:02:46.11622 -0500 EST deployed        bmcloud-block-storage-plugin-v2.1.5
    
  4. 将 IBM Cloud Block Storage 插件升级到最新版本。 包含先前检索的发行版名称和名称空间。

    helm upgrade RELEASE-NAME iks-charts/ibmcloud-block-storage-plugin -n NAMESPACE
    
  5. 可选:更新插件时,会取消设置default存储类。 如果要将缺省存储类设置为您选择的存储类,请运行以下命令。

    kubectl patch storageclass STORAGECLASS -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
    

除去 IBM Cloud Block Storage 插件

如果您不想在集群中配置和使用 IBM Cloud Block Storage,可以卸载 Helm 图表。

除去该插件不会除去现有 PVC、PV 或数据。 除去该插件时,将从集群中除去所有相关的 pod 和守护程序集。 在移除插件后,您无法为集群配置新的块存储,也无法使用现有的块存储PVC和PV。

开始之前:

要除去该插件,请执行以下操作:

  1. 找到您安装在集群中的块存储 Helm 图表的版本名称和命名空间。

    helm ls -A
    

    示例输出

    NAME            NAMESPACE   REVISION    UPDATED                             STATUS   CHART                                  APP VERSION
    block-plugin    default     1           2022-01-21 09:02:46.11622 -0500 EST deployed    ibmcloud-block-storage-plugin-v2.1.5
    
  2. 删除 IBM Cloud Block Storage 插件。

    helm uninstall NAME -n kube-system
    
  3. 验证块存储器 pod 是否已除去。

    kubectl get pods -n kube-system | grep block
    

    如果 CLI 输出中未显示任何 pod,那么表明已成功除去 pod。

  4. 验证块存储器的存储类是否已除去。 如果 CLI 输出中未显示任何存储类,说明存储类除去操作成功。

    kubectl get sc | grep block
    

决定块存储器配置

IBM Cloud Kubernetes Service 为块存储器提供了预定义的存储类,可以使用这些类来供应具有特定配置的块存储器。

每个存储类指定供应的块存储器的类型,包括可用大小、IOPS、文件系统和保留策略。

确保仔细选择存储配置,以便有足够的容量来存储数据。 在使用存储类别配置特定类型的存储后,您将无法更改存储设备的类型或保留策略。 但是,如果要提高存储容量和性能,那么可以更改大小和 IOPS。 要更改存储的类型和保留策略,您必须创建一个新的存储实例,并将数据从旧的存储实例复制到新的存储实例。

  1. 列出 IBM Cloud® Kubernetes Service 中的可用存储类。

    kubectl get sc | grep block
    

    示例输出

    ibmc-block-bronze                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-custom                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-gold                        ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-retain-bronze               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-custom               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-gold                 ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-silver               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-silver                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    
  2. 查看存储类的配置。

    kubectl describe storageclass STORAGECLASS
    

    有关每个存储类的更多信息,请参阅存储类参考。 如果没找到您想要的,请考虑创建您自己的自定义存储类别。 首先,请查看定制存储类样本

  3. 选择要供应的块存储器的类型。

    • 青铜、白银和黄金存储等级:这些存储等级提供持久存储。 通过耐久性存储器,可以选择预定义 IOPS 层的存储器大小(以千兆字节为单位)。
    • 自定义存储类别:此存储类别提供高性能存储。 通过性能存储器,可以控制存储器和 IOPS 的大小。
  4. 选择块存储器的大小和 IOPS。 IOPS 的大小和数量定义了 IOPS(每秒输入/输出操作数)的总数,这用于指示存储器的速度。 存储器的总 IOPS 越高,处理读写操作的速度越快。

    • **铜牌级、银牌级和金牌级存储类:**这些存储类随附固定数量的 IOPS/千兆字节,并在 SSD 硬盘上供应。 IOPS 的总数取决于您选择的存储器大小。 您可以在允许的大小范围内选择任意整数的千兆字节(例如,20 Gi、256 Gi、11854 Gi)。 要确定 IOPS 的总数,必须将 IOPS 乘以所选大小。 例如,如果在随附 4 IOPS/GB 的银牌级存储类中选择 1000 Gi 块存储器大小,那么存储器总计有 4000 IOPS。

      存储类大小范围和 IOPS/千兆字节表
      存储类 IOPS/千兆字节 大小范围(千兆字节)
      铜级 2 IOPS/GB 20-12000 Gi
      银牌级 4 IOPS/GB 20-12000 Gi
      金级 10 IOPS/GB 20-4000 Gi
    • **定制存储类:**选择此存储类时,可以对所需大小和 IOPS 具有更多控制权。 对于大小,您可以在允许的大小范围内选择任何整数的千兆字节。 选择的大小将确定可供您使用的 IOPS 范围。 您可以在指定范围内选择一个100的倍数作为IOPS。 您选择的 IOPS 是静态的,不会随存储器大小进行缩放。 例如,如果选择了 40 Gi 和 100 IOPS,那么总 IOPS 仍为 100。 IOPS 与千兆字节的比率还可确定供应的硬盘类型。 例如,如果您使用 500Gi 时 IOPS 为 100,则 IOPS 与千兆字节之比为 0.2。 比率小于或等于 0.3 的存储器在 SATA 硬盘上供应。 如果比率大于 0.3,那么会在 SSD 硬盘上供应存储器。

      Table class size ranges and IOPS
      大小范围(千兆字节) IOPS 范围(100 的倍数)
      20-39 Gi 100-1000 IOPS
      40-79 Gi 100-2000 IOPS
      80-99 Gi 100-4000 IOPS
      100-499 Gi 100-6000 IOPS
      500-999 Gi 100-10000 IOPS
      1000-1999 Gi 100-20000 IOPS
      2000-2999 Gi 200-40000 IOPS
      3000-3999 Gi 200-48000 IOPS
      4000-7999 Gi 300-48000 IOPS
      8000-9999 Gi 500-48000 IOPS
      10000-12000 Gi 1000-48000 IOPS
  5. 选择在删除集群或持久卷声明 (PVC) 后是否要保留数据。

    • 如果要保留数据,请选择 retain 存储类。 删除 PVC 时,仅会删除 PVC。 PV、IBM Cloud 基础架构帐户中的物理存储设备以及数据仍会存在。 要回收存储器并再次在集群中使用,必须除去 PV,并执行使用现有块存储器的步骤。
    • 如果要在删除 PVC 时删除 PV、数据和物理块存储设备,请选择不带 retain 的存储类。
  6. 选择是要按小时还是按月计费。 缺省设置为按小时计费。

为 Block Storage for Classic 设置加密

您可以使用 IBM Key Protect为 Block Storage for Classic 设置加密。

以下示例说明如何为 Key Protect 和集群创建具有必需访问角色的服务标识。 此服务标识的凭证用于对 Block Storage for Classic 卷启用加密。

您可以通过创建使用个人 API 密钥的 Kubernetes 私钥来启用加密,只要您具有 Key Protect 实例的 读取者 服务访问角色以及集群的 查看者 平台访问角色和 写入者 服务访问角色。

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

  1. 确保为您分配了 Key Protect 的“编辑者”平台访问角色和“写入者”服务访问角色,以便您可以创建自己的根密钥,用于加密 Block Storage for Classic 实例。 您可以在 IAM 控制台中查看 IAM 访问角色。 有关 IAM 角色的更多信息,请参阅 IAM 访问权

  2. 如果您没有 Key Protect 实例,请 供应一个

  3. 创建根密钥。 缺省情况下,会创建没有到期日期的根密钥。

  4. 创建 IAM 服务标识。 将 <service_ID_name> 替换为要分配给服务标识的名称。 此服务标识用于从 Block Storage for Classic 卷访问 Key Protect 实例。

    ibmcloud iam service-id-create <service_ID_name>
    

    示例输出

    OK
    Service ID test-id is created successfully
    
    ID            ServiceId-a1a11111-bb11-1111-a11b-1111111a11ba   
    Name          test-id   
    Description      
    CRN           crn:v1:bluemix:public:iam-identity::a/1a1111aa2b11111aaa1a1111aa2aa111::serviceid:ServiceId-a1a11111-bb11-1111-a11b-1111111a11bb   
    Version       1-bb11aa11a0aa1a11a011a1aaaa11a1bb   
    Locked        false
    
  5. 为您的服务ID创建一个API密钥。 将 <api-key-name> 替换为 API 密钥的名称,并将 <service_ID_name> 替换为您创建的服务标识的名称。 请确保保存 API 密钥,因为以后无法检索该密钥。 在后续步骤中,此 API 密钥存储在集群中的 Kubernetes 私钥中。

    ibmcloud iam service-api-key-create <api_key_name> <service_ID_name>
    
  6. 检索帐户中启用 IAM 的服务的列表,并记下您创建的 Key Protect 实例的名称。

    ibmcloud resource service-instances
    
  7. 检索您的 Key Protect 实例的GUID。 该标识用于为您的服务标识创建 IAM 服务策略。

    ibmcloud resource service-instance "<instance_name>" | grep GUID
    
  8. 创建 IAM 服务策略,以授予您对 Key Protect 实例的服务标识访问权。 以下命令授予您的服务标识 Reader 对 Key Protect 实例的访问权。 “读者”访问角色是服务标识检索 Key Protect 密钥时必须具有的最低服务访问角色。 有关更多信息,请参阅 管理 Key Protect的用户访问权

    ibmcloud iam service-policy-create <service_ID_name> --roles Reader --service-name kms --service-instance <service_instance_GUID>
    
  9. 创建另一个 IAM 服务访问策略,以授予您对集群的服务标识访问权。 以下命令向集群的服务标识授予 查看者 平台访问角色和 写程序 服务访问角色。 您可以通过发送电子邮件至 ibmcloud ks cluster get <cluster_name> 来获取集群ID。

    ibmcloud iam service-policy-create <service_ID_name> --roles Writer,Viewer --service-name containers-kubernetes --service-instance <cluster_ID>
    
  10. 如果已安装 ibmcloud-block-storage-plugin Helm Chart,那么必须除去 Helm Chart 并安装新版本。

如果在不使用 Helm的情况下安装了该插件,那么必须在安装新版本之前手动除去块存储器插件部署和所有关联资源。

helm uninstall <name> <namespace>
  1. 安装 ibmcloud-block-storage-plugin Helm Chart。
helm install <name> iks-charts/ibmcloud-block-storage-plugin
  1. 创建 ibm-block-secrets 名称空间。
kubectl create ns ibm-block-secrets
  1. 在块存储器插件的 ibm-block-secrets 名称空间中创建角色绑定。
kubectl create rolebinding ibmcloud-block-storage-plugin-byok --clusterrole=ibmcloud-block-storage-plugin-byok --serviceaccount=kube-system:ibmcloud-block-storage-plugin --group system:nodes --namespace=ibm-block-secrets
  1. 创建名为 secret.yaml 的 Kubernetes 私钥,其中包含用于在 Key Protect 服务实例中访问根密钥的凭证。

  2. 为密钥创建配置文件。

    apiVersion: v1
    kind: Secret
    metadata:
      labels:
        kmsConfig: kpc-secretLabel
      name: <secret_name> # Enter a name for your secret. Example: my_secret
      namespace: <namespace> # Enter the name of the namespace where you want to create the secret. The secret must be in same namespace where your app is deployed. Example: default
    stringData:
    config: |-
        {
            "api_key":"<service_id_api_key>", # Enter the API key for the service ID that you created. Example: "AA1aAAaA1a21AAaA1aAAaAa-AA-1AAaaA1aA1aAaaaAA"
            "iam_endpoint":"https://iam.cloud.ibm.com",
            "key_protect_endpoint":"https://<region>.kms.cloud.ibm.com", # Example: "https://us-east.kms.cloud.ibm.com"
            "root_key_crn":"<rook_key_crn>", # Example: "crn:v1:bluemix:public:kms:<region>:a/1ab011ab2b11111aaa1a1111aa1aa111:11aa111a-1111-11a1-a111-a11a111aa111:key:11a11111-1a1a-111a-111a-11111a1a1aa1",
            "version":""
        }
    type: ibm.io/kms-config
    
    stringData.config.key_protect_endpoint
    输入 Key Protect 实例的区域端点。 有关 Key Protect 端点的列表,请参阅 区域和端点
    stringData.config.root_key_crn
    输入您创建的根密钥的CRN。 要检索根密钥 CRN,请完成以下步骤。
    1. 浏览至 IBM Cloud 控制台中的资源列表。
    2. 单击 服务,然后单击 Key Protect 实例。
    3. 操作菜单上找到根密钥,然后单击 查看 CRN
    4. 点击复制按钮复制CRN。
  3. 在集群中创建私钥。

    kubectl apply -f secret.yaml
    
  4. 验证是否已创建私钥。

    kubectl get secrets
    
  5. 在以下选项之间进行选择,以创建使用根密钥加密数据的 Block Storage for Classic 实例。

使用您自己的存储类对卷数据进行加密

您可以通过首先创建自己的存储类来部署使用加密卷的应用程序。

以下步骤说明如何创建可用来创建具有相同配置的多个加密块存储器实例的定制加密存储类。 如果要使用其中一个 IBM提供的存储类来创建加密 PVC,那么可以通过 在 PVC 中直接引用 Key Protect 凭证 来执行此操作。

  1. 决定存储器配置

  2. 创建您自己的存储类,以使用其中一个 IBM提供的存储类作为基础来供应加密块存储器实例。 您可以通过运行 kubectl get sc <storageclass_name> -o yaml 来检索存储类的详细信息。 以下示例基于 ibmc-block-retain-bronze 存储类。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: <name> # Enter the name of the storage class. Example: my_custom_storageclass
    parameters:
      billingType: hourly
      classVersion: "2"
      fsType: ext4
      iopsPerGB: "2"
      sizeRange: '[20-12000]Gi'
      type: Endurance
      encrypted: "true" # Enter "true" to enable encryption.
      encryptionKeySecret: <secret_name> # # #nter the name of the secret that you created earlier.Example: my_secret
      encryptionKeyNamespace: <namespace> # # #nter the namespace where you created your secret. Example: default
    provisioner: ibm.io/ibmc-block
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    
  3. 在集群中创建存储类。

    kubectl apply -f storageclass.yaml
    
  4. 通过使用您自己的存储类来创建 PVC,将 Block Storage for Classic 添加到应用程序

  5. 验证 Block Storage for Classic 卷 的加密。

创建引用 Block Storage for Classic 私钥的 PVC

您可以通过创建用于指定保存 Key Protect 凭证的 Kubernetes 私钥的 PVC 来供应已加密的 Block Storage for Classic。

以下步骤显示了如何在 PVC 中引用 Key Protect 凭证以创建加密的 Block Storage for Classic 实例。 要在不指定每个 PVC 中的 Key Protect 凭证的情况下创建多个加密卷,可以 创建定制的加密存储类

  1. 查看提供的 Block Storage for Classic 存储类,以确定哪个存储类最符合应用程序需求。 如果提供的存储类不满足应用程序需求,那么您可以创建自己的 定制存储类

  2. 创建名为 pvc.yaml 的 PVC 配置文件,该文件引用存储了 Key Protect 服务凭证的 Kubernetes 私钥。 要创建此私钥,请参阅 设置 Block Storage for Classic的加密

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: <pvc_name> # Enter a name for your PVC.
      annotations:
      volume.beta.kubernetes.io/storage-class: "<storage_class>" # Enter a storage class. To see a list of storageclasses run `kubectl get storageclasses`.
      labels:
        encrypted: "true"
        encryptionKeyNamespace: <namespace> # Enter the namespace where your secret was created.
        encryptionKeySecret: <secret_name> # Enter the name of the secret you created.
    spec:
      accessModes:
        - ReadWriteOnce
        resources:
        requests:
            storage: 20Gi
    
  3. 在集群中创建 PVC。

    kubectl apply -f pvc.yaml
    
  4. 检查您的PVC状态。

    kubectl get pvc
    
  5. 等待 PVC 绑定,然后 创建使用 PVC 的部署

  6. 验证 Block Storage for Classic 卷 的加密。

验证 Block Storage for Classic 卷的加密

您可以通过检查卷安装路径来验证卷的加密。

  1. 登录您的应用程序。 将 <pod_name> 替换为安装加密 Block Storage for Classic 卷的 pod 的名称。

    kubectl exec <pod_name> -it bash
    
  2. 列出 pod 的文件系统。

    df -h
    
  3. 查看已加密的 Block Storage for Classic 卷的文件系统路径。

    • 加密卷的路径结构为 /dev/mapper/<pvc-ID_encrypted>。 在此示例中,加密卷将安装到 pod 中的 /test 文件路径。

      Filesystem                                            Size  Used Avail Use% Mounted on
      overlay                                                98G  8.2G   85G   9% /
      tmpfs                                                  64M     0   64M   0% /dev
      tmpfs                                                 2.0G     0  2.0G   0% /sys/fs/cgroup
      /dev/mapper/pvc-a011a111-1111-1111-111a-aaa1a1111a11_encrypted   20G   45M   20G   1% /test
      
    • 未加密卷的路径结构为 dev/mapper/<random_string>

      Filesystem                                     Size  Used Avail Use% Mounted on
      overlay                                         98G   16G   78G  17% /
      tmpfs                                           64M     0   64M   0% /dev
      tmpfs                                          7.9G     0  7.9G   0% /sys/fs/cgroup
      /dev/mapper/3600a09803830476e733f4e477370716e   24G   45M   24G   1% /test
      

除去 Kubernetes 私钥不会撤销对卷数据的访问权。 如果创建了仅限 pod 的部署,那么必须删除 pod。 如果创建了部署,那么必须删除该部署。

向应用程序添加块存储器

创建一个持久卷请求(PVC),为集群动态配置块存储。 动态供应将自动创建匹配的持久卷 (PV),并在 IBM Cloud 基础架构帐户中订购实际存储设备。

块存储器随附 ReadWriteOnce 访问方式。 一次只能将其安装到集群中一个工作程序节点上的一个 pod。

开始之前:

要在有状态集内部署块存储器? 有关更多信息,请参阅在有状态集内使用块存储器

要添加块存储器,请执行以下操作:

  1. 创建配置文件以定义持久卷声明 (PVC),并将配置保存为 .yaml 文件。

    • 青铜、白银、黄金存储等级示例: 以下 .yaml 文件将创建 "ibmc-block-silver" 存储类的名为 block-storage-pvc 的声明 (按小时计费),其千兆字节大小为 24Gi

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: block-storage-pvc
        labels:
          billingType: "hourly"
          region: us-south
          zone: dal13
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 24Gi
        storageClassName: ibmc-block-silver
      
    • 使用您自己的存储类的示例: 以下 .yaml 文件创建了一个名为 block-storage-pvc 的存储类 ibmc-block-retain-custom 请求,按小时计费,大小为 45Gi,IOPS为 "300"

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: block-storage-pvc
        labels:
          billingType: "hourly"
          region: us-south
          zone: dal13
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 45Gi
            iops: "300"
        storageClassName: ibmc-block-retain-custom
      
      name
      输入 PVC 的名称。
      billingType
      在元数据标签部分中,指定计算存储帐单的频率,即“按月”或“按小时”。 缺省值为 "hourly"。
      region
      在“元数据标签”部分中,指定要在其中供应块存储器的区域。 如果指定了区域,那么还必须指定专区。 如果您没有指定区域,或者指定的区域不存在,则会在与您的集群相同的区域创建存储。 仅 IBM Cloud Block Storage V1.0.1 或更高版本的插件支持此选项。 对于更旧的插件版本,如果您有多专区集群,那么将循环选择供应存储器的专区,以在所有专区中均匀均衡卷请求。 要为存储器指定专区,可以首先创建定制存储类。 然后,使用定制存储类创建 PVC。
      zone
      在“元数据标签”部分中,指定要在其中供应块存储器的区域。 如果指定了专区,那么还必须指定区域。 如果您没有指定区域,或者指定的区域在多区域集群中找不到,则系统将按循环方式选择区域。 仅 IBM Cloud Block Storage V1.0.1 或更高版本的插件支持此选项。 对于更旧的插件版本,如果您有多专区集群,那么将循环选择供应存储器的专区,以在所有专区中均匀均衡卷请求。 要为存储器指定专区,可以首先创建定制存储类。 然后,使用定制存储类创建 PVC。
      storage
      在“规范资源请求”部分中,输入块存储器的大小 (以千兆字节 (Gi) 为单位)。 存储空间配置完成后,您将无法更改块存储的大小。 因此,请确保指定与要存储的数据量相匹配的大小。
      iops
      此选项仅适用于您自己的定制存储类 (ibmc-block-custom / ibmc-block-retain-custom)。在“规范资源请求”部分中,指定存储器的总 IOPS,在允许的范围内选择 100 的倍数。 如果选择的 IOPS 不同于列出的 IOPS,那么该 IOPS 会向上舍入。
      storageClassName
      在规格部分,输入您要用于配置块存储的存储类名称。 您可以选择 使用 IBM 提供的存储类别,也可以 创建自己的存储类别。 如果您没有指定存储类别,PV将以默认存储类别 ibmc-file-bronze 创建。

    如果要使用定制存储类,请使用相应的存储类名称、有效的 IOPS 和大小来创建 PVC。

  2. 创建 PVC。

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

    kubectl get pvc
    

    示例输出

    NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    block-storage-pvc              Bound    pvc-1aa1aaaa-11a1-48d1-ab11-11b11111f3bc   45Gi       RWO            ibmc-block-silver   150m
    
  4. 要将 PV 安装到部署,请创建配置 .yaml 文件,并指定绑定该 PV 的 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>
    
    app
    在元数据中,输入部署的标签。
    matchLabels.applabels.app
    在规范选择器和模板元数据中,输入应用程序的标签。
    image
    您要使用的容器镜像的名称。 要列出 IBM Cloud Container Registry 帐户中的可用映像,请运行 ibmcloud cr image-list
    name
    要部署到集群的容器的名称。
    mountPath
    在“容器卷安装”部分中,输入在容器内安装卷的目录的绝对路径。 写入挂载路径的数据将存储在物理块存储实例的根目录下。 如果您想在不同的应用程序之间共享音量,可以为每个应用程序指定 音量子路径
    name
    在“容器卷安装”部分中,输入要安装到 pod 的卷的名称。
    name
    在“卷”部分中,输入要安装到 pod 的卷的名称。 通常情况下,这个名字与 volumeMounts/name 相同。
    claimName
    在卷持久卷声明部分中,输入用于绑定要使用的 PV 的 PVC 的名称。
  5. 创建部署。

    kubectl apply -f <local_yaml_path>
    
  6. 验证 PV 是否已成功安装。

    kubectl 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:    block-storage-pvc
        ReadOnly:    false
    

在集群中使用现有块存储器

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

在开始将现有存储器安装到应用程序之前,必须检索 PV 的所有必要信息。

检索现有块存储的信息

  1. 检索或生成 IBM Cloud 基础架构帐户的 API 密钥。

    1. 登录 IBM Cloud 基础设施门户
    2. 选择帐户,再选择用户,然后选择用户列表
    3. 找到您的用户标识。
    4. API 密钥列中,单击生成以生成 API 密钥,或者单击查看以查看现有 API 密钥。
  2. 请为您的 IBM Cloud 基础设施账户获取API用户名。

    1. 用户列表菜单中,选择您的用户标识。
    2. API 访问信息部分中,找到您的 API 用户名
  3. 登录到 IBM Cloud Infrastructure CLI 插件。

    ibmcloud sl init
    
  4. 请选择使用您的 IBM Cloud 基础设施账户的用户名和API密钥进行身份验证。

  5. 输入您在之前步骤中获取的用户名和API密钥。

  6. 列出可用的块存储设备。

    ibmcloud sl block volume-list
    

    示例输出

    id          username              datacenter   storage_type                capacity_gb   bytes_used   lunId   
    11111111    IBM01AAA1111111-1     wdc07        endurance_block_storage     45            -            2      
    
  7. 检索卷详细信息。 将 <volume_ID> 替换为您在步骤 6 中检索到的块存储卷的标识。

    ibmcloud sl block volume-detail <volume_ID>
    

    示例输出

    ID                         11111111
    User name                  IBM01AAA1111111-1   
    Type                       endurance_block_storage   
    Capacity (GB)              45   
    LUN Id                     2   
    IOPs                       100   
    Datacenter                 wdc07   
    Target IP                  10.XXX.XX.XXX  
    # of Active Transactions   0   
    Replicant Count            0
    
  8. 记下要安装到集群的卷的 IDCapacityLUN IdDatacenterTarget IP。 **注:**要将现有存储器安装到集群,必须在存储器所在的专区中有工作程序节点。 要验证您的工作节点区域,请发送电子邮件至 ibmcloud ks worker ls --cluster <cluster_name_or_ID>

创建一个持久卷(PV)和一个匹配的持久卷声明(PVC)

  1. 可选:如果您使用 retain 存储类配置了存储,当您删除PVC时,PV和物理存储设备不会被删除。 要在集群中复用存储器,必须首先除去 PV。 列出现有 PV 并查找属于持久存储器的 PV。 该 PV 处于 released 状态。

    kubectl get pv
    
  2. 除去该 PV。

    kubectl delete pv <pv_name>
    
  3. 确认PV已移除。

    kubectl get pv
    
  4. 为 PV 创建配置文件。 包含先前检索的参数。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: "block-storage-pv" # Enter a name for your PV. For example, my-static-pv.
      labels:
         failure-domain.beta.kubernetes.io/region: "<region>" # Example us-east.
         failure-domain.beta.kubernetes.io/zone: "<zone>" # Example: wdc04. See /docs/containers?topic=containers-regions-and-zones#zones-sz
    spec:
      capacity:
        storage: "<storage>"
      accessModes:
        - ReadWriteOnce
      flexVolume:
        driver: "ibm/ibmc-block"
        fsType: "<fs_type>" # Enter ext or xfs
        options:
          "Lun": "<Lun_ID>"
          "TargetPortal": "<TargetPortal>"
          "VolumeID": "<VolumeID>"
          "volumeName": "block-storage-pv" # Enter the same value as your PV name from metadata.name
    
    name
    为您的PV命名。 例如,block-storage-pv。 请注意,您还必须在 spec.FlexVolume.options 中输入此值作为 volumeName
    labels
    输入先前检索到的区域和专区。 必须在持久性存储器所在的区域和专区中至少有一个工作程序节点,才能在集群中安装该存储器。 要检索卷详细信息,请运行 ibmcloud sl block volume-list 以获取卷标识,然后运行 ibmcloud sl block volume-detail <volume_ID> 以获取卷的详细信息。
    region
    输入块存储所在的区域。 请注意,集群和块存储器必须位于同一区域中。 要查找集群位置,请发送电子邮件至 ibmcloud ks cluster ls。 有关可用区域和区域的更多信息,请参阅 区域和区域。 例如,us-east
    zone
    输入存储卷所在的区域。 要检索卷详细信息,请运行 ibmcloud sl block volume-list 以获取卷标识,然后运行 ibmcloud sl block volume-detail <volume_ID> 以获取卷的详细信息。 请注意,要将块存储器连接到集群,您必须在要连接的卷所在的专区中具有可用的工作程序节点。 要查找工作程序节点的专区,请运行 ibmcloud ks worker ls -c <cluster>。 例如,wdc04
    storage
    输入要连接到集群的现有块存储卷的存储器大小。 存储器大小必须以千兆字节为单位,例如 20Gi (20 GB) 或 1000Gi (1 TB)。 要检索卷详细信息,请运行 ibmcloud sl block volume-list 以获取卷标识,然后运行 ibmcloud sl block volume-detail <volume_ID> 以获取卷的详细信息。
    fsType
    输入为现有块存储器配置的文件系统类型。 请选择 ext4xfs。 如果您不指定此选项,PV将默认为 ext4。 如果定义了错误的 fsType,那么 PV 创建会成功,但将 PV 安装到 pod 会失败。 要检索卷详细信息,请运行 ibmcloud sl block volume-list 以获取卷标识,然后运行 ibmcloud sl block volume-detail <volume_ID> 以获取卷的详细信息。
    Lun
    输入块存储卷的 LUN 标识。 要检索卷详细信息,请运行 ibmcloud sl block volume-list 以获取卷标识,然后运行 ibmcloud sl block volume-detail <volume_ID> 以获取卷的详细信息。
    TargetPortal
    输入您的块存储的IP地址。 要检索 TargetPortal 参数,请运行 ibmcloud sl block volume-list 以获取卷标识,然后运行 ibmcloud sl block volume-detail <volume_ID> 并在输出中记录 Target IP
    VolumeId
    输入块存储器的标识。 要检索卷详细信息,请运行 ibmcloud sl block volume-list
    volumeName
    请输入与 PV 名称相同的值。 例如,block-storage-pv
  5. 在集群中创建 PV。

    kubectl apply -f pv.yaml
    
  6. 验证 PV 是否已创建。

    kubectl get pv
    
  7. 创建另一个配置文件以创建 PVC。 为了使 PVC 与先前创建的 PV 相匹配,必须为 storageaccessMode 选择相同的值。 storage-class 字段必须为空字符串。 如果这些字段中的任何一个与PV不匹配,则会自动创建一个新的PV。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: block-storage-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: "20Gi"
      storageClassName: ""
    
  8. 创建 PVC。

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

    kubectl describe pvc static-pvc
    

    示例输出

    Name:          static-pvc
    Namespace:     default
    StorageClass:  
    Status:        Bound
    
  10. 可选 将以下示例 pod 配置另存为名为 pod.yaml 的文件。

apiVersion: v1
kind: Pod
metadata:
  name: block-storage
  labels:
    app: block-storage
spec:
  containers:
    - name: block-storage
      image: nginx
      command: ["/bin/sh"]
      args: ["-c", "while true; do date \"+%Y-%m-%d %H:%M:%S\"; sleep 3600; done"]
      workingDir: /home
      imagePullPolicy: Always
      ports:
        - containerPort: 80
      volumeMounts:
        - name: block-storage-pv
          mountPath: /home
  volumes:
    - name: block-storage-pv
      persistentVolumeClaim:
        claimName: block-storage-pvc
  1. 在集群中创建Pod。
kubectl create -f pod.yaml
  1. 在 pod 处于 Running 状态后,获取日志。
kubectl logs

示例输出

2022-01-21 16:11:00

您已成功创建 PV,并将其绑定到 PVC。 然后,您已部署并应用了使用块存储器的应用程序。 集群用户现在可以 将PVC挂载 到他们的部署中,并开始读写持久化卷。

在有状态集内使用块存储器

如果您有一个有状态的应用程序(如数据库),那么可以创建有状态集,以使用块存储器来存储应用程序的数据。 或者,可以使用 IBM Cloud 数据库即服务,并将数据存储在云中。

在有状态集上添加块存储时,需要注意什么?
要将存储器添加到有状态集,请在有状态集 YAML 的 volumeClaimTemplates 部分中指定存储器配置。 volumeClaimTemplates 是 PVC 的基础,可以包含要供应的块存储器的存储类和大小或 IOPS。 但是,如果要在 volumeClaimTemplates 中包含标签,那么 Kubernetes 在创建 PVC 时,不会包含这些标签。 您必须改为将标签直接添加到有状态集。

您不能同时部署两个状态集。 如果在一个有状态集完全部署之前尝试创建另一个有状态集,那么前一个有状态集的部署可能会导致意外的结果。

我如何在特定区域创建状态集?
在多专区集群中,可以在有状态集 YAML 的 spec.selector.matchLabelsspec.template.metadata.labels 部分中,指定要在其中创建有状态集的专区和区域。 或者,可以将这些标签添加到定制存储类,并在有状态集的 volumeClaimTemplates 部分中使用此存储类。
我可以等到容器准备就绪后再绑定PV吗?
可以,您可以为包含 volumeBindingMode: WaitForFirstConsumer 字段的 PVC 创建自己的存储类
我有哪些选项可以为有状态集添加块存储?
如果要在创建有状态集时自动创建 PVC,请使用动态供应。 您还可以选择对有状态集预先供应 PVC 或使用现有 PVC

创建有状态集时使用动态供应来创建 PVC

如果要在创建有状态集时自动创建 PVC,请使用此选项。

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

完成以下步骤以验证集群中的所有现有有状态集是否已完全部署。 如果状态集仍在部署中,则无法开始创建状态集。 您必须等待集群中的所有有状态集完全部署,以避免发生意外结果。

  1. 列出集群中现有的有状态集。

    kubectl get statefulset --all-namespaces
    

    示例输出

    NAME              DESIRED   CURRENT   AGE
    mystatefulset     3         3         6s
    
  2. 查看每个有状态集的 Pods Status,以确保有状态集部署完成。

    kubectl describe statefulset <statefulset_name>
    

    示例输出

    Name:               nginx
    Namespace:          default
    CreationTimestamp:  Fri, 05 Oct 2022 13:22:41 -0400
    Selector:           app=nginx,billingType=hourly,region=us-south,zone=dal10
    Labels:             app=nginx
    billingType=hourly
    region=us-south
    zone=dal10
    Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"podManagementPolicy":"Par..."
    Replicas:           3 desired | 3 total
    Pods Status:        0 Running / 3 Waiting / 0 Succeeded / 0 Failed
    Pod Template:
    Labels:  app=nginx
    billingType=hourly
    region=us-south
    zone=dal10
    ...
    

    在 CLI 输出的 Replicas 部分中找到的副本数等于 Pods Status 部分中 Running pod 的数目时,说明有状态集已完全部署。 如果有状态集尚未完全部署,请等待部署完成,然后再继续。

  3. 为有状态集和用于公开有状态集的服务创建配置文件。 以下示例显示了如何将 NGINX 部署为具有 3 个副本的有状态集。 对于每个副本,将根据 ibmc-block-retain-bronze 存储类中定义的规范供应一个 20 千兆字节的块存储设备。 所有存储设备都在 dal10 专区中供应。 由于块存储无法从其他区域访问,因此有状态集的所有副本也会部署到位于 dal10 的工作节点上。

    apiVersion: v1
    kind: Service
    metadata:
     name: nginx
     labels:
    app: nginx
    spec:
    ports:
    - port: 80
        name: web
    clusterIP: None
    selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx
    spec:
      serviceName: "nginx"
      replicas: 3
      podManagementPolicy: Parallel
      selector:
        matchLabels:
        app: nginx
        billingType: "hourly"
        region: "us-south" # Enter the region where your cluster is located.
        zone: "dal10"
    template:
      metadata:
      labels:
          app: nginx
          billingType: "hourly"
          region: "us-south"
          zone: "dal10"
      spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myvol
        mountPath: /usr/share/nginx/html
    volumeClaimTemplates:
    - metadata:
        name: myvol
        spec:
        accessModes:
        - ReadWriteOnce
        resources:
            requests:
            storage: 20Gi
            iops: "300" #required only for performance storage
        storageClassName: ibmc-block-retain-bronze
    

    以下示例显示了如何将 NGINX 部署为具有 3 个副本的有状态集。 有状态集未指定在其中创建块存储器的区域和专区。 有状态集改为使用反亲缘关系规则来确保 pod 跨工作程序节点和专区分布。 通过定义 topologykey: failure-domain.beta.kubernetes.io/zone,如果工作节点与带有 app: nginx 标签的容器位于同一区域,则 Kubernetes 调度程序无法在工作节点上调度容器。 对于每个有状态集 pod,将创建两个 PVC,如 volumeClaimTemplates 部分中所定义,但会延迟创建块存储器实例,直到安排了使用该存储器的有状态集 pod。 这种设置被称为 拓扑感知式容量调度

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-block-bronze-delayed
    parameters:
      billingType: hourly
      classVersion: "2"
      fsType: ext4
      iopsPerGB: "2"
      sizeRange: '[20-12000]Gi'
      type: Endurance
    provisioner: ibm.io/ibmc-block
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "nginx"
      replicas: 3
      podManagementPolicy: "Parallel"
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - nginx
                  topologyKey: failure-domain.beta.kubernetes.io/zone
          containers:
          - name: nginx
            image: k8s.gcr.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: myvol1
              mountPath: /usr/share/nginx/html
            - name: myvol2
              mountPath: /tmp1
      volumeClaimTemplates:
      - metadata:
          name: myvol1
        spec:
          accessModes:
          - ReadWriteOnce # access mode
          resources:
            requests:
              storage: 20Gi
          storageClassName: ibmc-block-bronze-delayed
      - metadata:
          name: myvol2
        spec:
          accessModes:
          - ReadWriteOnce # access mode
          resources:
            requests:
              storage: 20Gi
          storageClassName: ibmc-block-bronze-delayed
    
    name
    输入有状态集的名称。 您输入的名称将用于创建您的PVC名称,格式为:<volume_name>-<statefulset_name>-<replica_number>
    serviceName
    输入要用于公开有状态集的服务的名称。
    replicas
    输入有状态集的副本数。
    podManagementPolicy
    输入要用于有状态集的 pod 管理策略。
    • 有序就绪:使用此选项,状态集副本将依次部署。 例如,如果指定了 3 个副本,那么 Kubernetes 会为第一个副本创建 PVC,然后等待 PVC 绑定后,部署该有状态集副本,接着将 PVC 安装到该副本。 此部署完成后,将部署第二个副本。 如需了解此选项的更多信息,请发送电子邮件 OrderedReady,联系Pod Management
    • 并行:使用此选项,所有状态集副本的部署同时启动。 如果应用程序支持对副本进行并行部署,请使用此选项以节省 PVC 和有状态集副本的部署时间。
    matchLabels
    在规格选择器部分,输入您想要包含在状态集和PVC中的所有标签。 Kubernetes 无法识别您状态信息中 volumeClaimTemplates 中包含的标签。 您可能想要包含的样本标签包括:
    • 区域分区:如果您希望所有状态设置副本和 PVC 都创建在特定分区中,请添加这两个标签。 您还可以在使用的存储类中指定专区和区域。 如果您没有指定区域和地区,并且您拥有多区域集群,则会在所有区域之间轮流选择您的存储区域,以均衡所有区域之间的容量请求。
    • billingType:输入您希望用于PVC的账单类型。 请选择 hourlymonthly。 如果您不指定此标签,则所有PVC均以小时计费类型创建。
    labels
    在规范模板元数据部分中,输入添加到 spec.selector.matchLabels 部分的相同标签。
    affinity
    在规格模板规格部分,指定您的反亲和规则,以确保您的有状态集容器分布在多个工作节点和区域中。 此示例显示了反亲缘关系规则,其中有状态集 pod 不希望安排在运行具有 app: nginx 标签的 pod 的工作程序节点上。 topologykey: failure-domain.beta.kubernetes.io/zone 甚至进一步限制了此反亲缘关系规则:如果工作程序节点与具有 app: nginx 标签的 pod 位于同一专区中,那么此项会阻止 pod 安排在该工作程序节点上。 通过使用此反亲缘关系规则,可以跨工作程序节点和专区实现反亲缘关系。
    name
    在规范卷声明模板元数据部分中,输入卷的名称。 请使用您在 spec.containers.volumeMount.name 部分定义的名称。 您在此处输入的名称将用于创建您的PVC名称,格式为:<volume_name>-<statefulset_name>-<replica_number>
    storage
    在“规范卷声明模板规范资源请求”部分中,输入块存储器的大小 (以千兆字节 (Gi) 为单位)。
    iops
    在“规范卷声明模板规范资源请求”部分中,如果要供应 性能存储器,请输入 IOPS 数。 如果使用耐久性存储类并指定了一些 IOPS,那么将忽略 IOPS 数, 而改为使用在存储类中指定的 IOPS。
    storageClassName
    在“规范卷声明模板规范”部分中,输入要使用的存储类。 要列出现有的存储类别,请发送电子邮件至 kubectl get sc | grep block。 如果您没有指定存储类别,则 PVC 将使用集群中设置的默认存储类别创建。 请确保默认存储类使用 ibm.io/ibmc-block 配置程序,以便为您的有状态集配置块存储。
  4. 创建有状态集。

    kubectl apply -f statefulset.yaml
    
  5. 等待有状态集进行部署。

    kubectl describe statefulset <statefulset_name>
    

    要查看 PVC 的当前状态,请运行 kubectl get pvc。 您的PVC名称格式为 <volume_name>-<statefulset_name>-<replica_number>

使用现有PVC和状态集进行静态配置

您可以在创建有状态集之前预先供应 PVC,也可以将现有 PVC 用于有状态集。

如果是在创建有状态集时动态供应 PVC,那么 PVC 的名称将根据在有状态集 YAML 文件中使用的值来指定。 为了使有状态集使用现有 PVC,PVC 的名称必须与使用动态供应时自动创建的名称相匹配。

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

  1. 如果要在创建有状态集之前为该有状态集预供应 PVC,请执行向应用程序添加块存储器中的步骤 1-3,以便为每个有状态集副本创建 PVC。 请确保您创建的PVC名称符合以下格式:<volume_name>-<statefulset_name>-<replica_number>

    volume_name
    在状态集的 spec.volumeClaimTemplates.metadata.name 部分使用您想要指定的名称,例如 nginxvol
    statefulset_name
    在状态集的 metadata.name 部分使用您想要指定的名称,例如 nginx_statefulset
    replica_number
    输入您的复制品编号,从0开始。

    例如,如果必须创建 3 个有状态集副本,请使用以下名称创建 3 个 PVC:nginxvol-nginx_statefulset-0nginxvol-nginx_statefulset-1nginxvol-nginx_statefulset-2

    想要为现有存储设备创建 PVC 和 PV? 请使用静态供应来创建 PVC 和 PV。

  2. 执行动态供应:创建有状态集时创建 PVC 中的步骤来创建有状态集。 您的PVC名称遵循 <volume_name>-<statefulset_name>-<replica_number> 格式。 确保在有状态集规范中使用 PVC 名称的以下值: spec.volumeClaimTemplates.metadata.name : 请输入您的PVC名称的 <volume_name>

    metadata.name
    请输入您的PVC名称的 <statefulset_name>
    spec.replicas
    输入您要为状态集创建的副本数量。 副本数必须等于早先创建的 PVC 数。

    如果您的PVC位于不同的区域,请不要在您的状态集中包含区域或分区标签。

  3. 通过列出集群中的 pod,验证是否在有状态集副本 pod 中使用了 PVC。 识别属于有状态集的 pod。

    kubectl get pods
    
  4. 验证现有 PVC 是否已安装到有状态集副本。 请在 CLI 输出的 ClaimName 部分中查看 Volumes

    kubectl describe pod <pod_name>
    

    示例输出

    Name:           nginx-0
    Namespace:      default
    Node:           10.xxx.xx.xxx/10.xxx.xx.xxx
    Start Time:     Fri, 05 Oct 2022 13:24:59 -0400
    ...
    Volumes:
    myvol:
      Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
      ClaimName:  myvol-nginx-0
    ...
    

更改现有存储设备的大小和 IOPS

如果要提高存储容量或性能,可以修改现有卷。

有关计费的问题以及要查找如何使用 IBM Cloud 控制台来修改存储器的步骤,请参阅扩展块存储器容量调整 IOPS。 通过控制台进行的更新不会反映在持久卷 (PV) 中。 要将此信息添加到 PV,请运行 kubectl patch pv <pv_name> 并在 PV 的标签注释部分手动更新大小和 IOPS。

  1. 列出集群中的 PVC,并记下 VOLUME 列中关联 PV 的名称。

    kubectl get pvc
    

    示例输出

    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    myvol            Bound     pvc-01ac123a-123b-12c3-abcd-0a1234cb12d3   20Gi       RWO            ibmc-block-bronze    147d
    
  2. 如果要更改块存储器的 IOPS 和大小,请先在 PV 的 metadata.labels.IOPS 部分中编辑 IOPS。 您可以增加或减少 IOPS 值。 确保输入您拥有的存储类型支持的 IOPS。 例如,如果具有 4 IOPS 的耐久性块存储器,那么可以将 IOPS 更改为 2 或 10。 有关更多支持的 IOPS 值,请参阅决定块存储器配置

    kubectl edit pv <pv_name>
    

    要通过 CLI 更改 IOPS,还必须更改块存储器的大小。 如果要仅更改 IOPS,而不更改大小,那么必须通过控制台请求 IOPS 更改

  3. 编辑 PVC 并在 PVC 的 spec.resources.requests.storage 部分中添加新大小。 可以更改为更大的大小,但不能超过存储类设置的最大容量。 您无法缩减现有存储空间。 要查看存储类的可用大小,请参阅决定块存储器配置

    kubectl edit pvc <pvc_name>
    
  4. 验证是否请求了卷扩展。 在 CLI 输出的 FileSystemResizePendingConditions** 部分中看到 ** 消息时,说明成功请求了卷扩展。

    kubectl describe pvc <pvc_name>
    

    示例输出

    ...
    Conditions:
    Type                      Status  LastProbeTime                     LastTransitionTime                Reason  Message
    ----                      ------  -----------------                 ------------------                ------  -------
    FileSystemResizePending   True    Mon, 01 Jan 0001 00:00:00 +0000   Thu, 25 Apr 2022 15:52:49 -0400           Waiting for user to (re-)start a pod to finish file system resize of volume on node.
    
  5. 列出安装了 PVC 的所有 pod。 如果 pod 安装了 PVC,那么会自动处理卷扩展。 如果 pod 未安装 PVC,那么必须将 PVC 安装到 pod,以便可以处理卷扩展。

    kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.persistentVolumeClaim.claimName}{" "}{end}{end}' | grep "<pvc_name>"
    

    已安装的吊舱以 <pod_name>: <pvc_name> 格式返回。

  6. 如果 pod 未安装 PVC,请创建 pod 或部署并安装 PVC。 如果 pod 安装了 PVC,请继续执行下一步。

  7. 验证 CLI 输出的 Labels 部分中的大小和 IOPS 是否已更改。 此过程可能需要几分钟才能完成。

    kubectl describe pv <pv_name>
    

    示例输出

    ...
    Labels:       CapacityGb=50
    Datacenter=dal10
    IOPS=500
    
  8. 登录到安装PVC的吊舱。

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

    chroot /host
    
  10. 调整文件系统的大小。

    sudo resize2fs <filesystem-path>
    

    示例命令

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

    df -h
    

备份和复原数据

块存储器已供应到集群中的工作程序节点所在的位置。 存储器由 IBM 在集群服务器上托管,以在其中某个服务器停止运行时提供可用性。 但是,块存储器不会自动进行备份,因此在整个位置发生故障时可能无法进行访问。 为了防止数据丢失或损坏,可以设置定期备份,以便在需要时可用于复原数据。

查看块存储器的以下备份和复原选项:

设置定期快照

可以为块存储器设置定期快照,这是捕获某个时间点的实例状态的只读映像。

要存储快照,必须在块存储器上请求快照空间。 快照会存储在同一专区的现有存储器实例上。 如果用户意外从卷中除去重要数据,那么可以从快照复原数据。 \n \n ** 要为卷创建快照,请完成以下步骤。

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

  2. 登录到 ibmcloud sl CLI。

    ibmcloud sl init
    
  3. 列出集群中的现有 PV。

    kubectl get pv
    
  4. 获取要为其创建快照空间的 PV 的详细信息,并记下卷标识、大小和 IOPS。 大小和IOPS显示在CLI输出的标签部分

    kubectl describe pv <pv_name>
    
  5. 要找到卷标号,请查看CLI输出的 ibm.io/network-storage-id 注释。

  6. 使用您在先前步骤中检索到的参数为现有卷创建快照大小。

    ibmcloud sl block snapshot-order <volume_ID> --size <size> --tier <iops>
    
  7. 等待快照大小创建。 当CLI输出中的快照大小(GB) 从0变为您订购的大小时,快照大小配置成功。

    ibmcloud sl block volume-detail <volume_ID>
    
  8. 为卷创建快照,并记下创建的快照的标识。

    ibmcloud sl block snapshot-create <volume_ID>
    
  9. 验证快照是否已成功创建。

    ibmcloud sl block snapshot-list <volume_ID>
    
  10. 设置快照调度。 有关可用于快照调度的选项的更多信息,请参阅 CLI 文档

    ibmcloud sl block snapshot-enable VOLUME_ID <OPTIONS>
    
  11. 要将数据从快照复原到现有卷,请运行以下命令。

    ibmcloud sl block snapshot-restore <volume_ID> <snapshot_ID>
    

将快照复制到另一个区域

为了保护数据不受专区故障的影响,可以复制快照到其他专区中设置的块存储器实例。

数据只能从主存储器复制到备份存储器。 您无法将复制的块存储实例安装到集群中。 主存储器发生故障时,可以手动将复制的备份存储器设置为主存储器。 然后,可以将其安装到集群。 复原主存储器后,可以从备份存储器复原数据。

正在复制存储器

可以在原始存储器实例所在的专区中复制块存储器实例

复制项所含的数据是其创建的那个时间点上原始存储器实例的数据。 与副本不同,复制项用作独立于原始项的存储器实例。 要进行复制,请首先为卷设置快照。

将数据备份到 IBM Cloud® Object Storage

您可以使用 ibm-backup-restore Helm 图表在集群中启动备份和还原容器。

此 pod 包含一个脚本,用于对集群中的任何持久卷声明 (PVC) 运行一次性或定期备份。 数据存储在您在某个专区设置的 IBM Cloud® Object Storage 实例中。

块存储器使用 RWO 访问方式进行安装。 此访问权仅允许一次将一个 pod 安装到块存储器。 要备份数据,必须从存储器中卸载应用程序 pod,将其安装到备份 pod,备份数据,然后将存储器重新安装到应用程序 pod。

要使数据具有更高可用性,并保护应用程序不受专区故障的影响,请设置第二个 Object Storage 实例,并在各个专区之间复制数据。 如果您需要从您的 Object Storage 实例中恢复数据,请使用 Helm 图表附带的恢复容器。

在Pod和容器之间复制数据

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

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

运行 kubectl cp 命令时,如果未使用 -c 指定容器,那么该命令将使用 pod 中的第一个可用容器。

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

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

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

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

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

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

存储类参考

铜级

名称
ibmc-block-bronze
ibmc-block-retain-bronze
Type
耐久性存储器
文件系统
ext4
IOPS/千兆字节
2
大小范围(千兆字节)
20-12000 Gi
硬盘
SSD
回收策略
ibmc-block-bronze: 删除
ibmc-block-retain-bronze: 保留

银牌级

名称
ibmc-block-silver
ibmc-block-retain-silver
Type
耐久性存储器
文件系统
ext4
IOPS/千兆字节
4
大小范围(千兆字节)
20-12000 Gi
硬盘
SSD
回收策略
ibmc-block-silver: 删除
ibmc-block-retain-silver: 保留

金级

名称
ibmc-block-gold
ibmc-block-retain-gold
Type
耐久性存储器
文件系统
ext4
IOPS/千兆字节
10
大小范围(千兆字节)
20-4000 Gi
硬盘
SSD
回收策略
ibmc-block-gold: 删除
ibmc-block-retain-gold: 保留

定制

名称
ibmc-block-custom
ibmc-block-retain-custom
Type
性能文件系统
ext4
IOPS 和大小
大小范围(以千兆字节为单位)/ IOPS范围(以100为倍数)
  • 20-39 Gi / 100-1000 IOPS
  • 40-79 Gi / 100-2000 IOPS
  • 80-99 Gi / 100-4000 IOPS
  • 100-499 Gi / 100-6000 IOPS
  • 500-999 Gi / 100-10000 IOPS
  • 1000-1999 Gi / 100-20000 IOPS
  • 2000-2999 Gi / 200-40000 IOPS
  • 3000-3999 Gi / 200-48000 IOPS
  • 4000-7999 Gi / 300-48000 IOPS
  • 8000-9999 Gi / 500-48000 IOPS
  • 10000-12000 Gi / 1000-48000 IOPS
硬盘
IOPS 与千兆字节的比率确定供应的硬盘类型。 要确定 IOPS 与千兆字节的比率,请将 IOPS 除以存储器的大小。
示例:您选择了存储空间为100 IOPS的 500Gi。 因此,比率为 0.2 (100 IOPS/500 Gi)。
按比率划分的硬盘类型概览:
  • 小于或等于 0.3:SATA
  • 大于 0.3:SSD
回收策略
ibmc-block-custom: 删除
ibmc-block-retain-custom: 保留

样本定制存储类

您可以创建定制存储类并在 PVC 中使用该存储类。

IBM Cloud Kubernetes Service 提供了预定义的存储类,用于供应具有特定层和配置的块存储器。 有时,您可能希望为存储配置预定义存储类别中未涵盖的不同配置。 您可以使用本主题中的示例来找到样本定制存储类。

要创建定制存储类,请参阅定制存储类。 然后查看在 PVC 中使用定制存储类

创建拓扑感知存储器

要在多专区集群中使用块存储器,必须将 pod 安排在块存储器实例所在的专区中,以便您可以读取和写入卷。 在 Kubernetes 引入拓扑感知卷安排之前,创建 PVC 时,存储器的动态供应会自动创建块存储器实例。 然后,在创建 pod 时,Kubernetes 调度程序会尝试将 pod 部署到块存储器实例所在的数据中心。

在不了解 pod 约束的情况下创建块存储器实例可能会导致意外结果。 例如,可能会由于存储器所在的工作程序节点的资源不足,或者该工作程序节点有污点而不允许安排 pod,导致您的 pod 无法安排到该工作程序节点。 使用拓扑感知卷安排时,会延迟块存储器实例创建,直到创建了使用该存储器的第一个 pod。

要使用拓扑感知式容量调度,请确保您安装了 IBM Cloud Block Storage 插件版本 1.2.0 或更高版本。

以下示例显示了如何创建存储类以用于延迟块存储器实例创建,直到使用此存储器的第一个 pod 准备就绪可安排为止。 要延迟创建,必须包含 volumeBindingMode: WaitForFirstConsumer 选项。 如果不选择此选项,则 volumeBindingMode 将自动设置为 Immediate,并在创建PVC时创建块存储实例。

持久性块存储示例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-bronze-delayed
  parameters:
    billingType: hourly
    classVersion: "2"
    fsType: ext4
    iopsPerGB: "2"
    sizeRange: '[20-12000]Gi'
    type: Endurance
  provisioner: ibm.io/ibmc-block
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer

性能块存储示例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-performance-storageclass
  labels:
  kubernetes.io/cluster-service: "true"
  provisioner: ibm.io/ibmc-block
  parameters:
    billingType: "hourly"
    classVersion: "2"
    sizeIOPSRange: |-
    "[20-39]Gi:[100-1000]"
    "[40-79]Gi:[100-2000]"
    "[80-99]Gi:[100-4000]"
    "[100-499]Gi:[100-6000]"
    "[500-999]Gi:[100-10000]"
    "[1000-1999]Gi:[100-20000]"
    "[2000-2999]Gi:[200-40000]"
    "[3000-3999]Gi:[200-48000]"
    "[4000-7999]Gi:[300-48000]"
    "[8000-9999]Gi:[500-48000]"
    "[10000-12000]Gi:[1000-48000]"
    type: "Performance"
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer

指定专区和区域

如果要在特定专区中创建块存储器,可以在定制存储类中指定专区和区域。

如果使用的是 IBM Cloud Block Storage V1.0.0 插件,或者要在特定专区中静态供应块存储器,请使用定制存储类。 在其他所有情况下,请直接在 PVC 中指定专区

以下 .yaml 文件定制基于 ibm-block-silver 非保留存储类的存储类:type"Endurance"iopsPerGB4sizeRange"[20-12000]Gi"reclaimPolicy 设置为 "Delete"。 专区指定为 dal12。 要将其他存储类用作您的基础,请参阅存储类参考

在集群和工作程序节点所在的区域和专区中创建存储类。 要获取您所在集群的区域,请运行 ibmcloud ks cluster get --cluster <cluster_name_or_ID> 并在主 URL 中查找区域前缀,例如 eu-dehttps://c2.eu-de.containers.cloud.ibm.com:11111 中。 要获取您的工作节点的区域,请运行 ibmcloud ks worker ls --cluster <cluster_name_or_ID>

持久性块存储示例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-silver-mycustom-storageclass
  labels:
    kubernetes.io/cluster-service: "true"
provisioner: ibm.io/ibmc-block
parameters:
  zone: "dal12"
  region: "us-south"
  type: "Endurance"
  iopsPerGB: "4"
  sizeRange: "[20-12000]Gi"
reclaimPolicy: "Delete"

性能块存储示例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
    name: ibmc-block-performance-storageclass
labels:
  kubernetes.io/cluster-service: "true"
provisioner: ibm.io/ibmc-block
parameters:
  zone: "dal12"
  region: "us-south"
  type: "Performance"
  sizeIOPSRange: |-
  "[20-39]Gi:[100-1000]"
  "[40-79]Gi:[100-2000]"
  "[80-99]Gi:[100-4000]"
  "[100-499]Gi:[100-6000]"
  "[500-999]Gi:[100-10000]"
  "[1000-1999]Gi:[100-20000]"
  "[2000-2999]Gi:[200-40000]"
  "[3000-3999]Gi:[200-48000]"
  "[4000-7999]Gi:[300-48000]"
  "[8000-9999]Gi:[500-48000]"
  "[10000-12000]Gi:[1000-48000]"
reclaimPolicy: "Delete"

使用 XFS 文件系统安装块存储器

以下示例创建使用 XFS 文件系统来供应块存储器的存储类。

持久性块存储示例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-custom-xfs
labels:
  addonmanager.kubernetes.io/mode: Reconcile
provisioner: ibm.io/ibmc-block
parameters:
  type: "Endurance"
  iopsPerGB: "4"
  sizeRange: "[20-12000]Gi"
  fsType: "xfs"
reclaimPolicy: "Delete"

性能块存储示例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-custom-xfs
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
provisioner: ibm.io/ibmc-block
parameters:
  classVersion: "2"
  type: "Performance"
  sizeIOPSRange: |-
    [20-39]Gi:[100-1000]
    [40-79]Gi:[100-2000]
    [80-99]Gi:[100-4000]
    [100-499]Gi:[100-6000]
    [500-999]Gi:[100-10000]
    [1000-1999]Gi:[100-20000]
    [2000-2999]Gi:[200-40000]
    [3000-3999]Gi:[200-48000]
    [4000-7999]Gi:[300-48000]
    [8000-9999]Gi:[500-48000]
    [10000-12000]Gi:[1000-48000]
  fsType: "xfs"
reclaimPolicy: "Delete"

从集群中除去持久性存储器

在集群中设置持久性存储器时,有三个主要组件:Kubernetes 持久卷声明 (PVC)(用于请求存储器)、Kubernetes 持久卷 (PV)(将安装到 pod,并在 PVC 中进行描述)和 IBM Cloud 基础架构实例(例如,经典文件存储器或块存储器)。 所有这三个组件可能需要分别删除,具体取决于存储器的创建方式。

了解存储器除去选项

根据供应存储器的方式以及已除去的组件,从 IBM Cloud 帐户中除去持久性存储器的操作会有所不同。

当我删除集群时,我的持久化存储是否会被删除?
在集群删除期间,您可以选择除去持久性存储器。 但是,根据存储器的供应方式,除去存储器时,可能不会包含所有存储组件。 如果您使用存储类动态配置存储,并设置了 reclaimPolicy: Delete,则删除集群时,您的PVC、PV和存储实例也会自动删除。 对于静态配置的存储或使用设置了 reclaimPolicy: Retain 的存储类配置的存储,当您删除集群时,PVC和PV将被删除,但您的存储实例和数据将保留。 您仍将为存储器实例付费。 此外,如果删除的是状态为运行状况不佳的集群,那么即使选择除去存储器,存储器也可能会仍然存在。
如果我想保留集群,该如何删除存储?
使用设置了 reclaimPolicy: Delete 的存储类动态供应存储器时,可以通过除去 PVC 来启动持久性存储器的删除过程。 这将自动除去 PVC、PV 和存储器实例。 reclaimPolicy: Retain 对于静态配置的存储或使用存储类别配置的存储,您必须手动删除PVC、PV和存储实例,以避免产生额外费用。
删除存储后,账单如何停止?
根据您删除的存储组件和删除时间,计费周期可能不会立即停止。 如果删除了 PVC 和 PV,但未删除 IBM Cloud 帐户中的存储器实例,那么该实例仍然存在,因此仍需要为此付费。

如果删除了 PVC、PV 和存储器实例,那么计费周期会停止,具体取决于在供应存储器时选择的 billingType 以及选择的存储器删除方式。

  • 当您从 IBM Cloud 控制台或CLI手动取消持久存储实例时,计费将停止,具体如下:

    • 按小时计费存储器:将立即停止计费。 取消存储器后,可能最长 72 小时内仍会在控制台中看到该存储器实例。
    • 按月计费存储器:可以选择立即取消或在周年日期取消。 在这两种情况下,将计费到当前计费周期结束,并停止对下一个计费周期的计费。 取消存储器后,可能最长 72 小时内仍会在控制台或 CLI 中看到该存储器实例。
    • 立即取消:选择此选项可立即除去存储器。 您或您的用户都无法再使用存储器,也无法恢复数据。
    • 周年日期:选择此选项可在下一个周年日期取消存储器。 存储器实例会一直保持活动状态,直到下一个周年日期为止,并且在此日期之前,您可以继续使用这些存储器实例,例如让团队有时间来备份数据。
  • 使用设置了 reclaimPolicy: Delete 的存储类动态供应存储器时,如果您选择除去 PVC,将立即除去 PV 和存储器实例。 对于按小时计费的存储器,计费会立即停止。 对于按月计费的存储器,您仍需要为该月的剩余时间付费。 除去存储器并且计费停止后,可能最长 72 小时内仍会在控制台或 CLI 中看到该存储器实例。

在删除持久性存储之前,我需要了解什么?
清除持久性存储器时,将删除其中存储的所有数据。 如果您需要数据的副本,请进行备份。
我删除了我的存储实例。 为什么我还能看到我的实例?
除去持久性存储器后,除去操作可能最长需要 72 小时才能完全处理好,在此之后存储器不会再显示在 IBM Cloud 控制台或 CLI 中。

清除持久性存储器

从 IBM Cloud 帐户中除去 PVC、PV 和存储器实例,可避免对持久性存储器进一步收费。

开始之前:

要清除持久数据,请执行以下操作:

  1. 列出集群中的 PVC,并记下 PVC 的 NAMESTORAGECLASS 以及绑定到该 PVC 并显示为 VOLUME 的 PV 的名称。

    kubectl get pvc
    

    示例输出

    NAME                  STATUS    VOLUME                                     CAPACITY   ACCESSMODES   STORAGECLASS            AGE
    claim1   Bound     pvc-06886b77-102b-11e8-968a-f6612bb731fb   20Gi       RWO           class       78d
    claim2     Bound     pvc-457a2b96-fafc-11e7-8ff9-b6c8f770356c   4Gi        RWX           class 105d
    claim3      Bound     pvc-1efef0ba-0c48-11e8-968a-f6612bb731fb   24Gi       RWX           class        83d
    
  2. 查看存储类的 ReclaimPolicybillingType

    kubectl describe storageclass <storageclass_name>
    

    如果回收策略显示 Delete,那么在除去 PVC 时会除去 PV 和物理存储器。 如果回收策略显示 Retain,或者所供应的存储器不具有存储类,那么在除去 PVC 时不会除去 PV 和物理存储器。 PVC、PV 和物理存储器必须分别进行除去。

    如果存储器按月收费,那么即使在计费周期结束之前除去了存储器,也仍需要按整月付费。

  3. 除去安装了 PVC 的所有 pod。 列出安装了 PVC 的所有 pod。 如果您的CLI输出中没有返回任何容器,则说明您没有使用PVC的容器。

    kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.persistentVolumeClaim.claimName}{" "}{end}{end}' | grep "<pvc_name>"
    

    示例输出

    depl-12345-prz7b:    claim1
    
  4. 除去使用 PVC 的 pod。 如果 pod 是部署的一部分,请除去该部署。

    kubectl delete pod <pod_name>
    
  5. 验证 pod 是否已除去。

    kubectl get pods
    
  6. 除去 PVC。

    kubectl delete pvc <pvc_name>
    
  7. 查看 PV 的阶段状态。 使用先前检索到的显示为 VOLUME 的 PV 的名称。 除去 PVC 时,会释放绑定到该 PVC 的 PV。 如果 PV 是自动删除的,那么该 PV 会进入 Deleting 状态;如果必须手动删除 PV,那么该 PV 会进入 Released 状态,具体取决于存储器的供应方式。 :对于自动删除的 PV,在删除之前,阶段状态可能会短暂地显示为 Released。 请在几分钟后重新运行该命令以查看该 PV 是否已除去。

    kubectl get pv <pv_name>
    
  8. 如果 PV 未删除,请手动除去该 PV。

    kubectl delete pv <pv_name>
    
  9. 验证 PV 是否已除去。

    kubectl get pv
    
  10. 列出 PV 指向的物理存储器实例,并记下物理存储器实例的 id

    ibmcloud sl block volume-list --columns id --columns notes | grep <pv_name>
    

    示例输出

    12345678   {"plugin":"ibmcloud-block-storage-plugin-689df949d6-4n9qg","region":"us-south","cluster":"aa1a11a1a11b2b2bb22b22222c3c3333","type":"Endurance","ns":"default","pvc":"block-storage-pvc","pv":"pvc-d979977d-d79d-77d9-9d7d-d7d97ddd99d7","storageclass":"ibmc-block-silver","reclaim":"Delete"}
    

    了解 Notes 字段信息:

    "plugin":"ibm-file-plugin-5b55b7b77b-55bb7"
    仪表盘使用的存储插件。
    "region":"us-south"
    您的集群所在的区域。
    "cluster":"aa1a11a1a11b2b2bb22b22222c3c3333"
    与存储实例关联的集群ID。
    "type":"Endurance"
    文件或块存储类型,可以是 EndurancePerformance
    "ns":"default"
    存储实例部署到的命名空间。
    "pvc":"block-storage-pvc"
    与存储实例关联的PVC名称。
    "pv":"pvc-d979977d-d79d-77d9-9d7d-d7d97ddd99d7"
    与存储实例关联的PV。
    "storageclass":"ibmc-file-gold"
    存储类别:青铜、白银、黄金或自定义。
  11. 除去物理存储器实例。

    ibmcloud sl block volume-cancel <classic_block_id>
    
  12. 验证物理存储器实例是否已除去。

删除过程最长可能需要 72 小时才能完成。

ibmcloud sl block volume-list

limited 连接 PV 设置监视

创建使用 Block Storage for Classic的 pod 和 PVC 时,会将 2 目标端口分配给安装了存储器的底层持久卷 (PV)。 多个目标端口允许在一个端口发生故障时进行故障转移。

在先前版本的 Block Storage for Classic 驱动程序中,在转出期间安装 PV 时无法找到 2 目标端口导致部署失败。

但是,有时 (例如,在 IaaS 维护窗口期间),您可能希望 pod 仅在持久卷上提供 1 目标端口的情况下成功部署。

从 Block Storage for Classic 驱动程序版本 2.4.12 开始,即使 PV 只能分配 1 目标端口,pod 也将成功部署。 除此行为更改外,PV 现在还包含新标签以指示网络可用性,其中 healthy 表示已分配 2 个目标端口,而 limited 表示在安装期间只能分配 1 个目标端口。

要监视与 Block Storage for Classic 的 pod 连接受限的实例,您可以设置用于查找 limited 标签的定制警报。 然后,将警报阈值配置为 >0

  1. 从 IBM Cloud Monitoring 仪表板中,选择 新建警报 > 度量

  2. 选择 Prom 查询,然后输入 kube_persistentvolume_labels{label_ibm_io_pv_connectivity_status='limited'}

  3. 将阈值设置为 >0,并设置要用于此警报的严重性。

  4. 选择通知通道并保存警报。