部署使用 COS 的应用程序
创建持久卷声明 (PVC) 以便为集群供应 IBM Cloud Object Storage。
根据在 PVC 中选择的设置,可以通过以下方式供应 IBM Cloud Object Storage:
- 动态配置:创建 PVC 时,系统会自动在您的 IBM Cloud Object Storage 服务实例中创建相应的持久卷 (PV) 和存储桶。
- 静态配置:您可以在 PVC 中引用 IBM Cloud Object Storage 服务实例中的现有存储桶。 创建 PVC 时,将仅自动创建匹配的 PV,并将其链接到 IBM Cloud Object Storage 中的现有存储区。
开始之前:
- 创建并准备 IBM Cloud Object Storage 服务实例。
- 创建私钥以存储 IBM Cloud Object Storage 服务凭证。
- 决定 IBM Cloud Object Storage 的配置。
要向集群添加 IBM Cloud Object Storage,请执行以下操作:
-
创建配置文件以定义持久卷声明 (PVC)。 如果将 IBM Cloud Object Storage 凭证添加到缺省存储类,请勿在 PVC 中列出私钥。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: <name> # Enter the name of the PVC. namespace: <namespace> # Enter the namespace where you want to create the PVC. The PVC must be created in the same namespace where you created the Kubernetes secret for your service credentials and where you want to run your pod. annotations: ibm.io/auto-create-bucket: "<true_or_false>" ibm.io/auto-delete-bucket: "<true_or_false>" ibm.io/bucket: "<bucket_name>" ibm.io/object-path: "<bucket_subdirectory>" ibm.io/quota-limit: "true/false" # Disable or enable a quota limit for your PVC. To use this annotation you must specify the -set quotaLimit=true option during installation. ibm.io/endpoint: "https://<s3fs_service_endpoint>" ibm.io/tls-cipher-suite: "default" ibm.io/secret-name: "<secret_name>" # The name of your Kubernetes secret that you created. ibm.io/secret-namespace: "<secret-namespace>" # By default, the COS plug-in searches for your secret in the same namespace where you create the PVC. If you created your secret in a namespace other than the namespace where you want to create your PVC, enter the namespace where you created your secret. ibm.io/add-mount-param: "<option-1>,<option-2>" # s3fs mount options ibm.io/access-policy-allowed-ips: "XX.XXX.XX.XXX, XX.XX.XX.XXX, XX.XX.XX.XX" # A csv of allow listed IPs. ibm.io/bucket-versioning: "false" # Set to true to enable bucket versioning. spec: accessModes: - ReadWriteOnce resources: requests: storage: <size> storageClassName: <storage_class>ibm.io/auto-create-bucket-
- 在以下选项之间进行选择。
true: 在创建 PVC 时,IBM Cloud Object Storage 服务实例中的 PV 和存储桶会自动创建。 选择此选项可在 IBM Cloud Object Storage 服务实例中创建新存储区。 请注意,服务凭证必须具有 Writer 许可权才能自动创建存储区。false: 如果您想访问现有存储桶中的数据,请选择此选项。 创建 PVC 时,系统会自动创建 PV,并将其与您在ibm.io/bucket中指定的存储桶关联起来。
ibm.io/auto-delete-bucket-
- 在以下选项之间进行选择。
true: 删除 PVC 时,您的数据、存储桶和 PV 将被自动删除。 IBM Cloud Object Storage 服务实例会保留而不删除。 如果您选择将此选项设置为“true”,则必须设置ibm.io/auto-create-bucket: true和ibm.io/bucket: "",以便您的存储桶能自动以tmp-s3fs-xxxx的格式命名。false: 删除 PVC 时,PV 会自动被删除,但您的数据以及 IBM Cloud Object Storage 服务实例中的存储桶仍会保留。 要访问数据,必须使用现有存储区的名称来创建新的 PVC。
ibm.io/bucket-
- 在以下选项之间进行选择。
- 如果将“
ibm.io/auto-create-bucket”设置为“true”:请在“ IBM Cloud Object Storage ”中输入要创建的存储桶名称。 此外,如果将“ibm.io/auto-delete-bucket”设置为“true”,则必须将此字段留空,系统才会自动为您的存储桶分配一个格式为“tmp-s3fs-xxxx”的名称。 该名称在 IBM Cloud Object Storage 中必须唯一。 - 如果“
ibm.io/auto-create-bucket”设置为“false”:请输入您要在集群中访问的现有存储桶的名称。
ibm.io/object-path- 可选:输入存储区中要安装的现有子目录的名称。 如果要仅安装子目录,而不是安装整个存储区,请使用此选项。 要挂载子目录,必须设置
ibm.io/auto-create-bucket: "false",并在ibm.io/bucket中提供存储桶的名称。 ibm.io/quota-limit-
- 要使用此注释,必须在安装期间指定
--set quotaLimit=true选项。 如果要使用此注释,但在安装期间未指定--set quotaLimit=true,请 重新安装 Helm Chart。 - 如果将
ibm.io/quota-limit设置为true``,则您的 PVC 将根据您指定的大小storage:,为该存储桶设置可用的最大存储空间(以字节为单位)。 - 如果
ibm.io/quota-limit设置为false,那么不会在 PVC 上强制实施配额,这意味着实际存储量 (以字节计) 可能超过您根据应用程序指定的storage: <size>。
- 要使用此注释,必须在安装期间指定
ibm.io/endpoint- 如果您是在与集群不同的位置创建的 IBM Cloud Object Storage 服务实例,请输入您要使用的 IBM Cloud Object Storage 服务实例的私有或公有云服务端点。 有关可用服务端点的更多信息和概述,请参阅 其他端点信息。 默认情况下,
ibmcHelm 插件会自动检索您的集群位置,并使用与您的集群位置匹配的 IBM Cloud Object Storage 私有云服务端点来创建存储类。 如果您的经典集群位于多区域大都市区(例如dal10),则将使用该多区域大都市区(例如达拉斯)的 IBM Cloud Object Storage 私有云服务端点。 要验证存储类中的服务端点是否与服务实例的服务端点一致,请运行oc describe storageclass <storageclassname>。 请确保按照以下格式输入您的服务端点:私有云服务端点应采用https://<s3fs_private_service_endpoint>格式,公有云服务端点应采用http://<s3fs_public_service_endpoint>格式。 如果存储类中的服务端点与您的 IBM Cloud Object Storage 服务实例的服务端点一致,请不要在PVC的YAML文件中包含ibm.io/endpoint选项。 ibm.io/add-mount-param- 输入 s3fs Fuse 卷的安装选项。 例如,
ibm.io/add-mount-param: "del_cache,retries=6"。 有关选项列表,请参阅 s3fs 联机帮助页 ibm.io/access-policy-allowed-ips- 输入可访问卷的 IP 的逗号分隔列表。 例如,
ibm.io/access-policy-allowed-ips: "XX.XXX.XX.XXX, XX.XX.XX.XXX, XX.XX.XX.XX"。 storage- 在“规范资源请求”部分中,输入 IBM Cloud Object Storage 存储区的大小 (以千兆字节为单位)。 您在 IBM Cloud Object Storage 上实际使用的空间可能有所不同,具体费用将根据 价格表进行结算。 如果在安装插件时启用了配额,那么存储区的配额等于此大小。
storageClassName-
- 在以下选项之间进行选择。
- 如果
ibm.io/auto-create-bucket: "true":请输入您希望为新存储桶使用的存储类。 - 如果
ibm.io/auto-create-bucket: "false":请输入您用于创建现有存储桶的存储类。 - 如果您是在 IBM Cloud Object Storage 服务实例中手动创建的存储桶,或者不记得所使用的存储类,请在 IBM Cloud 仪表板中找到您的服务实例,并查看现有存储桶的 “类” 和 “位置”。 然后,使用相应的存储类。 存储类中设置的 IBM Cloud Object Storage API 端点基于集群所在的区域。 如果您想访问位于与您的集群所在区域不同的区域中的存储桶,则必须创建自己的存储类,并使用该存储桶对应的 API 端点。
ibm.io/secret-name- 输入用于保存先前创建的 IBM Cloud Object Storage 凭证的私钥的名称。 如果将 IBM Cloud Object Storage 凭证 添加到缺省存储类,那么不得在 PVC 中列出私钥。 如果要在从集群中的 PVC 创建新存储区时集成 Key Protect 加密,那么在创建 IBM Cloud Object Storage 密钥 时必须包含根密钥 CRN。 请注意,不能将 Key Protect 加密添加到现有存储区。
secret-namespace- 缺省情况下,COS 插件在创建 PVC 的同一名称空间中搜索私钥。 如果您在要在其中创建 PVC 的名称空间以外的名称空间中创建了私钥,请输入在其中创建私钥的名称空间。
ibm.io/bucket-versioning- 存储桶版本控制默认设置为“
false”。 设置为true可启用水桶版本管理。 设置为false可禁用已启用版本控制的水桶的版本控制。 请注意,服务凭据必须具有管理器或写入器权限,才能在水桶上启用或禁用水桶版本管理。 如需了解更多信息,请参阅“版本控制入门”。
-
在集群中创建 PVC。
oc apply -f filepath/pvc.yaml -
验证 PVC 是否已创建并与 PV 绑定。
oc get pvc示例输出
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE s3fs-test-pvc Bound pvc-b38b30f9-1234-11e8-ad2b-t910456jbe12 8Gi RWO ibmc-s3fs-standard-cross-region 1h -
可选:如果计划使用非 root 用户访问数据,或者通过直接使用控制台或 API 将文件添加到现有 IBM Cloud Object Storage 存储区,请确保文件分配有正确的许可权,以便应用程序可以根据需要成功地读取和更新文件。
-
要将 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> securityContext: runAsUser: <non_root_user> 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- 要部署到集群的容器的名称。
runAsUser- 在规范容器安全上下文部分中,可以选择将运行设置为用户值。
mountPath- 在“规范容器卷安装”部分中,输入在容器内安装卷的目录的绝对路径。 如果您想在不同的应用程序之间共享一个卷,可以为每个应用程序指定 卷的子路径。
volumeMounts.name- 在“规范容器卷安装”部分中,输入要安装到 pod 的卷的名称。
volumes.name- 在“卷”部分中,输入要安装到 pod 的卷的名称。 通常,该名称与
volumeMounts/name相同。 claimName- 在卷持久卷声明部分中,输入用于绑定要使用的 PV 的 PVC 的名称。
创建部署
创建 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: mypvc ReadOnly: false -
通过登录到应用程序 pod 并写入数据,验证是否可以将数据写入 IBM Cloud Object Storage 服务实例。 登录到安装 PV 的 pod。
oc exec <pod_name> -it bash -
浏览到在应用程序部署中定义的卷安装路径。
-
创建文本文件。
echo "This is a test" > test.txt -
在 IBM Cloud 控制台中,导航至您的 IBM Cloud Object Storage 服务实例。
-
在菜单中,选择存储区。
-
打开存储区,并验证是否可以看到所创建的
test.txt。
在有状态集内使用对象存储器
如果您有一个有状态的应用程序(如数据库),那么可以创建有状态集,以使用 IBM Cloud Object Storage 来存储应用程序的数据。 或者,可以使用 IBM Cloud 数据库即服务(例如,IBM Cloudant),并将数据存储在云中。
开始之前,请先完成本主题开头列出的先决条件步骤。
部署使用对象存储器的有状态集:
-
为有状态集和用于公开有状态集的服务创建配置文件。 以下示例显示了如何将 NGINX 部署为有 3 个副本的有状态集,其中每个副本使用单独的存储区,或者所有副本共享同一存储区。
以下示例演示了如何创建一个包含三个副本的有状态集,每个副本使用一个独立的存储桶。
apiVersion: v1 kind: Service metadata: name: nginx-v01 namespace: default labels: app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-v01 namespace: default spec: selector: matchLabels: app: nginx-v01 # must match spec.template.metadata.labels in stateful set YAML and metadata.labels in service YAML serviceName: "nginx-v01" replicas: 3 template: metadata: labels: app: nginx-v01 # must match spec.selector.matchLabels in stateful set YAML and metadata.labels in service YAML spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: mypvc mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: mypvc annotations: ibm.io/auto-create-bucket: "true" ibm.io/auto-delete-bucket: "true" ibm.io/bucket: "" ibm.io/secret-name: mysecret volume.beta.kubernetes.io/storage-class: ibmc-s3fs-standard-perf-cross-region volume.beta.kubernetes.io/storage-provisioner: ibm.io/ibmc-s3fs spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "ibmc-s3fs-standard-perf-cross-region" resources: requests: storage: 1Gi以下示例演示了如何创建一个包含三个副本且共享同一存储桶
mybucket的有状态集。apiVersion: v1 kind: Service metadata: name: nginx-v01 namespace: default labels: app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-v01 namespace: default spec: selector: matchLabels: app: nginx-v01 # must match spec.template.metadata.labels in stateful set YAML and metadata.labels in service YAML serviceName: "nginx-v01" replicas: 3 template: metadata: labels: app: nginx-v01 # must match spec.selector.matchLabels in stateful set YAML and metadata.labels in service YAML spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: mypvc mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: mypvc annotations: ibm.io/auto-create-bucket: "false" ibm.io/auto-delete-bucket: "false" ibm.io/bucket: mybucket ibm.io/secret-name: mysecret volume.beta.kubernetes.io/storage-class: ibmc-s3fs-standard-perf-cross-region volume.beta.kubernetes.io/storage-provisioner: ibm.io/ibmc-s3fs spec: accessModes: [ "ReadOnlyMany" ] storageClassName: "ibmc-s3fs-standard-perf-cross-region" resources: requests: storage: 1Gi
name-
输入有状态集的名称。 您输入的名称将用于为您的 PVC 生成名称,格式为:
<volume_name>-< statefulset_name>-<replica_number>。 serviceName-
输入要用于公开有状态集的服务的名称。
replicas-
输入有状态集的副本数。
matchLabels-
在“规范选择器匹配标签”部分中,输入要包含在有状态集和 PVC 中的所有标签。 您在有状态集合(stateful set)的
volumeClaimTemplates中包含的标签不会被 Kubernetes 识别。 相反,您必须在有状态集群(stateful set)的 YAML 文件中,于spec.selector.matchLabels和spec.template.metadata.labels部分定义这些标签。 为确保所有有状态集(stateful set)的副本都纳入服务的负载均衡范围,请添加与服务 YAML 文件中spec.selector部分所用标签相同的标签。 labels-
在“规范元数据标签”部分中,输入添加到有状态集 YAML 的
spec.selector.matchLabels部分的相同标签。 terminationGracePeriodSeconds-
请输入秒数,以便为
kubelet分配足够的时间,以安全地终止运行您的有状态集副本的Pod。 有关更多信息,请参阅 删除 Pod。 VolumeClaimTemplates.name-
在规范卷声明模板元数据部分中,输入卷的名称。 请使用您在“
spec.containers.volumeMount.name”部分中定义的名称。 您在此处输入的名称将用于为您的 PVC 生成名称,格式为:<volume_name>-<statefulset_name>-<replica_number>。 ibm.io/auto-create-bucket-
在规范卷声明模板元数据部分中,设置注释以配置如何创建存储区。 在以下选项之间进行选择:
- true: 选择此选项可为每个有状态集副本自动创建一个存储桶。 请注意,服务凭证必须具有 Writer 许可权才能自动创建存储区。
- false: 若要让有状态集的各个副本共享一个现有的存储桶,请选择此选项。 请务必在有状态集(StatefulSet)的 YAML 文件中,于
spec.volumeClaimTemplates.metadata.annotions.ibm.io/bucket部分定义存储桶的名称。
ibm.io/auto-delete-bucket-
在规范卷声明模板元数据部分中,设置注释以配置如何删除存储区。 在以下选项之间进行选择:
- true: 删除 PVC 时,您的数据、存储桶和 PV 将被自动删除。 IBM Cloud Object Storage 服务实例会保留而不删除。 如果您选择将此选项设置为 true,则必须设置
ibm.io/auto-create-bucket: true和ibm.io/bucket: "",以便您的存储桶在自动创建时采用tmp-s3fs-xxxx格式的名称。 - false: 删除 PVC 时,PV 会自动被删除,但您在 IBM Cloud Object Storage 服务实例中的数据和存储桶仍会保留。 要访问数据,必须使用现有存储区的名称来创建新的 PVC。
- true: 删除 PVC 时,您的数据、存储桶和 PV 将被自动删除。 IBM Cloud Object Storage 服务实例会保留而不删除。 如果您选择将此选项设置为 true,则必须设置
ibm.io/bucket-
在规范卷声明模板元数据部分中,设置存储区详细信息的注释。 在以下选项之间进行选择:
- 如果将
ibm.io/auto-create-bucket设置为true:请在IBM Cloud Object Storage中输入要创建的存储桶名称。 此外,如果将“ibm.io/auto-delete-bucket”设置为“true”,则必须将此字段留空,系统才会自动为您的存储桶分配一个格式为“tmp-s3fs-xxxx”的名称。 该名称在 IBM Cloud Object Storage 中必须唯一。 - 如果将
ibm.io/auto-create-bucket设置为false:请输入您要在集群中访问的现有存储桶的名称。
- 如果将
ibm.io/secret-name-
在规范卷声明模板元数据注释部分中,输入保存先前创建的 IBM Cloud Object Storage 凭证的私钥的名称。 如果将 IBM Cloud Object Storage 凭证 添加到缺省存储类,那么不得在 PVC 中列出私钥。
kubernetes.io/storage-class-
在“规范卷声明模板元数据注释”部分中,输入要使用的存储类。 在以下选项之间进行选择:
- 如果
ibm.io/auto-create-bucket: "true":请输入您希望为新存储桶使用的存储类。 - 如果
ibm.io/auto-create-bucket: "false":请输入您用于创建现有存储桶的存储类。
- 如果
-
要列出现有的存储类,请运行
oc get sc | grep s3。 如果您未指定存储类,则该 PVC 将使用集群中设置的默认存储类进行创建。 请确保默认存储类使用ibm.io/ibmc-s3fs配置程序,以便您的有状态集群通过对象存储进行配置。 storageClassName-
在 spec 卷声明模板 spec 部分中,输入您在有状态集 YAML 的
spec.volumeClaimTemplates.metadata.annotations.volume.beta.kubernetes.io/storage-class部分中输入的相同存储类。 storage-
在“规范卷声明模板规范资源请求”部分中,输入 IBM Cloud Object Storage 存储区的虚构大小 (以千兆字节为单位)。 Kubernetes 需要此大小,但在 IBM Cloud Object Storage 中并不考虑此大小。 所以您可以输入所需的任意大小。 您在 IBM Cloud Object Storage 上实际使用的空间可能有所不同,具体费用将根据 价格表进行结算。