Implementación de una aplicación que utiliza COS

Cree una reclamación de volumen persistente (PVC) para suministrar IBM Cloud Object Storage al clúster.

En función de los valores que elija en la PVC, puede suministrar IBM Cloud Object Storage de las formas siguientes:

  • Aprovisionamiento dinámico: al crear el PVC, se crean automáticamente el volumen persistente (PV) correspondiente y el bucket en su instancia del servicio IBM Cloud Object Storage.
  • Aprovisionamiento estático: puedes hacer referencia a un bucket existente en tu instancia del servicio IBM Cloud Object Storage en tu PVC. Cuando se crea la PVC, sólo se crea automáticamente el PV correspondiente y se vincula con el grupo existente en IBM Cloud Object Storage.

Antes de empezar:

Para añadir IBM Cloud Object Storage al clúster:

  1. Cree un archivo de configuración para definir la reclamación de volumen persistente (PVC). Si añades tus credenciales de IBM Cloud Object Storage a las clases de almacenamiento predeterminadas, no incluyas tu secreto en el 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
    Puede elegir entre las siguientes opciones.
    true: Cuando crea la PVC, se crean automáticamente el PV y el grupo en la instancia de servicio de IBM Cloud Object Storage. Elija esta opción para crear un nuevo grupo en la instancia de servicio de IBM Cloud Object Storage. Tenga en cuenta que las credenciales de servicio deben tener permisos de Escritor para crear automáticamente el grupo.
    false: Elija esta opción si quiere acceder a los datos de un grupo existente. Cuando se crea la PVC, el PV se crea automáticamente y se enlaza con el grupo que haya especificado en ibm.io/bucket.
    ibm.io/auto-delete-bucket
    Puede elegir entre las siguientes opciones.
    true: Los datos, el grupo y el PV se eliminan automáticamente cuando se suprime la PVC. La instancia de servicio de IBM Cloud Object Storage se conserva y no se suprime. Si elige establecer esta opción en true, debe establecer ibm.io/auto-create-bucket: true e ibm.io/bucket: "" para que el grupo se cree automáticamente con un nombre con el formato tmp-s3fs-xxxx.
    false: Cuando se suprime la PVC, el PV se suprime automáticamente, pero se conservan los datos y el grupo de la instancia de servicio de IBM Cloud Object Storage. Para acceder a los datos, debe crear una nueva PVC con el nombre del grupo existente.
    ibm.io/bucket
    Puede elegir entre las siguientes opciones.
    Si ibm.io/auto-create-bucket se establece en true: especifique el nombre del grupo que desea crear en IBM Cloud Object Storage. Si, además, ibm.io/auto-delete-bucket se establece en true, debe dejar este campo en blanco para asignar automáticamente al grupo un nombre con el formato tmp-s3fs-xxxx. El nombre debe ser exclusivo en IBM Cloud Object Storage.
    Si ibm.io/auto-create-bucket se establece en false: especifique el nombre del grupo existente al que desea acceder en el clúster.
    ibm.io/object-path
    Opcional: especifique el nombre del subdirectorio existente del grupo que desea montar. Utilice esta opción si desea montar únicamente un subdirectorio y no todo el grupo. Para montar un subdirectorio, debe establecer ibm.io/auto-create-bucket: "false" e indicar el nombre del grupo en ibm.io/bucket.
    ibm.io/quota-limit
    Para utilizar esta anotación, debe especificar la opción --set quotaLimit=true durante la instalación. Si desea utilizar esta anotación, pero no ha especificado --set quotaLimit=true durante la instalación, vuelva a instalar el diagrama de Helm.
    Si la opción « ibm.io/quota-limit » está configurada como « true », tu PVC establece una cantidad máxima de almacenamiento (en bytes) disponible para el bucket en función del tamaño storage: <size> que especifiques.
    Si ibm.io/quota-limit se establece en false, la cuota no se aplica en la PVC, lo que significa que la cantidad real de almacenamiento en bytes puede superar el storage: <size> que ha especificado en función de la app.
    ibm.io/endpoint
    Si ha creado la instancia de servicio de IBM Cloud Object Storage en una ubicación distinta de la del clúster, especifique el punto final de servicio en la nube público o privado de la instancia de servicio de IBM Cloud Object Storage que desea utilizar. Para obtener más información y una visión general de los puntos finales de servicio disponibles, consulte Información de punto final adicional. De forma predeterminada, el plugin de Helm ibmc recupera automáticamente la ubicación del clúster y crea las clases de almacenamiento utilizando el punto final de servicio en la nube privado de IBM Cloud Object Storage que coincide con la ubicación del clúster. Si su clúster clásico se encuentra en una área metropolitana con varias zonas, como por ejemplo dal10, se utiliza el punto de conexión del servicio de nube privada IBM Cloud Object Storage correspondiente a dicha área metropolitana con varias zonas, como por ejemplo Dallas. Para verificar que el punto final de servicio de las clases de almacenamiento se corresponde con el punto final de servicio de la instancia de servicio, ejecute oc describe storageclass <storageclassname>. Especifique el punto final de servicio en formato https://<s3fs_private_service_endpoint> para puntos finales de servicio de nube privada o http://<s3fs_public_service_endpoint> para puntos finales de servicio de nube pública. Si el punto final de servicio de la clase de almacenamiento se corresponde con el punto final de servicio de la instancia de servicio de IBM Cloud Object Storage, no incluya la opción ibm.io/endpoint en el archivo YAML de PVC.
    ibm.io/add-mount-param
    Especifique las opciones de montaje para los volúmenes de s3fs Fuse. Por ejemplo, ibm.io/add-mount-param: "del_cache,retries=6". Para obtener una lista de opciones, consulte las páginas man des3fs
    ibm.io/access-policy-allowed-ips
    Especifique una lista separada por comas de IP que puedan acceder a los volúmenes. Por ejemplo, ibm.io/access-policy-allowed-ips: "XX.XXX.XX.XXX, XX.XX.XX.XXX, XX.XX.XX.XX".
    storage
    En la sección de solicitudes de recursos de especificaciones, introduce el tamaño de tu depósito de IBM Cloud Object Storage en gigabytes. El espacio real que utilices en IBM Cloud Object Storage puede variar y se factura según la tabla de precios. Si ha habilitado las cuotas al instalar el plugin, la cuota para el grupo es igual a este tamaño.
    storageClassName
    Puede elegir entre las siguientes opciones.
    Si ibm.io/auto-create-bucket: "true": especifique la clase de almacenamiento que desea utilizar para el nuevo grupo.
    Si ibm.io/auto-create-bucket: "false": especifique la clase de almacenamiento que ha utilizado para crear el grupo existente.
    Si ha creado manualmente el grupo en la instancia de servicio de IBM Cloud Object Storage o no recuerda la clase de almacenamiento que ha utilizado, busque la instancia de servicio en el panel de control de IBM Cloud y revise la clase y la ubicación del grupo existente. A continuación, utilice la clase de almacenamiento adecuada. El punto final de la API de IBM Cloud Object Storage que se establece en la clase de almacenamiento se basa en la región en la que se encuentra el clúster. Si desea acceder a un bucket que se encuentra en una región distinta a aquella en la que está ubicado su clúster, debe crear su propia clase de almacenamiento y utilizar el punto final de la API adecuado para su bucket.
    ibm.io/secret-name
    Especifique el nombre del secreto que contiene las credenciales de IBM Cloud Object Storage que ha creado anteriormente. Si añade sus credenciales deIBM Cloud Object Storage a las clases de almacenamiento predeterminadas, no debe listar secretos en la PVC. Si desea integrar el cifrado Key Protect al crear nuevos grupos a partir de PVC en el clúster, debe incluir el CRN de clave raíz al crear el secretoIBM Cloud Object Storage. Tenga en cuenta que no puede añadir el cifrado Key Protect a los grupos existentes.
    secret-namespace
    De forma predeterminada, el plugin de COS busca el secreto en el mismo espacio de nombres donde crea la PVC. Si ha creado el su secreto en un espacio de nombres distinto del espacio de nombres donde desea crear la PVC, especifique el espacio de nombres donde ha creado el secreto.
    ibm.io/bucket-versioning
    El control de versiones de los buckets está configurado de forma false predeterminada. Establézcalo en true para activar el versionado de cubos. Establézcalo en false para desactivar el versionado de un cubo en el que el versionado esté activado. Tenga en cuenta que las credenciales de servicio deben tener permisos de Administrador o Escritor para activar o desactivar el versionado de cubos en el cubo. Para obtener más información, consulta Introducción al control de versiones.
  2. Cree la PVC en el clúster.

    oc apply -f filepath/pvc.yaml
    
  3. Verifique que la PVC se ha creado y se ha vinculado al PV.

    oc get pvc
    

    Salida de ejemplo

    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. Opcional: si tiene previsto acceder a los datos con un usuario no root, o añadir archivos a un grupo de IBM Cloud Object Storage existente mediante la consola o la API directamente, asegúrese de que los archivos tengan el permiso correcto asignado para que la app pueda leer y actualizar correctamente los archivos según sea necesario.

  5. Para montar el PV en el despliegue, cree un archivo .yaml de configuración y especifique la PVC que enlaza el PV.

    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
    En la sección metadata, especifique una etiqueta para el despliegue.
    matchLabels.app y labels.app
    En el selector de especificación y en las secciones de metadatos de la plantilla de especificación, especifique una etiqueta para la app.
    image
    El nombre de la imagen de contenedor que desea utilizar. Para ver una lista de todas las imágenes disponibles en su cuenta de IBM Cloud Container Registry, ejecute ibmcloud cr image-list.
    name
    El nombre del contenedor que desea desplegar en el clúster.
    runAsUser
    En la sección de contexto de seguridad de contenedores de especificación, puede establecer si lo desea la ejecución como valor de usuario.
    mountPath
    En la sección de montajes de volúmenes de contenedor de especificación, especifique la vía de acceso absoluta del directorio en el que está montado el volumen dentro del contenedor. Si desea compartir un volumen entre diferentes aplicaciones, puede especificar subrutas del volumen para cada una de sus aplicaciones.
    volumeMounts.name
    En la sección de montajes de volúmenes de contenedor de especificación, especifique el nombre del volumen que se va a montar en el pod.
    volumes.name
    En la sección de volúmenes, especifique el nombre del volumen que se va a montar en el pod. Normalmente, este nombre es el mismo que volumeMounts/name.
    claimName
    En la sección de reclamación de volúmenes persistentes, especifique el nombre de la PVC que enlaza el PV que desea utilizar.

Creación de un despliegue

Una vez creada la PVC y los archivos de configuración del despliegue, cree este en el clúster.

  1. Cree el despliegue.

    oc apply -f <local_yaml_path>
    
  2. Verifique que el PV se ha montado correctamente.

    oc describe deployment <deployment_name>
    

    El punto de montaje se muestra en el campo Volume Mounts y el volumen se muestra en el campo 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. Compruebe que puede escribir datos en la instancia de servicio de IBM Cloud Object Storage iniciando sesión en el pod de aplicaciones y escribiendo datos. Inicie la sesión en el pod que monta el PV.

    oc exec <pod_name> -it bash
    
  4. Vaya a la vía de acceso de montaje de volumen que ha definido en el despliegue de la app.

  5. Cree un archivo de texto.

    echo "This is a test" > test.txt
    
  6. Desde la consola de IBM Cloud, acceda a su instancia del servicio IBM Cloud Object Storage.

  7. En el menú, seleccione Grupos.

  8. Abra el grupo y verifique que puede ver el archivo test.txt que ha creado.

Utilización del almacenamiento de objetos en un conjunto con estado

Si tiene una app con estado como, por ejemplo, una base de datos, puede crear conjuntos con estado que utilicen IBM Cloud Object Storage para almacenar los datos de la app. Como alternativa, puede utilizar una base de datos como servicio de IBM Cloud, como por ejemplo IBM Cloudant, y almacenar los datos en la nube.

Antes de empezar, sigue los pasos previos que se indican al principio de este tema.

Para desplegar un conjunto con estado que utilice el almacenamiento de objetos:

  1. Cree un archivo de configuración para el conjunto con estado y el servicio que utiliza para exponer el conjunto con estado. En los ejemplos siguientes se muestra cómo desplegar NGINX como un conjunto con estado con tres réplicas, cada una de ellas con un grupo distinto o compartiendo todas el mismo grupo.

    Ejemplo de creación de un conjunto con estado con tres réplicas, donde cada una de ellas usa un grupo aparte.

    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
    

    Ejemplo de creación de un conjunto con estado con tres réplicas que comparten el mismo grupo 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

Especifique un nombre para el conjunto con estado. El nombre que especifique se utilizará para crear el nombre de la PVC con el formato: <volume_name>-< statefulset_name>-<replica_number>.

serviceName

Especifique el nombre del servicio que desea utilizar para exponer el conjunto con estado.

replicas

Especifique el número de réplicas para el conjunto con estado.

matchLabels

En la sección de etiquetas de comparación del selector de especificación, especifique todas las etiquetas que desee incluir en el conjunto con estado y en la PVC. Kubernetes no reconoce las etiquetas que se incluyen en volumeClaimTemplates del conjunto con estado. Debe definir estas etiquetas en la sección spec.selector.matchLabels y en la sección spec.template.metadata.labels del archivo YAML del conjunto con estado. Para que todas las réplicas del conjunto con estado estén en el equilibrio de carga del servicio, incluya la misma etiqueta que ha utilizado en la sección spec.selector del servicio YAML.

labels

En la sección de etiquetas de metadatos de especificación, especifique las mismas etiquetas que ha añadido a la sección spec.selector.matchLabels del archivo YAML del conjunto con estado.

terminationGracePeriodSeconds

Introduce el número de segundos que se le dará al para kubelet que cierre de forma segura el pod que ejecuta la réplica de tu conjunto con estado. Para obtener más información, consulte Suprimir pods.

VolumeClaimTemplates.name

En la sección de metadatos de plantillas de reclamación de volúmenes de especificación, especifique un nombre para el volumen. Utilice el mismo nombre que ha definido en la sección spec.containers.volumeMount.name. El nombre que especifique aquí se utilizará para crear el nombre de la PVC con el siguiente formato: <volume_name>-<statefulset_name>-<replica_number>.

ibm.io/auto-create-bucket

En la sección de metadatos de plantillas de reclamación de volúmenes de especificación, defina una anotación para configurar la forma en que se crean los grupos. Seleccione una de las opciones siguientes:

  • **true: **elija esta opción para crear automáticamente un grupo para cada réplica del conjunto con estado. Tenga en cuenta que las credenciales de servicio deben tener permisos de Escritor para crear automáticamente el grupo.
  • **false: **elija esta opción si desea compartir un grupo existente entre las réplicas del conjunto con estado. Asegúrese de definir el nombre del grupo en la sección spec.volumeClaimTemplates.metadata.annotions.ibm.io/bucket del archivo YAML del conjunto con estado.
ibm.io/auto-delete-bucket

En la sección de metadatos de plantillas de reclamación de volúmenes de especificación, defina una anotación para configurar la forma en que se suprimen los grupos. Seleccione una de las opciones siguientes:

  • **true: **los datos, el grupo y el PV se eliminan automáticamente cuando se suprime la PVC. La instancia de servicio de IBM Cloud Object Storage se conserva y no se suprime. Si elige establecer esta opción en true, debe establecer ibm.io/auto-create-bucket: true e ibm.io/bucket: "" para que el grupo se cree automáticamente con un nombre con el formato tmp-s3fs-xxxx.
  • **false: **al suprimir la PVC, el PV se suprime automáticamente, pero se conservan los datos del grupo de la instancia de servicio de IBM Cloud Object Storage. Para acceder a los datos, debe crear una nueva PVC con el nombre del grupo existente.
ibm.io/bucket

En la sección de metadatos de plantillas de reclamación de volúmenes de especificación, defina una anotación para los detalles del grupo. Seleccione una de las opciones siguientes:

  • Si ibm.io/auto-create-bucket se establece en true: especifique el nombre del grupo que desea crear en IBM Cloud Object Storage. Si, además, ibm.io/auto-delete-bucket se establece en true, debe dejar este campo en blanco para asignar automáticamente al grupo un nombre con el formato tmp-s3fs-xxxx. El nombre debe ser exclusivo en IBM Cloud Object Storage.
  • Si ibm.io/auto-create-bucket se establece en false: especifique el nombre del grupo existente al que desea acceder en el clúster.
ibm.io/secret-name

En la sección de anotaciones de metadatos de plantillas de reclamación de volúmenes de especificación, especifique el nombre del secreto que contiene las credenciales de IBM Cloud Object Storage que ha creado anteriormente. Si añade las credenciales de IBM Cloud Object Storage a las clases de almacenamiento predeterminadas, no tiene que listar el secreto en la PVC.

kubernetes.io/storage-class

En la sección de anotaciones de metadatos de plantillas de reclamación de volúmenes de especificación, especifique la clase de almacenamiento que desea utilizar. Seleccione una de las opciones siguientes:

  • Si ibm.io/auto-create-bucket: "true": especifique la clase de almacenamiento que desea utilizar para el nuevo grupo.
  • Si ibm.io/auto-create-bucket: "false": especifique la clase de almacenamiento que ha utilizado para crear el grupo existente.

Para ver una lista de las clases de almacenamiento existentes, ejecute oc get sc | grep s3. Si no especifica una clase de almacenamiento, la PVC se crea con la clase de almacenamiento predeterminada establecida en el clúster. Asegúrese de que la clase de almacenamiento predeterminada utiliza el suministrador ibm.io/ibmc-s3fs para que el conjunto con estado se suministre con almacenamiento de objetos.

storageClassName

En la sección de especificación de plantillas de reclamación de volúmenes de especificación, escriba la clase de almacenamiento que ha especificado en la sección spec.volumeClaimTemplates.metadata.annotations.volume.beta.kubernetes.io/storage-class del archivo YAML del conjunto con estado.

storage

En la sección de solicitudes de recursos de especificación de plantillas de reclamación de volúmenes de especificación, escriba un tamaño ficticio para el grupo de IBM Cloud Object Storage en gigabytes. El tamaño es necesario para Kubernetes, pero no se respeta en IBM Cloud Object Storage. Puede especificar cualquier tamaño que desee. El espacio real que utilices en IBM Cloud Object Storage puede variar y se factura según la tabla de precios.