设置 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 插件仅可用于在经典基础架构上供应的标准 Red Hat OpenShift on IBM Cloud 集群。
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 ? 请在 查看存储配置 后返回此处。
-
将以下持久卷声明 (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
-
将配置应用于集群以创建 PVC。
oc apply -f pvc.yaml
-
等待 PVC 处于
Bound
状态。 您可以运行以下命令检查状态。oc get pvc
-
在 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
-
在集群中创建部署。
oc apply -f deployment.yaml
-
等待部署为
Ready
。 运行以下命令检查部署状态。oc get deployments
示例输出
NAME READY UP-TO-DATE AVAILABLE AGE my-deployment 1/1 1 1 3m19s
-
列出 pod 并验证
my-deployment
pod 是否正在运行。oc get pods
示例输出
NAME READY STATUS RESTARTS AGE my-deployment-ccdf87dfb-vzn95 1/1 Running 0 5m27s
-
获取 pod 日志以验证时间戳记是否已写入。
oc logs
示例输出
2022-01-21 14:18:59
您已成功创建使用 Block Storage for Classic的部署! 有关更多信息,请参阅以下链接。
决定块存储器配置
Red Hat OpenShift on IBM Cloud 为块存储器提供了预定义的存储类,可以使用这些类来供应具有特定配置的块存储器。
每个存储类指定供应的块存储器的类型,包括可用大小、IOPS、文件系统和保留策略。
确保仔细选择存储配置,以便有足够的容量来存储数据。 使用存储类配置特定类型的存储后,就无法更改存储设备的类型或保留策略。 但是,如果要提高存储容量和性能,那么可以更改大小和 IOPS。 要更改存储的类型和保留策略,必须创建一个新的存储实例,并将旧存储实例中的数据复制到新实例中。
-
列出 IBM Cloud® Kubernetes Service 中的可用存储类。
oc 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
-
查看存储类的配置。
oc describe storageclass STORAGECLASS
有关每个存储类的更多信息,请参阅存储类参考。 如果没有找到您想要的,可以考虑创建自己的定制存储类。 首先,请查看定制存储类样本。
-
选择要供应的块存储器的类型。
- 铜级、银级和金级存储类别: 这些存储类别提供耐力存储。 通过耐久性存储器,可以选择预定义 IOPS 层的存储器大小(以千兆字节为单位)。
- 自定义存储类: 该存储类提供性能存储。 通过性能存储器,可以控制存储器和 IOPS 的大小。
-
选择块存储器的大小和 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
-
-
选择在删除集群或持久卷声明 (PVC) 后是否要保留数据。
- 如果要保留数据,请选择
retain
存储类。 删除 PVC 时,仅会删除 PVC。 PV、IBM Cloud 基础架构帐户中的物理存储设备以及数据仍会存在。 要回收存储器并再次在集群中使用,必须除去 PV,并执行使用现有块存储器的步骤。 - 如果要在删除 PVC 时删除 PV、数据和物理块存储设备,请选择不带
retain
的存储类。
- 如果要保留数据,请选择
-
选择是要按小时还是按月计费。 缺省设置为按小时计费。
为 Block Storage for Classic 设置加密
您可以使用 IBM Key Protect为 Block Storage for Classic 设置加密。
以下示例说明如何为 Key Protect 和集群创建具有必需访问角色的服务标识。 此服务标识的凭证用于对 Block Storage for Classic 卷启用加密。
您可以通过创建使用个人 API 密钥的 Kubernetes 私钥来启用加密,只要您具有 Key Protect 实例的 读取者 服务访问角色以及集群的 查看者 平台访问角色和 写入者 服务访问角色。
登录您的帐户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
-
确保为您分配了 Key Protect 的“编辑者”平台访问角色和“写入者”服务访问角色,以便您可以创建自己的根密钥,用于加密 Block Storage for Classic 实例。 您可以在 IAM 控制台中查看 IAM 访问角色。 有关 IAM 角色的更多信息,请参阅 IAM 访问权。
-
如果您没有 Key Protect 实例,请 供应一个。
-
创建根密钥。 缺省情况下,会创建没有到期日期的根密钥。
-
创建 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
-
为您的服务 ID 创建一个 API 密钥。 将
<api-key-name>
替换为 API 密钥的名称,并将<service_ID_name>
替换为您创建的服务标识的名称。 请确保保存 API 密钥,因为以后无法检索该密钥。 在后续步骤中,此 API 密钥存储在集群中的 Kubernetes 私钥中。ibmcloud iam service-api-key-create <api_key_name> <service_ID_name>
-
检索帐户中启用 IAM 的服务的列表,并记下您创建的 Key Protect 实例的名称。
ibmcloud resource service-instances
-
读取Key Protect实例的 GUID。 该标识用于为您的服务标识创建 IAM 服务策略。
ibmcloud resource service-instance "<instance_name>" | grep GUID
-
创建 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>
-
创建另一个 IAM 服务访问策略,以授予您对集群的服务标识访问权。 以下命令向集群的服务标识授予 查看者 平台访问角色和 写程序 服务访问角色。 您可以通过运行
ibmcloud oc cluster get <cluster_name>
来检索集群标识。ibmcloud iam service-policy-create <service_ID_name> --roles Writer,Viewer --service-name containers-kubernetes --service-instance <cluster_ID>
-
如果已安装
ibmcloud-block-storage-plugin
Helm Chart,那么必须除去 Helm Chart 并安装新版本。
如果在不使用 Helm的情况下安装了该插件,那么必须在安装新版本之前手动除去块存储器插件部署和所有关联资源。
helm uninstall <name> <namespace>
- 安装
ibmcloud-block-storage-plugin
Helm Chart。
helm install <name> iks-charts/ibmcloud-block-storage-plugin
- 创建
ibm-block-secrets
名称空间。
oc create ns ibm-block-secrets
- 在块存储器插件的
ibm-block-secrets
名称空间中创建角色绑定。
oc 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
-
创建名为
secret.yaml
的 Kubernetes 私钥,其中包含用于在 Key Protect 服务实例中访问根密钥的凭证。 -
为秘密创建配置文件。
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,请完成以下步骤。
- 浏览至 IBM Cloud 控制台中的资源列表。
- 单击 服务,然后单击 Key Protect 实例。
- 在 操作菜单上找到根密钥,然后单击 查看 CRN。
- 单击“复制”按钮复制 CRN。
-
在集群中创建私钥。
oc apply -f secret.yaml
-
验证是否已创建私钥。
oc get secrets
-
在以下选项之间进行选择,以创建使用根密钥加密数据的 Block Storage for Classic 实例。
使用您自己的存储类对卷数据进行加密
您可以通过首先创建自己的存储类来部署使用加密卷的应用程序。
以下步骤说明如何创建可用来创建具有相同配置的多个加密块存储器实例的定制加密存储类。 如果要使用其中一个 IBM提供的存储类来创建加密 PVC,那么可以通过 在 PVC 中直接引用 Key Protect 凭证 来执行此操作。
-
创建您自己的存储类,以使用其中一个 IBM提供的存储类作为基础来供应加密块存储器实例。 您可以通过运行
oc 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
-
在集群中创建存储类。
oc apply -f storageclass.yaml
创建引用 Block Storage for Classic 私钥的 PVC
您可以通过创建用于指定保存 Key Protect 凭证的 Kubernetes 私钥的 PVC 来供应已加密的 Block Storage for Classic。
以下步骤显示了如何在 PVC 中引用 Key Protect 凭证以创建加密的 Block Storage for Classic 实例。 要在不指定每个 PVC 中的 Key Protect 凭证的情况下创建多个加密卷,可以 创建定制的加密存储类。
-
查看提供的 Block Storage for Classic 存储类,以确定哪个存储类最符合应用程序需求。 如果提供的存储类不满足应用程序需求,那么您可以创建自己的 定制存储类。
-
创建名为
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
-
在集群中创建 PVC。
oc apply -f pvc.yaml
-
检查 PVC 的状态。
oc get pvc
-
等待 PVC 绑定,然后 创建使用 PVC 的部署。
验证 Block Storage for Classic 卷的加密
您可以通过检查卷安装路径来验证卷的加密。
-
登录应用程序 pod。 将
<pod_name>
替换为安装加密 Block Storage for Classic 卷的 pod 的名称。oc exec <pod_name> -it bash
-
列出 pod 的文件系统。
df -h
-
查看已加密的 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。
开始之前:
要在有状态集内部署块存储器? 有关更多信息,请参阅在有状态集内使用块存储器。
要添加块存储器,请执行以下操作:
-
创建配置文件以定义持久卷声明 (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
,按小时计费,GB 大小为 "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。
-
-
创建 PVC。
oc apply -f block-storage.yaml
-
验证 PVC 是否已创建并与 PV 绑定。 此过程可能需要几分钟时间。
oc 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
-
要将 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.app
和labels.app
- 在规范选择器和模板元数据中,输入应用程序的标签。
image
- 要使用的容器映像的名称。 要列出 IBM Cloud Container Registry 帐户中的可用映像,请运行
ibmcloud cr image-list
。 name
- 要部署到集群的容器的名称。
mountPath
- 在“容器卷安装”部分中,输入在容器内安装卷的目录的绝对路径。 写入挂载路径的数据存储在物理块存储实例的根目录下。 如果要在不同应用程序之间共享音量,可以为每个应用程序指定 音量子路径。
name
- 在“容器卷安装”部分中,输入要安装到 pod 的卷的名称。
name
- 在“卷”部分中,输入要安装到 pod 的卷的名称。 通常情况下,该名称与 "
volumeMounts/name
相同。 claimName
- 在卷持久卷声明部分中,输入用于绑定要使用的 PV 的 PVC 的名称。
-
创建部署。
oc apply -f <local_yaml_path>
-
验证 PV 是否已成功安装。
oc describe deployment <deployment_name>
安装点位于 Volume Mounts 字段中,卷位于 Volumes 字段中。
Volume Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-tqp61 (ro) /volumemount from myvol (rw) ... Volumes: myvol: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: block-storage-pvc ReadOnly: false
在集群中使用现有块存储器
如果想要在群集中使用现有的物理存储设备,可以手动创建 PV 和 PVC 来静态配置存储。
在开始将现有存储器安装到应用程序之前,必须检索 PV 的所有必要信息。
检索现有块存储的信息
-
检索或生成 IBM Cloud 基础架构帐户的 API 密钥。
- 登录 IBM Cloud基础架构门户。
- 选择帐户,再选择用户,然后选择用户列表。
- 找到您的用户标识。
- 在 API 密钥列中,单击生成以生成 API 密钥,或者单击查看以查看现有 API 密钥。
-
检索您的IBM Cloud基础架构帐户的 API 用户名。
- 从用户列表菜单中,选择您的用户标识。
- 在 API 访问信息部分中,找到您的 API 用户名。
-
登录到 IBM Cloud Infrastructure CLI 插件。
ibmcloud sl init
-
选择使用IBM Cloud基础架构帐户的用户名和 API 密钥进行身份验证。
-
输入您在前面步骤中获取的用户名和 API 密钥。
-
列出可用的块存储设备。
ibmcloud sl block volume-list
示例输出
id username datacenter storage_type capacity_gb bytes_used lunId 11111111 IBM01AAA1111111-1 wdc07 endurance_block_storage 45 - 2
-
检索卷详细信息。 将
<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
-
记下要安装到集群的卷的
ID
,Capacity
,LUN Id
,Datacenter
和Target IP
。 **注:**要将现有存储器安装到集群,必须在存储器所在的专区中有工作程序节点。 要验证工作节点的区域,请运行 "ibmcloud oc worker ls --cluster <cluster_name_or_ID>
。
创建持久卷 (PV) 和匹配的持久卷要求 (PVC)
-
可选项:如果有使用 "
retain
存储类别配置的存储,则在移除 PVC 时,PV 和物理存储设备不会被移除。 要在集群中复用存储器,必须首先除去 PV。 列出现有 PV 并查找属于持久存储器的 PV。 该 PV 处于released
状态。oc get pv
-
除去该 PV。
oc delete pv <pv_name>
-
确认 PV 已移除。
oc get pv
-
为 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/openshift?topic=openshift-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
- 给光伏起个名字。 例如,
block-storage-pv
。 请注意,您还必须在spec.FlexVolume.options
中输入此值作为volumeName
。 labels
- 输入先前检索到的区域和专区。 必须在持久性存储器所在的区域和专区中至少有一个工作程序节点,才能在集群中安装该存储器。 要检索卷详细信息,请运行
ibmcloud sl block volume-list
以获取卷标识,然后运行ibmcloud sl block volume-detail <volume_ID>
以获取卷的详细信息。 region
- 输入块存储所在的区域。 请注意,集群和块存储器必须位于同一区域中。 要查找群集位置,请运行 "
ibmcloud oc cluster ls
。 有关可用区域和区域的更多信息,请参阅 区域和区域。 例如,us-east
。 zone
- 输入存储卷所在的区域。 要检索卷详细信息,请运行
ibmcloud sl block volume-list
以获取卷标识,然后运行ibmcloud sl block volume-detail <volume_ID>
以获取卷的详细信息。 请注意,要将块存储器连接到集群,您必须在要连接的卷所在的专区中具有可用的工作程序节点。 要查找工作程序节点的专区,请运行ibmcloud oc 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
- 输入为现有块存储器配置的文件系统类型。 选择“
ext4
或”xfs
。 如果不指定该选项,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
。
-
在集群中创建 PV。
oc apply -f pv.yaml
-
验证 PV 是否已创建。
oc get pv
-
创建另一个配置文件以创建 PVC。 为了使 PVC 与先前创建的 PV 相匹配,必须为
storage
和accessMode
选择相同的值。storage-class
字段必须为空字符串。 如果其中任何字段与 PV 不匹配,则会自动创建一个新的 PV。kind: PersistentVolumeClaim apiVersion: v1 metadata: name: block-storage-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: "20Gi" storageClassName: ""
-
创建 PVC。
oc apply -f static-pvc.yaml
-
验证 PVC 是否已创建并与先前创建的 PV 绑定。 此过程可能需要几分钟时间。
oc describe pvc static-pvc
示例输出
Name: static-pvc Namespace: default StorageClass: Status: Bound
-
可选 将以下示例 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
- 在群集中创建 pod。
oc create -f pod.yaml
- 在 pod 处于
Running
状态后,获取日志。
oc logs
示例输出
2022-01-21 16:11:00
您已成功创建 PV,并将其绑定到 PVC。 然后,您已部署并应用了使用块存储器的应用程序。 群集用户现在可以 将 PVC 挂载 到他们的部署,并开始读取和写入持久卷。
在有状态集内使用块存储器
如果您有一个有状态的应用程序(如数据库),那么可以创建有状态集,以使用块存储器来存储应用程序的数据。 或者,可以使用 IBM Cloud 数据库即服务,并将数据存储在云中。
- 在有状态数据集中添加块存储时需要注意什么?
- 要将存储器添加到有状态集,请在有状态集 YAML 的
volumeClaimTemplates
部分中指定存储器配置。volumeClaimTemplates
是 PVC 的基础,可以包含要供应的块存储器的存储类和大小或 IOPS。 但是,如果要在volumeClaimTemplates
中包含标签,那么 Kubernetes 在创建 PVC 时,不会包含这些标签。 您必须改为将标签直接添加到有状态集。
不能同时部署两个有状态程序集。 如果在一个有状态集完全部署之前尝试创建另一个有状态集,那么前一个有状态集的部署可能会导致意外的结果。
- 如何在特定区域创建有状态数据集?
- 在多专区集群中,可以在有状态集 YAML 的
spec.selector.matchLabels
和spec.template.metadata.labels
部分中,指定要在其中创建有状态集的专区和区域。 或者,可以将这些标签添加到定制存储类,并在有状态集的volumeClaimTemplates
部分中使用此存储类。 - 能否将 PV 与有状态 pod 的绑定延迟到 pod 准备就绪时?
- 可以,您可以为包含
volumeBindingMode: WaitForFirstConsumer
字段的 PVC 创建自己的存储类。 - 在有状态数据集中添加块存储时有哪些选项?
- 如果要在创建有状态集时自动创建 PVC,请使用动态供应。 您还可以选择对有状态集预先供应 PVC 或使用现有 PVC。
创建有状态集时使用动态供应来创建 PVC
如果要在创建有状态集时自动创建 PVC,请使用此选项。
开始之前: 访问 Red Hat OpenShift 集群。
完成以下步骤以验证集群中的所有现有有状态集是否已完全部署。 如果有状态数据集仍在部署中,则无法开始创建有状态数据集。 您必须等待集群中的所有有状态集完全部署,以避免发生意外结果。
-
列出集群中现有的有状态集。
oc get statefulset --all-namespaces
示例输出
NAME DESIRED CURRENT AGE mystatefulset 3 3 6s
-
查看每个有状态集的 Pods Status,以确保有状态集部署完成。
oc 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: oc.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 的数目时,说明有状态集已完全部署。 如果有状态集尚未完全部署,请等待部署完成,然后再继续。
-
为有状态集和用于公开有状态集的服务创建配置文件。 以下示例显示了如何将 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
,Kubernetes调度器无法调度工人节点上的 pod,如果该工人节点与带有”app: nginx
标签的 pod 位于同一区域的话。 对于每个有状态集 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 管理策略。
- OrderedReady:使用该选项时,有状态集合副本会一个接一个地部署。 例如,如果指定了 3 个副本,那么 Kubernetes 会为第一个副本创建 PVC,然后等待 PVC 绑定后,部署该有状态集副本,接着将 PVC 安装到该副本。 此部署完成后,将部署第二个副本。 有关该选项的更多信息,请参阅 "
OrderedReady
舱位管理 - 并行:使用此选项,所有有状态数据集副本的部署都会同时启动。 如果应用程序支持对副本进行并行部署,请使用此选项以节省 PVC 和有状态集副本的部署时间。
- OrderedReady:使用该选项时,有状态集合副本会一个接一个地部署。 例如,如果指定了 3 个副本,那么 Kubernetes 会为第一个副本创建 PVC,然后等待 PVC 绑定后,部署该有状态集副本,接着将 PVC 安装到该副本。 此部署完成后,将部署第二个副本。 有关该选项的更多信息,请参阅 "
matchLabels
- 在“规格选择器”部分,输入要包含在有状态集和 PVC 中的所有标签。 Kubernetes 无法识别在有状态集的 "
volumeClaimTemplates
中包含的标签。 您可能想要包含的样本标签包括:- 区域和区:如果希望在一个特定区域创建所有有状态数据集副本和 PVC,请同时添加这两个标签。 您还可以在使用的存储类中指定专区和区域。 如果未指定区域和地区,但拥有多区域群集,则会在轮循基础上选择调配存储的区域,以在所有区域间均衡卷请求。
billingType
:输入您希望用于 PVC 的计费类型。 选择“hourly
或”monthly
。 如果不指定此标签,所有 PVC 都将以小时计费类型创建。
labels
- 在规范模板元数据部分中,输入添加到
spec.selector.matchLabels
部分的相同标签。 affinity
- 在规范模板规范部分,指定反亲缘规则,以确保有状态集 pod 分布在不同的工作节点和区域。 此示例显示了反亲缘关系规则,其中有状态集 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
- 在“规范卷声明模板规范”部分中,输入要使用的存储类。 要列出现有存储类,请运行 "
oc get sc | grep block
。 如果未指定存储类别,PVC 将使用群集中设置的默认存储类别创建。 确保默认存储类使用 "ibm.io/ibmc-block
供应器,以便有状态集使用块存储供应。
-
创建有状态集。
oc apply -f statefulset.yaml
-
等待有状态集进行部署。
oc describe statefulset <statefulset_name>
要查看 PVC 的当前状态,请运行
oc get pvc
。 PVC 名称的格式为 "<volume_name>-<statefulset_name>-<replica_number>
。
通过使用现有 PVC 与有状态设置进行静态配置
您可以在创建有状态集之前预先供应 PVC,也可以将现有 PVC 用于有状态集。
如果是在创建有状态集时动态供应 PVC,那么 PVC 的名称将根据在有状态集 YAML 文件中使用的值来指定。 为了使有状态集使用现有 PVC,PVC 的名称必须与使用动态供应时自动创建的名称相匹配。
开始之前: 访问 Red Hat OpenShift 集群。
-
如果要在创建有状态集之前为该有状态集预供应 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-0
、nginxvol-nginx_statefulset-1
和nginxvol-nginx_statefulset-2
。想要为现有存储设备创建 PVC 和 PV? 请使用静态供应来创建 PVC 和 PV。
-
执行动态供应:创建有状态集时创建 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 位于不同的区域,请不要在有状态设置中包含区域或区域标签。
-
通过列出集群中的 pod,验证是否在有状态集副本 pod 中使用了 PVC。 识别属于有状态集的 pod。
oc get pods
-
验证现有 PVC 是否已安装到有状态集副本。 请在 CLI 输出的
ClaimName
部分中查看Volumes
。oc 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 中,请运行 "oc patch pv <pv_name>
并手动更新 PV 的 "标签和注释"部分中的大小和 IOPS。
-
列出集群中的 PVC,并记下 VOLUME 列中关联 PV 的名称。
oc get pvc
示例输出
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myvol Bound pvc-01ac123a-123b-12c3-abcd-0a1234cb12d3 20Gi RWO ibmc-block-bronze 147d
-
如果要更改块存储器的 IOPS 和大小,请先在 PV 的
metadata.labels.IOPS
部分中编辑 IOPS。 您可以增加或减少 IOPS 值。 确保输入您拥有的存储类型支持的 IOPS。 例如,如果具有 4 IOPS 的耐久性块存储器,那么可以将 IOPS 更改为 2 或 10。 有关更多支持的 IOPS 值,请参阅决定块存储器配置。oc edit pv <pv_name>
要通过 CLI 更改 IOPS,还必须更改块存储器的大小。 如果要仅更改 IOPS,而不更改大小,那么必须通过控制台请求 IOPS 更改。
-
编辑 PVC 并在 PVC 的
spec.resources.requests.storage
部分中添加新大小。 可以更改为更大的大小,但不能超过存储类设置的最大容量。 不能缩小现有存储空间。 要查看存储类的可用大小,请参阅决定块存储器配置。oc edit pvc <pvc_name>
-
验证是否请求了卷扩展。 在 CLI 输出的
FileSystemResizePending
Conditions** 部分中看到 ** 消息时,说明成功请求了卷扩展。oc 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.
-
列出安装了 PVC 的所有 pod。 如果 pod 安装了 PVC,那么会自动处理卷扩展。 如果 pod 未安装 PVC,那么必须将 PVC 安装到 pod,以便可以处理卷扩展。
oc get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.persistentVolumeClaim.claimName}{" "}{end}{end}' | grep "<pvc_name>"
已安装的 pod 将以以下格式返回:
<pod_name>: <pvc_name>
. -
如果 pod 未安装 PVC,请创建 pod 或部署并安装 PVC。 如果 pod 安装了 PVC,请继续执行下一步。
-
验证 CLI 输出的 Labels 部分中的大小和 IOPS 是否已更改。 此过程可能需要几分钟才能完成。
oc describe pv <pv_name>
示例输出
... Labels: CapacityGb=50 Datacenter=dal10 IOPS=500
-
登录安装 PVC 的 pod。
oc exec <pod-name> -it -- bash
-
运行以下命令使用主机二进制文件。
chroot /host
-
调整文件系统的大小。
sudo resize2fs <filesystem-path>
示例命令
sudo resize2fs /dev/vdg
-
验证文件系统是否已调整大小。
df -h
备份和复原数据
块存储器已供应到集群中的工作程序节点所在的位置。 存储器由 IBM 在集群服务器上托管,以在其中某个服务器停止运行时提供可用性。 但是,块存储器不会自动进行备份,因此在整个位置发生故障时可能无法进行访问。 为了防止数据丢失或损坏,可以设置定期备份,以便在需要时可用于复原数据。
查看块存储器的以下备份和复原选项:
设置定期快照
可以为块存储器设置定期快照,这是捕获某个时间点的实例状态的只读映像。
要存储快照,必须在块存储器上请求快照空间。 快照会存储在同一专区的现有存储器实例上。 如果用户意外从卷中除去重要数据,那么可以从快照复原数据。 \n \n ** 要为卷创建快照,请完成以下步骤。
-
登录到
ibmcloud sl
CLI。ibmcloud sl init
-
列出集群中的现有 PV。
oc get pv
-
获取要为其创建快照空间的 PV 的详细信息,并记下卷标识、大小和 IOPS。 大小和 IOPS 显示在 CLI 输出的“标签”部分。
oc describe pv <pv_name>
-
要查找卷 ID,请查看 CLI 输出中的 "
ibm.io/network-storage-id
注释。 -
使用您在先前步骤中检索到的参数为现有卷创建快照大小。
ibmcloud sl block snapshot-order <volume_ID> --size <size> --tier <iops>
-
等待快照大小创建。 当 CLI 输出中的快照大小 (GB) 从 0 变为您订购的大小时,快照大小就已成功配置。
ibmcloud sl block volume-detail <volume_ID>
-
为卷创建快照,并记下创建的快照的标识。
ibmcloud sl block snapshot-create <volume_ID>
-
验证快照是否已成功创建。
ibmcloud sl block snapshot-list <volume_ID>
-
设置快照调度。 有关可用于快照调度的选项的更多信息,请参阅 CLI 文档。
ibmcloud sl block snapshot-enable VOLUME_ID <OPTIONS>
-
要将数据从快照复原到现有卷,请运行以下命令。
ibmcloud sl block snapshot-restore <volume_ID> <snapshot_ID>
将快照复制到另一区域
为了保护数据不受专区故障的影响,可以复制快照到其他专区中设置的块存储器实例。
数据只能从主存储器复制到备份存储器。 无法将复制的块存储实例挂载到群集。 主存储器发生故障时,可以手动将复制的备份存储器设置为主存储器。 然后,可以将其安装到集群。 复原主存储器后,可以从备份存储器复原数据。
正在复制存储器
可以在原始存储器实例所在的专区中复制块存储器实例。
复制项所含的数据是其创建的那个时间点上原始存储器实例的数据。 与副本不同,复制项用作独立于原始项的存储器实例。 要进行复制,请首先为卷设置快照。
将数据备份到 IBM Cloud® Object Storage
您可以使用 ibm-backup-restore Helm图表在集群中启动备份和还原 pod。
此 pod 包含一个脚本,用于对集群中的任何持久卷声明 (PVC) 运行一次性或定期备份。 数据存储在您在某个专区设置的 IBM Cloud® Object Storage 实例中。
块存储器使用 RWO 访问方式进行安装。 此访问权仅允许一次将一个 pod 安装到块存储器。 要备份数据,必须从存储器中卸载应用程序 pod,将其安装到备份 pod,备份数据,然后将存储器重新安装到应用程序 pod。
要使数据具有更高可用性,并保护应用程序不受专区故障的影响,请设置第二个 Object Storage 实例,并在各个专区之间复制数据。 如果需要还原Object Storage实例中的数据,请使用Helm图表提供的还原 pod。
在 pod 和容器之间复制数据
您可以使用 "oc cp
命令将文件和目录复制到集群中的 pod 或特定容器,也可以从 pod 或特定容器复制文件和目录。
运行 oc cp
命令时,如果未使用 -c
指定容器,那么该命令将使用 pod 中的第一个可用容器。
将数据从本地计算机复制到群集中的 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
存储类参考
铜级
- 名称
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 和大小
- 以千兆字节为单位的大小范围/以 100 的倍数为单位的 IOPS 范围
- 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 除以存储器的大小。
- 举例说明:您选择了 IOPS 为 100 的500Gi存储设备。 因此,比率为 0.2 (100 IOPS/500 Gi)。
- 按比率划分的硬盘类型概览
- 小于或等于 0.3:SATA
- 大于 0.3:SSD
- 回收策略
ibmc-block-custom
: 删除ibmc-block-retain-custom
: 保留
样本定制存储类
您可以创建定制存储类并在 PVC 中使用该存储类。
Red Hat OpenShift on IBM Cloud 提供了预定义的存储类,用于供应具有特定层和配置的块存储器。 有时,您可能需要使用不同的配置来配置存储,而这些配置并不包括在预定义的存储类别中。 您可以使用本主题中的示例来找到样本定制存储类。
要创建定制存储类,请参阅定制存储类。 然后查看在 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"
,iopsPerGB
为 4
,sizeRange
为 "[20-12000]Gi"
,reclaimPolicy
设置为 "Delete"
。 专区指定为 dal12
。 要将其他存储类用作您的基础,请参阅存储类参考。
在集群和工作程序节点所在的区域和专区中创建存储类。 To get the region of your cluster, run ibmcloud oc cluster get --cluster <cluster_name_or_ID>
and look for the region prefix in the 主 URL, such as eu-de
in https://c2.eu-de.containers.cloud.ibm.com:11111
.
要获取工作节点的区域,请运行 "ibmcloud oc 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 和存储器实例,可避免对持久性存储器进一步收费。
开始之前:
- 确保备份了要保留的所有数据。
- 访问 Red Hat OpenShift 集群。
要清除持久数据,请执行以下操作:
-
列出集群中的 PVC,并记下 PVC 的
NAME
、STORAGECLASS
以及绑定到该 PVC 并显示为VOLUME
的 PV 的名称。oc 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
-
查看存储类的
ReclaimPolicy
和billingType
。oc describe storageclass <storageclass_name>
如果回收策略显示
Delete
,那么在除去 PVC 时会除去 PV 和物理存储器。 如果回收策略显示Retain
,或者所供应的存储器不具有存储类,那么在除去 PVC 时不会除去 PV 和物理存储器。 PVC、PV 和物理存储器必须分别进行除去。如果存储器按月收费,那么即使在计费周期结束之前除去了存储器,也仍需要按整月付费。
-
除去安装了 PVC 的所有 pod。 列出安装了 PVC 的所有 pod。 如果 CLI 输出中没有返回 pod,则说明没有 pod 使用 PVC。
oc 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
-
除去使用 PVC 的 pod。 如果 pod 是部署的一部分,请除去该部署。
oc delete pod <pod_name>
-
验证 pod 是否已除去。
oc get pods
-
除去 PVC。
oc delete pvc <pvc_name>
-
查看 PV 的阶段状态。 使用先前检索到的显示为
VOLUME
的 PV 的名称。 除去 PVC 时,会释放绑定到该 PVC 的 PV。 如果 PV 是自动删除的,那么该 PV 会进入Deleting
状态;如果必须手动删除 PV,那么该 PV 会进入Released
状态,具体取决于存储器的供应方式。 注:对于自动删除的 PV,在删除之前,阶段状态可能会短暂地显示为Released
。 请在几分钟后重新运行该命令以查看该 PV 是否已除去。oc get pv <pv_name>
-
如果 PV 未删除,请手动除去该 PV。
oc delete pv <pv_name>
-
验证 PV 是否已除去。
oc get pv
-
列出 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"
- 文件或块存储的类型,可以是“
Endurance
或”Performance
。 "ns":"default"
- 存储实例部署到的命名空间。
"pvc":"block-storage-pvc"
- 与存储实例相关联的 PVC 的名称。
"pv":"pvc-d979977d-d79d-77d9-9d7d-d7d97ddd99d7"
- 与存储实例相关联的 PV。
"storageclass":"ibmc-file-gold"
- 存储类别:铜、银、金或定制。
-
除去物理存储器实例。
ibmcloud sl block volume-cancel <classic_block_id>
-
验证物理存储器实例是否已除去。
删除过程最长可能需要 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
。
-
从 IBM Cloud Monitoring 仪表板中,选择 新建警报 > 度量。
-
选择 Prom 查询,然后输入
kube_persistentvolume_labels{label_ibm_io_pv_connectivity_status='limited'}
。 -
将阈值设置为
>0
,并设置要用于此警报的严重性。 -
选择通知通道并保存警报。