设置 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 安装。
-
为 PVC 创建文件并将其命名为
pvc.yaml
。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: ibmc-vpc-block-5iops-tier accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
-
在集群中创建 PVC。
oc apply -f pvc.yaml
-
绑定 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
-
在集群中创建部署。
oc apply -f deployment.yaml
有关更多信息,请参阅以下链接。
向应用程序添加 Block Storage for VPC
选择 Block Storage for VPC 概要文件,并创建持久卷声明,以便为集群动态供应 Block Storage for VPC。 动态供应将自动创建匹配的持久卷,并在 IBM Cloud 帐户中订购物理存储设备。
-
决定能最好地满足您所需的容量和性能需求的 Block Storage for VPC 概要文件。
-
为 Block Storage for VPC 概要文件选择相应的存储类。
缺省情况下,所有 IBM 预定义的存储类都会为 Block Storage for VPC 设置
ext4
文件系统。 如果要使用其他文件系统(例如,xfs
或ext3
),请创建定制存储类。- 10 IOPS/GB:
ibmc-vpc-block-10iops-tier
或ibmc-vpc-block-retain-10iops-tier
- 5 IOPS/GB:
ibmc-vpc-block-5iops-tier
或ibmc-vpc-block-retain-5iops-tier
- 3 IOPS/GB:
ibmc-vpc-block-general-purpose
或ibmc-vpc-block-retain-general-purpose
- 定制:
ibmc-vpc-block-custom
或ibmc-vpc-block-retain-custom
- 10 IOPS/GB:
-
决定 Block Storage for VPC 配置。
- 选择存储器的大小。 确保您选择的 Block Storage for VPC 概要文件支持该大小。
- 选择在删除集群或持久卷声明 (PVC) 后是否要保留数据。
- 如果要保留数据,请选择
retain
存储类。 删除 PVC 时,仅会删除 PVC。 持久卷 (PV)、IBM Cloud 帐户中的物理存储设备以及数据仍会存在。 要回收存储器并再次在集群中使用,必须除去 PV,并执行使用现有 Block Storage for VPC 的步骤。 - 如果要在删除 PVC 时删除 PV、数据和物理 Block Storage for VPC,请选择不带
retain
的存储类。
- 如果要保留数据,请选择
-
创建配置文件以定义持久卷声明,并将配置保存为 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.
-
在集群中创建 PVC。
oc apply -f pvc.yaml
-
验证 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>
-
为应用程序创建部署配置文件,并将 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.app
和labels.app
- 在规范选择器和模板元数据部分中,输入应用程序的标签。
image
- 指定要使用的容器映像的名称。 要列出 IBM Cloud Container Registry 帐户中的可用映像,请运行
ibmcloud cr image-list
。 name
- 指定要在 pod 中部署的容器的名称。
mountPath
- 在容器卷安装部分中,指定在容器中安装 PVC 的目录的绝对路径。
name
- 在“容器卷安装”部分中,输入要安装到 pod 的卷的名称。 可以输入所需的任何名称。
name
- 在“卷”部分中,输入要安装到 pod 的卷的名称。 通常情况下,该名称与
volumeMounts.name
相同。 claimName
- 在卷持久卷声明部分中,输入先前创建的 PVC 的名称。
-
在集群中创建部署。
oc apply -f deployment.yaml
-
验证 PVC 是否已成功安装到应用程序。 pod 可能需要几分钟时间才能进入 Running 状态。
在部署应用程序期间,您可能会在 CLI 输出的
Unable to mount volumes
Events** 部分中看到间歇性的 ** 错误。 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 来静态配置存储。
只能将卷连接到一个工作程序节点。 请确保卷与工作程序节点位于同一专区中,以便连接成功。
-
确定要连接到 VPC 集群中工作程序节点的卷。 注意音量 ID。
ibmcloud is volumes
-
列出卷的详细信息。 请注意 大小,区域和 IOPS。 这些值用于创建 PV。
ibmcloud is volume <volume_id>
-
检索 VPC 集群中工作程序节点的列表。 请注意与存储卷位于同一专区中的工作程序节点的 专区。
ibmcloud oc worker ls -c <cluster_name>
-
可选:如果已使用
retain
存储类供应了物理 Block Storage for VPC 实例,那么在除去 PVC 时不会除去 PV 和物理存储器。 要在集群中使用物理 Block Storage for VPC 设备,必须先除去现有 PV。-
列出集群中的 PV,并查找属于 Block Storage for VPC 设备的 PV。 该 PV 处于
released
状态。oc get pv
-
除去该 PV。
oc delete pv <pv_name>
-
-
为 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) 为单位)。 例如,如果设备大小为 100 GB,请输入
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。 volumeId
和spec.csi.volumeHandle
- 在 spec CSI 卷属性部分中,输入先前检索的 Block Storage for VPC 卷的标识。
storageClassName
- 对于规格存储类名称,请输入空字符串。
matchExpressions
- 在规范节点亲缘关系部分中,输入节点选择器术语以与区域匹配。 对于密钥,请输入
failure-domain.beta.kubernetes.io/zone
。 对于该值,输入要在其中附加存储器的工作程序节点的区域。 matchExpressions
- 在规范节点亲缘关系部分中,输入节点选择器术语以与区域匹配。 对于密钥,请输入
failure-domain.beta.kubernetes.io/region
。 对于该值,请输入要在其中附加存储器的工作程序节点的区域。
-
在集群中创建 PV。
oc apply -f pv.yaml
-
验证是否已在集群中创建 PV。
oc get pv
-
为 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: ""
-
创建 PVC。
oc apply -f pvc.yaml
-
验证 PVC 是否已创建并与先前创建的 PV 绑定。 此过程可能需要几分钟时间。
oc describe pvc <pvc_name>
- 创建使用 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卷快照资源?
-
检查更新是否可用。 如果更新可用,那么会使用星号标记插件版本,并显示最新版本。 请注意最新版本,因为稍后将使用此值。
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
-
更新附加组件。 请注意,根据您安装的版本,更新命令有所不同。
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]
-
验证附加组件是否处于
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中的缺省存储类设置。 有关更多信息,请参阅 更改缺省存储类。 -
如果您根据缺省 Block Storage for VPC 存储类创建了自己的存储类,那么必须重新创建这些存储类以更新参数。 有关更多信息,请参阅 在更新到 V 4.2后重新创建您自己的存储类。
在更新到 V 4.2 之后重新创建您自己的存储类
对于 V 4.2,存储类的缺省参数已更改。 不再使用 sizeRange
或 iopsRange
参数。 如果您创建了任何使用这些参数的自己的存储类,那么必须编辑自己的存储类以除去这些参数。 要更改您自己的存储类中的参数,必须删除并重新创建这些参数。 先前,每个存储类都提供了 sizeRange
和 iopsRange
作为参考信息。 对于 V 4.2,已除去这些引用。
现在,有关块存储器概要文件,大小和 IOP 的信息,请参阅 块存储器概要文件 参考。
-
要查找您自己的存储类的详细信息,请运行以下命令。
oc describe sc STORAGECLASS
-
如果存储类使用
sizeRange
或iopsRange
,请获取存储类 YAML 并将其保存到文件中。oc get sc STORAGECLASS -o yaml
-
在从先前命令的输出保存的文件中,除去
sizeRange
或iopsRange
参数。 -
从集群中删除存储类。
oc delete sc STORAGECLASS
-
使用先前创建的文件在集群中重新创建存储类。
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% 的性能。 但是,确切的影响取决于工作程序节点和存储卷配置。 在启用加密时,请考虑允许对性能产生影响。
-
创建要使用的 KMS 提供程序的实例。
-
在 KMS 实例中创建一个根密钥。
- Key Protect 根密钥。
- Hyper Protect Crypto Services 根密钥。 缺省情况下,会创建没有到期日期的根密钥。
-
设置服务对服务授权。 授权 Block Storage for VPC 访问 IBM® Key Protect。 确保让 Block Storage for VPC 至少有
Reader
访问 KMS 实例的权限。 -
确定要在定制存储类中还是在 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。
-
按照 添加 Block Storage for VPC 到应用程序 中的步骤 4-9 创建一个带有自定义存储类别的 PVC,以配置 Block Storage for VPC,该 PVC 已配置为使用 Key Protect 根密钥进行加密。 然后,将此存储器安装到应用程序 pod。
应用程序可能需要几分钟时间来安装存储器,然后才能进入 Running 状态。
-
验证数据是否已加密。 列出 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
-
使用卷 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 secret 来更改某些默认 PVC 设置,从而创建具有自定义设置的 Block Storage for VPC。
- 使用秘密并在自定义存储类中指定参数有什么好处?
- 作为群集管理员,如果希望群集用户创建的所有 PVC 都以特定配置进行供应,而又不想让群集用户覆盖默认配置,则可 创建自定义存储类。
- 但是,当需要多个配置并且您不希望为每个可能的 PVC 配置创建定制存储类时,可以使用缺省 PVC 设置以及对通用 Kubernetes 私钥的引用来创建一个定制存储类。 如果集群用户必须覆盖定制存储类的缺省设置,那么他们可以通过创建保存自己的定制设置的 Kubernetes 私钥来实现这一点。
要为 Block Storage for VPC 实例设置加密时,如果想将 Key Protect 根密钥 CRN 编码到 base64,而不是直接在自定义存储类中提供密钥,也可以使用 Kubernetes secret。
更改缺省存储类
对于 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
存储类。
-
编辑
addon-vpc-block-csi-driver-configmap
oc edit cm addon-vpc-block-csi-driver-configmap -n kube-system
-
将
IsStorageClassDefault
设置更改为false
。 -
保存并退出。
-
等待 15 分钟,并通过获取
ibmc-vpc-block-10iops-tier
存储类的详细信息来验证更改。oc get sc ibmc-vpc-block-10iops-tier -o yaml
创建您自己的存储类
使用 Block Storage for VPC 实例的首选设置来创建您自己的定制存储类。
在达拉斯、法兰克福、伦敦、马德里、大阪、圣保罗、悉尼、东京、多伦多和华盛顿提供固态硬盘定义的性能配置文件(SDP),D.C。 在达拉斯、法兰克福、东京和华盛顿,D.C。
如果要执行以下操作,您可以创建自己的存储类:
- 设置定制 IOPs 值。
- 使用非
ext4
的文件系统类型设置 Block Storage for VPC。 - 设置加密。
- 设置固态硬盘定义的性能。
- 准备工作
- 查看 存储类参考 以确定要用于存储类的
profile
。 - 如果您想为 Block Storage for VPC 指定自定义 IOP,也可以查看自定义 配置文件。
- 如果要使用固态硬盘定义的性能 (SDP) 配置文件,请 查看容量范围和 IOPs 详情。 请注意,使用固态硬盘定义性能时,卷的容量由您指定的 IOP 和吞吐量决定。
- 您可以使用现有的存储类作为创建自己存储类的起点。 使用
oc get sc <storageclass> -o yaml
命令保存现有存储类的详细信息。
-
创建定制存储类配置文件。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage_class_name> provisioner: vpc.block.csi.ibm.io parameters: profile: "<profile>" # general-purpose, sdp, 5iops-tier, 10iops-tier, or custom csi.storage.k8s.io/fstype: "<file_system_type>" # xfs, ext3, or ext4 billingType: "hourly" encrypted: "<encrypted_true_false>" encryptionKey: "<encryption_key>" resourceGroup: "" zone: "<zone>" region: "<region>" tags: "<tags>" generation: "gc" throughput: "<throughput>" # Example: 2000 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
- 输入您在上一步中选择的配置文件。 选择
general-purpose
,sdp
,5iops-tier
,10iops-tier
,或自定义使用自定义 IOPs 值。 要查找特定配置文件支持的存储大小,请参阅 分层 IOPS 配置文件。 使用此存储类的任何 PVC 都必须指定此范围内的大小值。 csi.storage.k8s.io/fstype
- 在参数中,输入 Block Storage for VPC 实例的文件系统。 选择
xfs
、ext3
或ext4
。 如果要修改卷的所有权或权限,必须在自己的存储类中指定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
,则输入 Key Protect 服务实例的根密钥 CRN,您希望用它来加密 Block Storage for VPC 卷。 有关加密数据的更多信息,请参阅为 Block Storage for VPC 设置加密。 zone
- 在参数中,输入要在其中创建 Block Storage for VPC 实例的 VPC 区域。 确保使用的是工作程序节点连接到的专区。 要列出工作节点使用的 VPC 区域,请运行
ibmcloud oc cluster get --cluster <cluster_name_or_ID>
并查看 CLI 输出中的 Worker Zones 字段。 如果不指定区域,则会自动为 Block Storage for VPC 实例选择一个工作节点区域。 region
- 要在其中连接存储器的工作程序节点的区域。
tags
- 在参数中,输入要应用于 Block Storage for VPC 实例的以空格分隔的标记列表。 标记可帮助您更轻松地找到实例,或者根据常见特征(例如,应用程序或它所用于的环境)对实例分组。
iops
- 如果
profile
输入的是custom
或sdp
,请输入您希望 Block Storage for VPC 使用的 IOP 值。 请参阅 Block Storage for VPC 自定义 IOPs 配置文件 表,查看按卷大小划分的支持 IOPs 范围列表。 throughput
- 如果使用
sdp
配置文件,请输入该值。 更多信息,请参阅 SDP 配置文件的 IOP 和吞吐量详情 reclaimPolicy
- 输入存储类的回收策略。 如果要在除去 PVC 时保留 PV、物理存储设备和数据,请输入
Retain
。 如果要在除去 PVC 时删除 PV、物理存储设备和数据,请输入Delete
。 allowVolumeExpansion
- 输入存储类的卷扩展策略。 如果要允许音量扩展,请输入
true
。 如果不想允许音量扩展,请输入false
。 volumeBindingMode
- 选择是否要延迟 Block Storage for VPC 实例创建,直到使用此存储器的第一个 pod 准备就绪可安排为止。 要延迟创建,请输入
WaitForFirstConsumer
。 要在创建 PVC 时创建实例,请输入Immediate
。
-
在集群中创建定制存储类。
oc apply -f custom-storageclass.yaml
-
验证存储类是否在集群中可用。
oc get sc
示例输出
NAME PROVISIONER AGE <custom-storageclass> vpc.block.csi.ibm.io 4m26s
-
执行向应用程序添加 Block Storage for VPC 中的步骤来使用定制存储类创建 PVC,以供应 Block Storage for VPC。 然后,将此存储器安装到样本应用程序。
验证 Block Storage for VPC 文件系统
您可以创建定制存储类,以供应使用其他文件系统(例如,xfs
或 ext3
)的 Block Storage for VPC。 缺省情况下,会为所有 Block Storage for VPC 实例供应 ext4
文件系统。
-
执行步骤以使用要利用的文件系统来创建定制存储类。
-
按照 添加 Block Storage for VPC 到应用程序 中的步骤 4-9 创建带有自定义存储类的 PVC,以配置带有不同文件系统的 Block Storage for VPC。 然后,将此存储器安装到应用程序 pod。
应用程序可能需要几分钟时间来安装存储器,然后才能进入 Running 状态。
-
验证存储器是否已安装有正确的文件系统。 列出集群中的 pod,并记下用于安装存储器的 pod 的 Name。
oc get pods
-
登录到 pod。
oc exec <pod_name> -it bash
-
列出 pod 中的安装路径。
mount | grep /dev/xvdg
xfs
的输出示例。/dev/xvdg on /test type xfs (rw,relatime,attr2,inode64,noquota)
-
退出 pod。
exit
更新 VolumeAttachLimit
在 Block Storage for VPC 集群附加组件的版本 5.2
和更高版本中,您可以通过编辑 configmap 来编辑可附加到每个节点的最大卷数。 默认值为 12
。
必须核准您的帐户才能使用此功能。
-
编辑配置映射。 将
VALUE
替换为要设置的卷连接限制。kubectl patch configmap/addon-vpc-block-csi-driver-configmap \ -n kube-system \ --type merge \ -p '{"data":{"VolumeAttachmentLimit":"VALUE"}}'
-
等待
kube-system
名称空间中的ibm-vpc-block-csi-node
pod 重新启动。 验证 pod 是否已重新启动。kubectl get pods -n kube-system -w| grep block-csi
-
现在,您可以通过使用动态供应或手动创建附件将卷附加到工作程序节点。 有关更多信息,请参阅 将 Block Storage for VPC 添加到应用程序 或 使用现有 Block Storage for VPC 实例。
在 Kubernetes 私钥中存储定制 PVC 设置
在 Kubernetes 私钥中指定 PVC 设置,并在定制存储类中引用此私钥。 然后,使用定制存储类通过在私钥中设置的定制参数来创建 PVC。
- 使用 Kubernetes 秘密有哪些选择?
- 作为集群管理员,您可以选择是否要允许每个集群用户覆盖存储类的缺省设置,或者是否要创建集群中每个用户都必须使用的私钥并对 Key Protect 根密钥 CRN 强制实施 Base64 编码。
- 每个用户都可以定制缺省设置
- 在这种情况下,群集管理员会创建一个自定义存储类,其中包含默认的 PVC 设置和对通用 Kubernetes secret 的引用。 群集用户可以通过创建带有所需 PVC 设置的 Kubernetes secret 来覆盖存储类的默认设置。 为了将密文中的自定义设置应用到 Block Storage for VPC 实例,必须创建一个与 Kubernetes 密文同名的 PVC。
- 对 Key Protect 根密钥实施 base64 编码
- 在这种情况下,您需要创建一个带有默认 PVC 设置的自定义存储类,以及一个对静态 Kubernetes secret 的引用,以覆盖或增强自定义存储类的默认设置。 群集用户不能通过创建自己的 Kubernetes 秘密来覆盖默认设置。 集群用户必须改为使用在定制存储类和私钥中选择的配置来供应 Block Storage for VPC。 与只创建 自定义存储类 相比,使用这种方法的好处是,当你想对 Block Storage for VPC 实例中的数据进行加密时,可以对 Key Protect 服务实例的根密钥 CRN 强制执行 base64 编码。
- 在开始使用 Kubernetes 秘密进行 PVC 设置之前,我需要注意些什么?
- 某些 PVC 设置,如
reclaimPolicy
、fstype
或volumeBindingMode
,不能在 Kubernetes 秘密中设置,必须在存储类中设置。 作为集群管理员,如果要允许集群用户覆盖缺省设置,那么必须确保设置足够的定制存储类来引用通用 Kubernetes 私钥,以便用户可以使用不同的reclaimPolicy
、fstype
和volumeBindingMode
设置来供应 Block Storage for VPC。
允许每个用户定制缺省 PVC 设置
-
以集群管理员身份,执行创建定制存储类的步骤。 在自定义存储类 YAML 文件中,在
metadata.parameters
部分引用 Kubernetes secret,如下所示。 确保按原样添加代码,而不更改变量名称。csi.storage.k8s.io/provisioner-secret-name: ${pvc.name} csi.storage.k8s.io/provisioner-secret-namespace: ${pvc.namespace}
-
以集群用户身份,创建 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 输出中的 Worker Zones 字段。 如果不指定区域,则会自动为 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
- 在“数据”部分,如果输入
true
表示parameters.encrypted
,则输入您的 Key Protect 服务实例的根密钥 CRN,您想用它来加密 Block Storage for VPC 卷。 要在密文中使用根密钥 CRN,必须先通过运行echo -n "<root_key_CRN>" | base64
将其转换为 base64。 有关加密数据的更多信息,请参阅为 Block Storage for VPC 设置加密。
-
创建 Kubernetes 私钥。
oc apply -f secret.yaml
-
执行向应用程序添加 Block Storage for VPC 中的步骤来使用定制设置创建 PVC。 确保使用集群管理员创建的定制存储类来创建 PVC,并将用于私钥的名称用于 PVC。 对私钥和 PVC 使用相同的名称会触发存储器提供者在 PVC 中应用私钥的设置。
对 Key Protect 根密钥 CRN 强制实施 Base64 编码
-
以集群管理员身份,创建 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
- 在“数据”部分,如果输入
true
表示parameters.encrypted
,则输入 Key Protect 服务实例的根密钥 CRN,您希望用它来加密 Block Storage for VPC 卷。 要在密文中使用根密钥 CRN,必须先运行echo -n "<root_key_CRN>" | base64
将其转换为基数 64。 有关加密数据的更多信息,请参阅 为 Block Storage for VPC 设置加密。
-
创建 Kubernetes 私钥。
oc apply -f secret.yaml
-
执行创建定制存储类的步骤。 在自定义存储类 YAML 文件中,在
metadata.parameters
部分引用 Kubernetes secret,如下所示。 确保输入先前创建的 Kubernetes 私钥的名称以及在其中创建该私钥的名称空间。csi.storage.k8s.io/provisioner-secret-name: <secret_name> csi.storage.k8s.io/provisioner-secret-namespace: <secret_namespace>
-
以集群用户身份,执行向应用程序添加 Block Storage for VPC 中的步骤来通过定制存储类创建 PVC。
设置卷扩展
要供应支持扩展的卷,必须使用将 allowVolumeExpansion
设置为 true
的存储类。
只能扩展由应用程序 pod 安装的卷。
登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
-
如果您未使用 V
4.2
或更高版本的附加组件,请 更新集群中的 Block Storage for VPC 集群附加组件。 -
创建 PVC,该 PVC 使用支持卷扩展的存储类。
-
部署使用 PVC 的应用程序。 创建应用程序时,请记下指定的
mountPath
。 -
通过应用程序 pod 安装 PVC 后,可以通过编辑 PVC 中
spec.resources.requests.storage
字段的值来扩展卷。 要扩展卷,请编辑 PVC 并增大spec.resources.requests.storage
字段中的值。oc edit pvc <pvc-name>
示例
spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
-
保存并关闭 PVC。
-
可选: 验证卷是否已扩展。 获取 PVC 的详细信息,并记录 PV 名称。
oc get pvc <pvc-name>
-
描述 PV 并记下卷标识。
oc describe PV
-
获取 Block Storage for VPC 卷的详细信息并验证容量。
ibmcloud is vol <volume-ID>
在附加组件版本 4.2 之前手动扩展卷
完成以下步骤以手动展开在附加组件版本 4.2 之前创建的现有 Block Storage for VPC 卷。
只能扩展由应用程序 pod 安装的卷。
-
获取应用程序的详细信息,并记录 PVC 名称和
mountPath
。oc get pod <pod-name> -n <pod-namespace> -o yaml
-
获取 PVC 的详细信息,并记录 PV 名称。
oc get pvc
-
描述 PV 并获取
volumeId
。oc describe pv `pv-name` | grep volumeId
卷标识
r011-a1aaa1f1-3aaa-4a73-84aa-0aa32e11a1a1
的示例输出。volumeId=r011-a1aaa1f1-3aaa-4a73-84aa-0aa32e11a1a1
-
使用 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
。
-
登录应用程序 pod。
oc exec <pod-name> -it -- bash
-
运行以下命令使用主机二进制文件。
chroot /host
-
获取文件系统详细信息并记录要更新的
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
-
调整文件系统的大小。
sudo resize2fs <filesystem-path>
示例命令
sudo resize2fs /dev/vdg
-
验证文件系统是否已调整大小。
df -h
备份和复原数据
Block Storage for VPC 上的数据在您所在区域的冗余故障专区中受到保护。 要手动备份数据,请使用 Kubernetes oc cp
命令。
您可以使用 oc cp
命令将文件和目录复制到群集中的 pod 或特定容器,或从这些 pod 或容器中复制文件和目录
开始之前: 访问 Red Hat OpenShift 集群。
要备份或复原数据,请从以下选项中进行选择:
将数据从本地计算机复制到群集中的 pod。
oc cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath>
将数据从群集中的 pod 复制到本地计算机。
oc cp <namespace>/<pod>:<pod_filepath>/<filename> <local_filepath>/<filename>
将数据从本地计算机复制到在集群的 pod 中运行的特定容器。
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
。
有时,创建的卷的容量小于所请求的值。 请注意,计费适用于创建的卷,而不是请求的卷。