安装IBM Cloud Object Storage集群附加组件
您可以通过 IBM Cloud 控制台或命令行界面(CLI)启用 IBM Cloud Object Storage 插件。
前置条件:
- IBM Cloud Object Storage 附加组件至少需要 0.3 vCPU 和 360 MB 内存。
- 该插件适用于 Red Hat CoreOS (RHCOS) 和 Ubuntu 工作节点。 如果集群中既有 RHEL 节点又有 RHCOS 节点,则只在 RHCOS 节点上部署附加组件。
- 建立 IBM Cloud Object Storage 实例。
- 可选如果您计划使用存储桶版本控制,则您的服务凭证必须具有管理员或写入者权限才能在存储桶上启用或禁用存储桶版本控制。 如需了解更多信息,请参阅“版本控制入门”。
了解水桶的创建和移除
- 您可以通过在 PVC 中指定水桶名称来使用现有的水桶。
- 如果您提供了一个水桶名称,而该水桶并不存在,那么就会创建一个具有该名称的水桶。
- 如果不提供存储桶名称,则会创建一个命名为
temp-xxx的存储桶。 - 根据存储类中定义的回收策略删除存储桶。
- 如果设置了
reclaimPolicy: Delete,则在删除 PVC 时删除水桶。 - 如果设置了
reclaimPolicy: Retain,则即使删除了 PVC,也会保留水桶。
- 如果设置了
在控制台中启用“IBM Cloud Object Storage”插件
- 在 Red Hat OpenShift on IBM Cloud 集群仪表盘中,选择您要为其启用该附加组件的集群。
- 在 “附加组件”部分,找到 Cloud Object Storage 该扩展程序,然后点击 “安装”。
- 在“安装附加组件:Cloud Object Storage”面板中,从“版本”下拉菜单中选择一个版本。
- 可选:配置以下参数。
maxVolumesPerNode- 设置单个节点上可挂载的 IBM Cloud Object Storage 卷的最大数量。 默认值为
0,这意味着不设置任何限制。 restrictNodeServerScheduling- 将其设置为
true,以限制nodeserver Pod仅在标记为cos.csi.ibm.io/csi-node=true的节点上运行。 默认值为false,这意味着 nodeserver Pod 将被调度到所有节点上。
- 单击安装。 附加组件可能需要几分钟时间进行部署和准备以供使用。
- 验证安装。 在 “附加组件”部分,请确认该 Cloud Object Storage 该扩展程序显示为 “正常” 状态。
通过 CLI 启用 IBM Cloud Object Storage 附加组件
开始之前 访问你的Red Hat OpenShift集群。
- 将
container-service插件更新至最新版本。ibmcloud update && ibmcloud plugin update container-service - 列出附加组件并找到要安装的版本。
ibmcloud oc cluster addon versions - 查看附加选项。
ibmcloud oc cluster addon options --addon ibm-object-csi-driver [--version VERSION] - 安装插件。
ibmcloud oc cluster addon enable ibm-object-csi-driver --cluster CLUSTER [--version VERSION] - 验证安装。
ibmcloud oc cluster addon ls --cluster CLUSTEROK Name Version Health State Health Status ibm-object-csi-driver 1.0 normal Addon Ready. For more info: http://ibm.biz/addon-state (H1500) - 列出可用的存储类。 该驱动程序同时支持
s3fs和rclone挂载器的区域内和跨区域存储类。oc get sc | grep objectibm-object-storage-smart-cross-region-rclone cos.s3.csi.ibm.io Delete Immediate false 17h ibm-object-storage-smart-cross-region-rclone-retain cos.s3.csi.ibm.io Retain Immediate false 17h ibm-object-storage-smart-cross-region-s3fs cos.s3.csi.ibm.io Delete Immediate false 17h ibm-object-storage-smart-cross-region-s3fs-retain cos.s3.csi.ibm.io Retain Immediate false 17h ibm-object-storage-smart-rclone cos.s3.csi.ibm.io Delete Immediate false 17h ibm-object-storage-smart-rclone-retain cos.s3.csi.ibm.io Retain Immediate false 17h ibm-object-storage-smart-s3fs cos.s3.csi.ibm.io Delete Immediate false 17h ibm-object-storage-smart-s3fs-retain cos.s3.csi.ibm.io Retain Immediate false 17h ibm-object-storage-standard-cross-region-rclone cos.s3.csi.ibm.io Delete Immediate false 17h ibm-object-storage-standard-cross-region-rclone-retain cos.s3.csi.ibm.io Retain Immediate false 17h ibm-object-storage-standard-cross-region-s3fs cos.s3.csi.ibm.io Delete Immediate false 17h ibm-object-storage-standard-cross-region-s3fs-retain cos.s3.csi.ibm.io Retain Immediate false 17h ibm-object-storage-standard-rclone cos.s3.csi.ibm.io Delete Immediate false 17h ibm-object-storage-standard-rclone-retain cos.s3.csi.ibm.io Retain Immediate false 17h ibm-object-storage-standard-s3fs cos.s3.csi.ibm.io Delete Immediate false 17h ibm-object-storage-standard-s3fs-retain cos.s3.csi.ibm.io Retain Immediate false 17h
限制节点服务器 Pod 的调度
默认情况下,COS CSI 驱动程序的 nodeserver Pod 会调度到集群中的所有节点上。 您可以使用 restrictNodeServerScheduling 参数,将nodeserver的Pod调度限制在仅带有 cos.csi.ibm.io/csi-node=true 标签的节点上。
您可以在启用该插件时配置 restrictNodeServerScheduling,也可以稍后通过修补 ConfigMap 文件来更新它。
- 若要在启用该附加组件时将
restrictNodeServerScheduling设置为启用状态,请在启用命令中包含--param标志。ibmcloud oc cluster addon enable ibm-object-csi-driver --cluster CLUSTER --param "restrictNodeServerScheduling=true" - 若要在已启用该附加组件后更新“
restrictNodeServerScheduling”,请按照以下步骤操作。
- 列出集群中的节点,并确定希望在哪些节点上运行 COS 驱动程序 Pod。
示例输出oc get nodesNAME STATUS ROLES AGE VERSION 10.241.0.11 Ready <none> 5d2h v1.35.5+IKS 10.241.0.12 Ready <none> 5d2h v1.35.5+IKS 10.241.0.13 Ready <none> 5d2h v1.35.5+IKS 10.241.128.10 Ready <none> 5d2h v1.35.5+IKS 10.241.128.11 Ready <none> 5d2h v1.35.5+IKS 10.241.128.9 Ready <none> 5d2h v1.35.5+IKS 10.241.65.12 Ready <none> 5d2h v1.35.5+IKS 10.241.65.13 Ready <none> 5d2h v1.35.5+IKS 10.241.65.14 Ready <none> 5d2h v1.35.5+IKS - 请检查所有节点上是否都有节点服务器 Pod 正在运行。
示例输出oc get pods -n ibm-object-csi-operator -l app.kubernetes.io/component=node -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ibm-object-csi-node-2pj2j 3/3 Running 0 145m 172.17.14.10 10.241.0.12 <none> <none> ibm-object-csi-node-7bhwh 3/3 Running 0 145m 172.17.1.72 10.241.65.12 <none> <none> ibm-object-csi-node-7l9hc 3/3 Running 0 145m 172.17.17.6 10.241.128.9 <none> <none> ibm-object-csi-node-cxzt7 3/3 Running 0 145m 172.17.39.72 10.241.0.11 <none> <none> ibm-object-csi-node-dw6qs 3/3 Running 0 145m 172.17.46.77 10.241.128.10 <none> <none> ibm-object-csi-node-rpcvr 3/3 Running 0 145m 172.17.32.198 10.241.65.13 <none> <none> ibm-object-csi-node-swqtg 3/3 Running 0 145m 172.17.16.69 10.241.0.13 <none> <none> ibm-object-csi-node-sxbbs 3/3 Running 0 145m 172.17.26.7 10.241.65.14 <none> <none> ibm-object-csi-node-xm8bt 3/3 Running 0 145m 172.17.20.200 10.241.128.11 <none> <none> - 为希望调度 nodeserver Pod 的节点添加标签。
示例输出oc label nodes NODE-NAME-1 NODE-NAME-2 cos.csi.ibm.io/csi-node=truenode/10.241.0.11 labeled node/10.241.0.12 labeled - 通过更新 ConfigMap 来启用该限制。
示例输出oc patch cm managed-addon-ibm-object-csi-driver -n kube-system \ --type merge -p '{"data":{"restrictNodeServerScheduling":"true"}}'configmap/managed-addon-ibm-object-csi-driver patched - 请确认节点服务器 Pod 仅被调度到带有标签的节点上。
示例输出oc get pods -n ibm-object-csi-operator -l app.kubernetes.io/component=node -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ibm-object-csi-node-cxzt7 3/3 Running 0 145m 172.17.39.72 10.241.0.11 <none> <none> ibm-object-csi-node-7bhwh 3/3 Running 0 145m 172.17.1.72 10.241.65.12 <none> <none>
| 设置 | 行为 |
|---|---|
restrictNodeServerScheduling: "false" (缺省值) |
Nodeserver Pod 会被调度到所有节点上。 |
restrictNodeServerScheduling: "true" |
Nodeserver Pod 仅调度到标记为 cos.csi.ibm.io/csi-node=true 的节点上。 |
设置每个节点的最大卷数
默认情况下,COS CSI 驱动程序不会限制单个节点上可挂载的卷数量。 您可以使用 maxVolumesPerNode 参数来设置每个节点上的卷最大数量。
您可以在启用该插件时配置 maxVolumesPerNode,也可以稍后通过修补 ConfigMap 文件来更新它。
- 若要在启用该附加组件时将
maxVolumesPerNode设置为启用状态,请在启用命令中包含--param标志。ibmcloud oc cluster addon enable ibm-object-csi-driver --cluster CLUSTER --param "maxVolumesPerNode=VALUE" - 若要在已启用该附加组件后更新
maxVolumesPerNode,请修补受管附加组件 ConfigMap。示例输出oc patch cm managed-addon-ibm-object-csi-driver -n kube-system --type merge -p '{"data":{"maxVolumesPerNode":"VALUE"}}'configmap/managed-addon-ibm-object-csi-driver patched
| 设置 | 行为 |
|---|---|
maxVolumesPerNode: "0" (缺省值) |
每个节点可挂载的卷数量没有限制。 |
maxVolumesPerNode: "VALUE" |
将单个节点上可挂载的卷数量限制为指定值。 |
部署使用IBM Cloud Object Storage的应用程序
创建一个包含 COS 凭据的Kubernetes秘密。
-
将以下配置保存为名为
secret.yaml. 提供 IAM 证书或 HMAC,但不能同时提供。- 对于 IAM 凭据,请使用
apiKey和serviceId的组合,来自 Object Storage。 - 对于 HMAC 凭据,请使用
accessKey和secretKey,来自 Object Storage。
apiVersion: v1 kind: Secret type: cos-s3-csi-driver metadata: name: cos-secret-1 # Name your secret. This same name is used for the PVC in the following steps. namespace: <namespace> # Specify the namespace where you want to create the secret. data: apiKey: <base64-encoded-COS-Service-Instance-apikey> serviceID: <base64-encoded-COS-resource_instance_id> accessKey: <base64-encoded-HMAC-access_key_id> secretKey: <base64-encoded-HMAC-secret_access_key> kp-root-key-crn: <CRN> # Key Protect or HPCS root key crn in base64 encoded format stringData: bucketName: <bucket-name> # Optional. If you don't provide a bucket name, a bucket with the naming convention s3fs-timestamp-xxx or rclone-timestamp-xxx is created. bucketVersioning: "false" # Bucket versioning is set to false by default. Set to "true" to enable bucket versioning. Set to "false" to disable versioning for a bucket where versioning is enabled. Must be a string value. # uid: "3000" # Optional: Provide a uid to run as non root user. This must match runAsUser in SecurityContext of pod spec. mountOptions: | # Review or update the following default s3fs mount options #multipart_size=52 #multireq_max=20 #max_dirty_data=5120 #parallel_count=20 #max_stat_cache_size=100000 #retries=5 #kernel_cache # Review or update the following default rclone mount options #acl=private #bucket_acl=private #upload_cutoff=100Mi #chunk_size=16Mi #max_upload_parts=1000 #upload_concurrency=8mountOptions- 您可以通过编辑密文中的
mountOptions来自定义s3fs或rclone的挂载选项。 根据 PVC 使用的存储类别调整指定的选项。 要查看存储类的默认值,请运行oc describe storageclass <storageclass_name>或oc describe storageclass <storageclass_name>。 更多信息,请参阅 s3fs 挂载选项和rclone挂载选项。
目前,该附加组件已启用,以支持固定的挂载选项集,并对每个挂载选项进行适当的验证。 如果要使用验证列表中没有的其他安装选项,请联系支持部门启用这些选项。
- 对于 IAM 凭据,请使用
-
将所有秘密数据参数编码为 base64。
echo -n "<value>" | base64 -
用 base64 编码值更新
secret.yaml。 -
创建私钥。
oc apply -f secret.yaml
创建 PVC
您可以在多个 PVC 中使用一个密文,也可以在每个 PVC 中使用一个密文。
您可以在 PVC yaml 中使用以下注解来管理这种行为。 这些注释有助于驱动程序将 PVC 映射到正确的密文中。
cos.csi.driver/secret: "<custom-secret>"
请确保您的密钥、PVC 和 Pod 都位于同一个命名空间中
1-to-1 保密信息到 PVC 映射的 PVC 示例,为您的 PVC 赋予与您之前创建的保密信息相同的名称。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cos-secret-1 # Give your PVC the same name as the secret you created in the previous step.
namespace: <namespace> # The namespace where you want to create the PVC.
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: <storage_class_name> # The storage class you want to use.
通过使用注释指定密文,将 1 个密文用于多个 PVC 的 PVC 示例。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cos-csi-pvc1
namespace: <namespace> # The namespace where you want to create the PVC.
annotations:
cos.csi.driver/secret: "<custom-secret>"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 256Mi
storageClassName: <storage_class_name> # The storage class you want to use.
-
从前面的示例中选择一个,并根据自己的使用情况进行定制。 有关存储类的列表,请参阅 存储类参考。
-
创建 PVC。
oc apply -f pvc.yaml
创建部署
-
将以下配置保存到名为
dep.yaml.apiVersion: apps/v1 kind: Deployment metadata: name: <name> labels: app: <name> spec: replicas: 1 selector: matchLabels: app: <name> template: metadata: labels: app: <name> spec: containers: - name: app-frontend image: <image> # Enter your app image. imagePullPolicy: IfNotPresent volumeMounts: - mountPath: <path_you_want_to_mount_the_volume_on> # For example `/dev` name: cos-csi-volume volumes: - name: cos-csi-volume persistentVolumeClaim: claimName: <pvc_name> # Enter the name of the PVC you created earlier. -
创建部署。
oc apply -f dep.yaml
禁用IBM Cloud Object Storage附加组件
禁用插件或补丁更新不会删除现有的机密、PVC 和部署。 不会中断客户现有的工作负载。
- 运行以下命令以禁用该插件。
示例输出ibmcloud oc cluster addon disable ibm-object-csi-driver --cluster CLUSTERData and resources that you created for the add-on might be deleted when the add-on is disabled. Continue? [y/N]> y Disabling add-on ibm-object-csi-driver for cluster XXX... OK - 验证是否已删除附加组件。
ibmcloud oc cluster addon ls --cluster CLUSTER
从Helm插件迁移到群集插件
-
获取 PVC 的详细信息并选择一个进行迁移。
oc get pvc --all-namespaces -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name' | tail -n +2 | while read namespace pvc; do kubectl describe pvc "$pvc" -n "$namespace" | grep 'volume.kubernetes.io/storage-provisioner: ibm.io/ibmc-s3fs' > /dev/null ; if [ $? -eq 0 ]; then echo "PVC: $pvc in Namespace: $namespace uses ibm.io/ibmc-s3fs storage provisioner"; fi; done示例输出
PVC: pvc-test in Namespace: default uses ibm.io/ibmc-s3fs storage provisioner -
描述 PVC 并获取水桶名称。
oc describe pvc <pvc_name> | grep ibm.io/bucket:示例输出
ibm.io/bucket: test-s3 -
重新创建包含水桶名称的秘密。
apiVersion: v1 kind: Secret type: cos-s3-csi-driver metadata: name: cos-secret-1 # Name your secret. namespace: <namespace> # Specify the namespace where you want to create the secret. data: accessKey: <base64-encoded-HMAC-access-key> secretKey: <base64-encoded-HMAC-secret-key> stringData: bucketName: <bucket-name> # uid: "3000" # Optional: Provide a uid to run as non root user. This must match runAsUser in SecurityContext of pod spec. mountOptions: | key1=value1 key2=value2 -
查找 PVC 中使用的存储类。
oc describe pvc <pvc_name> | grep StorageClass:名为
test-s3的 PVC 的命令示例。oc describe pvc test-s3 | grep StorageClass:示例输出
StorageClass: ibmc-s3fs-smart-perf-regional -
查看新的存储类别 that are available with the add-on and select a replacement class.
- 如果您使用的是
flex类,请选择一个新的smart类。 - 如果您使用的是
standard类,请选择一个新的standard类。 - 附加组件不再提供
cold和vault类,请选择smart或standard类。
- 如果您使用的是
-
查看 PVC 的详细信息。
oc describe pvc test-s3示例输出
Name: pvc-test Namespace: default StorageClass: ibmc-s3fs-smart-perf-regional Status: Bound Volume: pvc-c625474d-31f0-4929-bc3e-feace1fb42fb Labels: <none> Annotations: ibm.io/auto-create-bucket: true ibm.io/auto-delete-bucket: true ibm.io/bucket: bha-test-s23 ibm.io/secret-name: satstoragesecret pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes volume.kubernetes.io/storage-provisioner: ibm.io/ibmc-s3fs Finalizers: [kubernetes.io/pvc-protection] Capacity: 3Gi Access Modes: RWO VolumeMode: Filesystem Used By: test-pod Events: <none> -
创建一个替代 PVC,使用新的存储类并引用你之前创建的秘密。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cos-csi-pvc1 namespace: <namespace> # The namespace where you want to create the PVC. annotations: cos.csi.driver/secret: "cos-secret-1" # Secret created in step 4 spec: accessModes: - ReadWriteOnce resources: requests: storage: 256Mi storageClassName: <storage_class_name> # The storage class you picked based on old storage class mapping. -
确认 PVC 为
Bound。oc get pvc -
获取应用程序的详细信息。
oc get pods -
将应用程序的规模缩小到零。
kubectl scale deployment --replicas=0 my-app -
创建一个替换部署,引用上一步中创建的 PVC。
-
新部署运行后,可以删除旧部署。
-
对于每个需要迁移的 PVC,请重复上述步骤。
IBM Cloud Object Storage集群附加存储类
IBM Cloud Object Storage 群集附加组件为 s3fs 和 rclone 安装程序提供存储类。 选择符合您的数据访问需求的存储类。 存储类别决定了为工作负载创建的存储桶类别、回收策略和默认挂载行为。
- 标准
- 用于您经常访问的热数据,如网络或移动应用程序的数据。
- 智能
- 适用于没有特定使用模式的工作负载和数据,或使用模式难以预测的情况。
| 名称 | 水桶类 | 弹性 | 安装机 | 回收策略 | 绑定方式 |
|---|---|---|---|---|---|
| ibm-object-storage-smart-cross-region-rclone | 智能 | 跨区域 | rclone |
删除(T) | 立即 |
| ibm-对象存储-智能跨区域-rclone-保留 | 智能 | 跨区域 | rclone |
Retain | 立即 |
| ibm-object-storage-smart-cross-region-s3fs | 智能 | 跨区域 | s3fs |
删除(T) | 立即 |
| ibm-object-storage-smart-cross-region-s3fs-retain | 智能 | 跨区域 | s3fs |
Retain | 立即 |
| ibm-object-storage-smart-rclone | 智能 | 区域 | rclone |
删除(T) | 立即 |
| ibm-object-storage-smart-rclone-retain | 智能 | 区域 | rclone |
Retain | 立即 |
| ibm-object-storage-smart-s3fs | 智能 | 区域 | s3fs |
删除(T) | 立即 |
| ibm-object-storage-smart-s3fs-retain | 智能 | 区域 | s3fs |
Retain | 立即 |
| ibm-object-storage-standard-跨区域-rclone | 标准 | 跨区域 | rclone |
删除(T) | 立即 |
| ibm-object-storage-standard-跨区域-rclone-保留 | 标准 | 跨区域 | rclone |
Retain | 立即 |
| ibm-object-storage-standard-cross-region-s3fs | 标准 | 跨区域 | s3fs |
删除(T) | 立即 |
| ibm-object-storage-standard-cross-region-s3fs-retain | 标准 | 跨区域 | s3fs |
Retain | 立即 |
| ibm-object-storage-standard-rclone | 标准 | 区域 | rclone |
删除(T) | 立即 |
| ibm-object-storage-standard-rclone-retain | 标准 | 区域 | rclone |
Retain | 立即 |
| ibm-object-storage-standard-s3fs | 标准 | 区域 | s3fs |
删除(T) | 立即 |
| ibm-object-storage-standard-s3fs-retain | 标准 | 区域 | s3fs |
Retain | 立即 |
要查看存储类的详细存储桶配置,请运行 oc describe storageclass <storageclass_name> 或 oc describe storageclass <storageclass_name>。
存储类参数
所有群集附加存储类都包括以下核心参数。
| 参数 | 描述 |
|---|---|
client |
标识驱动程序使用的客户端类型。 附加存储类使用 awss3。 |
cosEndpoint |
定义水桶区域的 IBM Cloud Object Storage 端点。 |
csi.storage.k8s.io/node-publish-secret-name |
引用包含 IBM Cloud Object Storage 凭据的密文名称。 |
csi.storage.k8s.io/node-publish-secret-namespace |
引用包含 IBM Cloud Object Storage 凭据的秘密命名空间。 |
locationConstraint |
定义水桶类别和区域,如 au-syd-smart 或 au-syd-standard。 |
mounter |
指定存储类是使用 s3fs 还是 rclone 安装程序。 |
默认 s3fs 存储类挂载选项
s3fs 存储类使用以下默认挂载选项。
| 安装选项 | 描述 |
|---|---|
multipart_size=52 |
设置每个多部分请求的部分大小(以 MB 为单位)。 |
multireq_max=20 |
设置列出对象的最大并行请求数。 |
max_dirty_data=5120 |
在写入指定数量的 MB 后,将脏数据刷新到 S3。 最小支持值为 50。 -1 的值将禁用此行为。 |
parallel_count=20 |
s3fs 使用多部分请求上传大型对象,并并行发送请求。 |
max_stat_cache_size=100000 |
设置统计缓存和符号链接缓存中的最大条目数。 |
retries=5 |
设置重试失败的 S3 事务的次数。 |
kernel_cache |
启用卷挂载点的内核缓冲区缓存。 从 IBM Cloud Object Storage 读取的数据存储在内核缓存中,以帮助提供更快的读取访问速度。 标准和智能 s3fs 存储类已启用内核缓存。 |
默认 rclone 存储类挂载选项
rclone 存储类使用以下默认挂载选项。
| 安装选项 | 描述 |
|---|---|
acl=private |
确保上传的对象不会被公众访问。 |
bucket_acl=private |
将 rclone 创建的桶的默认 ACL 设置为 private。 |
upload_cutoff=100Mi |
使用多部分上传功能上传大于 100 MiB 的文件。 较小的文件只需一次请求即可上传。 |
chunk_size=16Mi |
设置多部分上传中每个部分的大小。 |
max_upload_parts=1000 |
设置每个多部件上传的最大部件数,并通过配置的 chunk_size 间接限制最大支持文件大小。 通过 chunk_size=16Mi,最大文件大小为 16 GiB。 |
upload_concurrency=8 |
设置多部件上传时并行上传的部件数量。 |