IBM Cloud Docs
部署使用 COS 的应用程序

部署使用 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,请执行以下操作:

  1. 创建配置文件以定义持久卷声明 (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: trueibm.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: <size> 设置可用于存储区的最大存储量 (以字节计)。
    如果 ibm.io/quota-limit 设置为 false,那么不会在 PVC 上强制实施配额,这意味着实际存储量 (以字节计) 可能超过您根据应用程序指定的 storage: <size>
    ibm.io/endpoint
    如果您创建 IBM Cloud Object Storage 服务实例的位置与群集不同,请输入您要使用的 IBM Cloud Object Storage 服务实例的私有云或公有云服务端点。 有关可用服务端点的更多信息和概述,请参阅 其他端点信息。 默认情况下,ibmc Helm 插件会自动检索群集位置,并使用与群集位置相匹配的 IBM Cloud Object Storage 私有云服务端点创建存储类。 如果经典集群位于多专区都市 (例如 dal10) 中,那么表示多专区都市 (例如达拉斯) 的 IBM Cloud Object Storage 私有云服务端点。 要验证存储类中的服务端点是否与服务实例的服务端点相匹配,请运行 kubectl 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 可禁用已启用版本控制的水桶的版本控制。 请注意,服务凭据必须具有管理器或写入器权限,才能在水桶上启用或禁用水桶版本管理。 有关更多信息,请参阅 版本控制入门
  2. 在集群中创建 PVC。

    kubectl apply -f filepath/pvc.yaml
    
  3. 验证 PVC 是否已创建并与 PV 绑定。

    kubectl 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
    
  4. 可选:如果计划使用非 root 用户访问数据,或者通过直接使用控制台或 API 将文件添加到现有 IBM Cloud Object Storage 存储区,请确保文件分配有正确的许可权,以便应用程序可以根据需要成功地读取和更新文件。

  5. 要将 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.applabels.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 和部署配置文件后,在集群中创建部署。

  1. 创建部署。

    kubectl apply -f <local_yaml_path>
    
  2. 验证 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:    mypvc
        ReadOnly:    false
    
  3. 通过登录到应用程序 pod 并写入数据,验证是否可以将数据写入 IBM Cloud Object Storage 服务实例。 登录到安装 PV 的 pod。

    kubectl exec <pod_name> -it bash
    
  4. 浏览到在应用程序部署中定义的卷安装路径。

  5. 创建文本文件。

    echo "This is a test" > test.txt
    
  6. 在 IBM Cloud®“仪表板”中,浏览到 IBM Cloud Object Storage 服务实例。

  7. 在菜单中,选择存储区

  8. 打开存储区,并验证是否可以看到所创建的 test.txt

在有状态集内使用对象存储器

如果您有一个有状态的应用程序(如数据库),那么可以创建有状态集,以使用 IBM Cloud Object Storage 来存储应用程序的数据。 或者,可以使用 IBM Cloud 数据库即服务(例如,IBM Cloudant),并将数据存储在云中。

开始之前:

部署使用对象存储器的有状态集:

  1. 为有状态集和用于公开有状态集的服务创建配置文件。 以下示例显示了如何将 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: k8s.gcr.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: k8s.gcr.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 中的所有标签。 volumeClaimTemplates 中包含的标签不会被 Kubernetes 识别。 相反,您必须在有状态数据集 YAML 的 spec.selector.matchLabelsspec.template.metadata.labels 部分定义这些标签。 要确保所有有状态集副本都进入了服务的负载平衡,请在服务 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

在规范卷声明模板元数据部分中,设置注释以配置如何创建存储区。 在以下选项之间进行选择:

  • 真: 选择此选项可为每个有状态数据集副本自动创建一个数据桶。 请注意,服务凭证必须具有 Writer 许可权才能自动创建存储区。
  • 假: 如果想在有状态数据集副本中共享现有的数据桶,请选择此选项。 确保在有状态设置 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: trueibm.io/bucket: "",以便自动创建的水桶名称格式为 tmp-s3fs-xxxx
  • 错误: 当您删除 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/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":输入您用来创建现有水桶的存储类别。

要列出现有存储类,请运行 kubectl 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 中实际使用的空间可能不同,并根据 定价表计费。