设置 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 插件 后,请返回此处。
-
将以下持久卷声明 (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。
kubectl apply -f pvc.yaml
-
等待 PVC 处于
Bound
状态。 您可以通过运行以下命令来检查状态。kubectl 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
-
在集群中创建部署。
kubectl apply -f deployment.yaml
-
等待部署为
Ready
。 运行以下命令检查部署状态。kubectl get deployments
示例输出
NAME READY UP-TO-DATE AVAILABLE AGE my-deployment 1/1 1 1 3m19s
-
列出 pod 并验证
my-deployment
pod 是否正在运行。kubectl get pods
示例输出
NAME READY STATUS RESTARTS AGE my-deployment-ccdf87dfb-vzn95 1/1 Running 0 5m27s
-
获取 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 插件。 缺省情况下,驱动程序和插件安装在这些集群上。
开始之前:登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
-
确保工作程序节点应用次要版本的最新补丁,以使用最新的安全设置运行工作程序节点。 补丁版本还可确保更新工作程序节点上的 root 用户密码。
如果在过去 90 天内未应用更新或重新装入工作程序节点,那么工作程序节点上的 root 用户密码将到期,并且存储插件安装可能失败。
-
列出工作程序节点的当前补丁版本。
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** 列中会显示一个星号 (**)。 -
查看 Kubernetes 版本信息 以查找最新更改。
-
通过重新装入工作程序节点来应用最新的补丁版本。 在重新加载工作节点之前,请按照 ibmcloud ks worker reload命令中的 说明,安全地重新安排工作节点上正在运行的任何容器。 请注意,在重新装入期间,工作程序节点机器将使用最新映像进行更新,并且如果数据未存储在工作程序节点外部,那么将删除数据。
-
-
遵循指示信息 在本地机器上安装 Helm V 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
-
更新 Helm 存储库以在此存储库中检索所有最新版本的 Helm chart。
helm repo update
-
安装 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>
-
验证安装。
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 状态。 -
请确认集群中已添加 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
-
对要供应块存储器的每个集群,重复这些步骤。
现在可以继续创建 PVC,以用于为应用程序供应块存储器。
更新 IBM Cloud Block Storage 插件
现在,可以将现有 IBM Cloud Block Storage 插件升级到最新版本。
开始之前:登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
-
更新 Helm 存储库以在此存储库中检索所有最新版本的 Helm chart。
helm repo update
-
可选:将最新 Helm chart 下载到本地计算机。 然后,解压缩包并查看
release.md
文件,以了解最新的发行版信息。helm pull iks-charts/ibmcloud-block-storage-plugin --untar
-
找到您在集群中安装的块存储 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
-
将 IBM Cloud Block Storage 插件升级到最新版本。 包含先前检索的发行版名称和名称空间。
helm upgrade RELEASE-NAME iks-charts/ibmcloud-block-storage-plugin -n NAMESPACE
-
可选:更新插件时,会取消设置
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。
开始之前:
- 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
- 请确保您的集群中没有使用块存储的PVC或PV。
要除去该插件,请执行以下操作:
-
找到您安装在集群中的块存储 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
-
删除 IBM Cloud Block Storage 插件。
helm uninstall NAME -n kube-system
-
验证块存储器 pod 是否已除去。
kubectl get pods -n kube-system | grep block
如果 CLI 输出中未显示任何 pod,那么表明已成功除去 pod。
-
验证块存储器的存储类是否已除去。 如果 CLI 输出中未显示任何存储类,说明存储类除去操作成功。
kubectl get sc | grep block
决定块存储器配置
IBM Cloud Kubernetes Service 为块存储器提供了预定义的存储类,可以使用这些类来供应具有特定配置的块存储器。
每个存储类指定供应的块存储器的类型,包括可用大小、IOPS、文件系统和保留策略。
确保仔细选择存储配置,以便有足够的容量来存储数据。 在使用存储类别配置特定类型的存储后,您将无法更改存储设备的类型或保留策略。 但是,如果要提高存储容量和性能,那么可以更改大小和 IOPS。 要更改存储的类型和保留策略,您必须创建一个新的存储实例,并将数据从旧的存储实例复制到新的存储实例。
-
列出 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
-
查看存储类的配置。
kubectl 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 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>
-
如果已安装
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
名称空间。
kubectl create ns ibm-block-secrets
- 在块存储器插件的
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
-
创建名为
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。
-
在集群中创建私钥。
kubectl apply -f secret.yaml
-
验证是否已创建私钥。
kubectl get secrets
-
在以下选项之间进行选择,以创建使用根密钥加密数据的 Block Storage for Classic 实例。
使用您自己的存储类对卷数据进行加密
您可以通过首先创建自己的存储类来部署使用加密卷的应用程序。
以下步骤说明如何创建可用来创建具有相同配置的多个加密块存储器实例的定制加密存储类。 如果要使用其中一个 IBM提供的存储类来创建加密 PVC,那么可以通过 在 PVC 中直接引用 Key Protect 凭证 来执行此操作。
-
创建您自己的存储类,以使用其中一个 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
-
在集群中创建存储类。
kubectl 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。
kubectl apply -f pvc.yaml
-
检查您的PVC状态。
kubectl get pvc
-
等待 PVC 绑定,然后 创建使用 PVC 的部署。
验证 Block Storage for Classic 卷的加密
您可以通过检查卷安装路径来验证卷的加密。
-
登录您的应用程序。 将
<pod_name>
替换为安装加密 Block Storage for Classic 卷的 pod 的名称。kubectl 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。
开始之前:
- 如果您有防火墙,请针对集群所在专区的 IBM Cloud 基础架构 IP 范围允许流出访问,以便您可以创建 PVC。
- 安装 IBM Cloud Block Storage 插件。
- 决定预定义的存储类或创建定制存储类。
要在有状态集内部署块存储器? 有关更多信息,请参阅在有状态集内使用块存储器。
要添加块存储器,请执行以下操作:
-
创建配置文件以定义持久卷声明 (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。
-
-
创建 PVC。
kubectl apply -f block-storage.yaml
-
验证 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
-
要将 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 的名称。
-
创建部署。
kubectl apply -f <local_yaml_path>
-
验证 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 的所有必要信息。
检索现有块存储的信息
-
检索或生成 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 ks worker ls --cluster <cluster_name_or_ID>
。
创建一个持久卷(PV)和一个匹配的持久卷声明(PVC)
-
可选:如果您使用
retain
存储类配置了存储,当您删除PVC时,PV和物理存储设备不会被删除。 要在集群中复用存储器,必须首先除去 PV。 列出现有 PV 并查找属于持久存储器的 PV。 该 PV 处于released
状态。kubectl get pv
-
除去该 PV。
kubectl delete pv <pv_name>
-
确认PV已移除。
kubectl 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/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
- 输入为现有块存储器配置的文件系统类型。 请选择
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。
kubectl apply -f pv.yaml
-
验证 PV 是否已创建。
kubectl 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。
kubectl apply -f static-pvc.yaml
-
验证 PVC 是否已创建并与先前创建的 PV 绑定。 此过程可能需要几分钟时间。
kubectl 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。
kubectl create -f pod.yaml
- 在 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.matchLabels
和spec.template.metadata.labels
部分中,指定要在其中创建有状态集的专区和区域。 或者,可以将这些标签添加到定制存储类,并在有状态集的volumeClaimTemplates
部分中使用此存储类。 - 我可以等到容器准备就绪后再绑定PV吗?
- 可以,您可以为包含
volumeBindingMode: WaitForFirstConsumer
字段的 PVC 创建自己的存储类。 - 我有哪些选项可以为有状态集添加块存储?
- 如果要在创建有状态集时自动创建 PVC,请使用动态供应。 您还可以选择对有状态集预先供应 PVC 或使用现有 PVC。
创建有状态集时使用动态供应来创建 PVC
如果要在创建有状态集时自动创建 PVC,请使用此选项。
开始之前:登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
完成以下步骤以验证集群中的所有现有有状态集是否已完全部署。 如果状态集仍在部署中,则无法开始创建状态集。 您必须等待集群中的所有有状态集完全部署,以避免发生意外结果。
-
列出集群中现有的有状态集。
kubectl get statefulset --all-namespaces
示例输出
NAME DESIRED CURRENT AGE mystatefulset 3 3 6s
-
查看每个有状态集的 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 的数目时,说明有状态集已完全部署。 如果有状态集尚未完全部署,请等待部署完成,然后再继续。
-
为有状态集和用于公开有状态集的服务创建配置文件。 以下示例显示了如何将 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 和有状态集副本的部署时间。
- 有序就绪:使用此选项,状态集副本将依次部署。 例如,如果指定了 3 个副本,那么 Kubernetes 会为第一个副本创建 PVC,然后等待 PVC 绑定后,部署该有状态集副本,接着将 PVC 安装到该副本。 此部署完成后,将部署第二个副本。 如需了解此选项的更多信息,请发送电子邮件 至
matchLabels
- 在规格选择器部分,输入您想要包含在状态集和PVC中的所有标签。 Kubernetes 无法识别您状态信息中
volumeClaimTemplates
中包含的标签。 您可能想要包含的样本标签包括:- 区域和分区:如果您希望所有状态设置副本和 PVC 都创建在特定分区中,请添加这两个标签。 您还可以在使用的存储类中指定专区和区域。 如果您没有指定区域和地区,并且您拥有多区域集群,则会在所有区域之间轮流选择您的存储区域,以均衡所有区域之间的容量请求。
billingType
:输入您希望用于PVC的账单类型。 请选择hourly
或monthly
。 如果您不指定此标签,则所有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
配置程序,以便为您的有状态集配置块存储。
-
创建有状态集。
kubectl apply -f statefulset.yaml
-
等待有状态集进行部署。
kubectl describe statefulset <statefulset_name>
要查看 PVC 的当前状态,请运行
kubectl get pvc
。 您的PVC名称格式为<volume_name>-<statefulset_name>-<replica_number>
。
使用现有PVC和状态集进行静态配置
您可以在创建有状态集之前预先供应 PVC,也可以将现有 PVC 用于有状态集。
如果是在创建有状态集时动态供应 PVC,那么 PVC 的名称将根据在有状态集 YAML 文件中使用的值来指定。 为了使有状态集使用现有 PVC,PVC 的名称必须与使用动态供应时自动创建的名称相匹配。
开始之前:登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
-
如果要在创建有状态集之前为该有状态集预供应 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。
kubectl get pods
-
验证现有 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。
-
列出集群中的 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
-
如果要更改块存储器的 IOPS 和大小,请先在 PV 的
metadata.labels.IOPS
部分中编辑 IOPS。 您可以增加或减少 IOPS 值。 确保输入您拥有的存储类型支持的 IOPS。 例如,如果具有 4 IOPS 的耐久性块存储器,那么可以将 IOPS 更改为 2 或 10。 有关更多支持的 IOPS 值,请参阅决定块存储器配置。kubectl edit pv <pv_name>
要通过 CLI 更改 IOPS,还必须更改块存储器的大小。 如果要仅更改 IOPS,而不更改大小,那么必须通过控制台请求 IOPS 更改。
-
编辑 PVC 并在 PVC 的
spec.resources.requests.storage
部分中添加新大小。 可以更改为更大的大小,但不能超过存储类设置的最大容量。 您无法缩减现有存储空间。 要查看存储类的可用大小,请参阅决定块存储器配置。kubectl edit pvc <pvc_name>
-
验证是否请求了卷扩展。 在 CLI 输出的
FileSystemResizePending
Conditions** 部分中看到 ** 消息时,说明成功请求了卷扩展。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.
-
列出安装了 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>
格式返回。 -
如果 pod 未安装 PVC,请创建 pod 或部署并安装 PVC。 如果 pod 安装了 PVC,请继续执行下一步。
-
验证 CLI 输出的 Labels 部分中的大小和 IOPS 是否已更改。 此过程可能需要几分钟才能完成。
kubectl describe pv <pv_name>
示例输出
... Labels: CapacityGb=50 Datacenter=dal10 IOPS=500
-
登录到安装PVC的吊舱。
kubectl 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。
kubectl get pv
-
获取要为其创建快照空间的 PV 的详细信息,并记下卷标识、大小和 IOPS。 大小和IOPS显示在CLI输出的标签部分。
kubectl describe pv <pv_name>
-
要找到卷标号,请查看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 包含一个脚本,用于对集群中的任何持久卷声明 (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"
,iopsPerGB
为 4
,sizeRange
为 "[20-12000]Gi"
,reclaimPolicy
设置为 "Delete"
。 专区指定为 dal12
。 要将其他存储类用作您的基础,请参阅存储类参考。
在集群和工作程序节点所在的区域和专区中创建存储类。 要获取您所在集群的区域,请运行 ibmcloud ks cluster get --cluster <cluster_name_or_ID>
并在主 URL 中查找区域前缀,例如 eu-de
在 https://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 和存储器实例,可避免对持久性存储器进一步收费。
开始之前:
- 确保备份了要保留的所有数据。
- 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
要清除持久数据,请执行以下操作:
-
列出集群中的 PVC,并记下 PVC 的
NAME
、STORAGECLASS
以及绑定到该 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
-
查看存储类的
ReclaimPolicy
和billingType
。kubectl describe storageclass <storageclass_name>
如果回收策略显示
Delete
,那么在除去 PVC 时会除去 PV 和物理存储器。 如果回收策略显示Retain
,或者所供应的存储器不具有存储类,那么在除去 PVC 时不会除去 PV 和物理存储器。 PVC、PV 和物理存储器必须分别进行除去。如果存储器按月收费,那么即使在计费周期结束之前除去了存储器,也仍需要按整月付费。
-
除去安装了 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
-
除去使用 PVC 的 pod。 如果 pod 是部署的一部分,请除去该部署。
kubectl delete pod <pod_name>
-
验证 pod 是否已除去。
kubectl get pods
-
除去 PVC。
kubectl delete pvc <pvc_name>
-
查看 PV 的阶段状态。 使用先前检索到的显示为
VOLUME
的 PV 的名称。 除去 PVC 时,会释放绑定到该 PVC 的 PV。 如果 PV 是自动删除的,那么该 PV 会进入Deleting
状态;如果必须手动删除 PV,那么该 PV 会进入Released
状态,具体取决于存储器的供应方式。 注:对于自动删除的 PV,在删除之前,阶段状态可能会短暂地显示为Released
。 请在几分钟后重新运行该命令以查看该 PV 是否已除去。kubectl get pv <pv_name>
-
如果 PV 未删除,请手动除去该 PV。
kubectl delete pv <pv_name>
-
验证 PV 是否已除去。
kubectl 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
,并设置要用于此警报的严重性。 -
选择通知通道并保存警报。