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:
- Cree y prepare la instancia de servicio de IBM Cloud Object Storage.
- Cree un secreto para almacenar las credenciales de servicio de IBM Cloud Object Storage.
- Decida la configuración de IBM Cloud Object Storage.
Para añadir IBM Cloud Object Storage al clúster:
-
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 enibm.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 entrue, debe estableceribm.io/auto-create-bucket: trueeibm.io/bucket: ""para que el grupo se cree automáticamente con un nombre con el formatotmp-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-bucketse establece entrue: especifique el nombre del grupo que desea crear en IBM Cloud Object Storage. Si, además,ibm.io/auto-delete-bucketse establece entrue, debe dejar este campo en blanco para asignar automáticamente al grupo un nombre con el formatotmp-s3fs-xxxx. El nombre debe ser exclusivo en IBM Cloud Object Storage. - Si
ibm.io/auto-create-bucketse establece enfalse: 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 enibm.io/bucket. ibm.io/quota-limit-
- Para utilizar esta anotación, debe especificar la opción
--set quotaLimit=truedurante la instalación. Si desea utilizar esta anotación, pero no ha especificado--set quotaLimit=truedurante 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ñostorage: <size>que especifiques. - Si
ibm.io/quota-limitse establece enfalse, la cuota no se aplica en la PVC, lo que significa que la cantidad real de almacenamiento en bytes puede superar elstorage: <size>que ha especificado en función de la app.
- Para utilizar esta anotación, debe especificar la opción
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
ibmcrecupera 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 ejemplodal10, 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, ejecuteoc describe storageclass <storageclassname>. Especifique el punto final de servicio en formatohttps://<s3fs_private_service_endpoint>para puntos finales de servicio de nube privada ohttp://<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ónibm.io/endpointen 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
falsepredeterminada. Establézcalo entruepara activar el versionado de cubos. Establézcalo enfalsepara 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.
-
Cree la PVC en el clúster.
oc apply -f filepath/pvc.yaml -
Verifique que la PVC se ha creado y se ha vinculado al PV.
oc get pvcSalida 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 -
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.
-
Para montar el PV en el despliegue, cree un archivo
.yamlde 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.appylabels.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.
-
Cree el despliegue.
oc apply -f <local_yaml_path> -
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 -
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 -
Vaya a la vía de acceso de montaje de volumen que ha definido en el despliegue de la app.
-
Cree un archivo de texto.
echo "This is a test" > test.txt -
Desde la consola de IBM Cloud, acceda a su instancia del servicio IBM Cloud Object Storage.
-
En el menú, seleccione Grupos.
-
Abra el grupo y verifique que puede ver el archivo
test.txtque 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:
-
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: 1GiEjemplo 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
volumeClaimTemplatesdel conjunto con estado. Debe definir estas etiquetas en la secciónspec.selector.matchLabelsy en la secciónspec.template.metadata.labelsdel 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ónspec.selectordel 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.matchLabelsdel archivo YAML del conjunto con estado. terminationGracePeriodSeconds-
Introduce el número de segundos que se le dará al para
kubeletque 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/bucketdel 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: trueeibm.io/bucket: ""para que el grupo se cree automáticamente con un nombre con el formatotmp-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.
- **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/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-bucketse establece en true: especifique el nombre del grupo que desea crear en IBM Cloud Object Storage. Si, además,ibm.io/auto-delete-bucketse establece entrue, debe dejar este campo en blanco para asignar automáticamente al grupo un nombre con el formatotmp-s3fs-xxxx. El nombre debe ser exclusivo en IBM Cloud Object Storage. - Si
ibm.io/auto-create-bucketse establece en false: especifique el nombre del grupo existente al que desea acceder en el clúster.
- Si
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.
- Si
-
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 suministradoribm.io/ibmc-s3fspara 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-classdel 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.