Conectar un despliegue de Cloud Databases a una aplicación IBM Cloud Kubernetes Service

El repositorio de Ejemplos de Kubernetes de Cloud Databases "Hello World" contiene aplicaciones IBM Cloud® de ejemplo, escritas en varios lenguajes de programación, que detallan cómo conectar un despliegue de Cloud Databases a una aplicación IBM Cloud Kubernetes Service.

Cada ramificación Git del repositorio de ejemplos corresponde a ejemplos en un lenguaje de programación determinado, ya sea JavaScript que utiliza Node.js o python. Los archivos de cada carpeta corresponden a una base de datos o a una cola de mensajes.

Prueba de las aplicaciones de ejemplo

Clone el repositorio correspondiente que desee utilizar. Por ejemplo, puede clonar el repositorio Node seleccionando la rama Node. A continuación, pulse Clonar o descargar para obtener el URL que necesita para clonar utilizando SSH o HTTPS. Este mandato tiene el aspecto siguiente:

git clone -b node git@github.com:IBM-Cloud/clouddatabases-helloworld-kubernetes-examples.git

O bien, clone utilizando HTTPS:

git clone -b node https://github.com/IBM-Cloud/clouddatabases-helloworld-kubernetes-examples.git

Después de clonar la rama, seleccione el directorio adecuado para la base de datos que desea probar. Cada base de datos tiene su propia copia de estas instrucciones sobre cómo suministrar y desplegar una base de datos o cola de mensajes y una aplicación en IBM Cloud Kubernetes Service.

Ejecución en IBM Cloud

  1. Si todavía no tiene una cuenta de IBM Cloud, regístrese aquí.

  2. Descargue e instale la CLI de IBM Cloud. La herramienta de CLI de IBM Cloud le permite comunicarse con IBM Cloud desde la consola o la CLI.

  3. Instalar el plugin de CLI de Kubernetes Service y el plugin de CLI de Container Registry

    ibmcloud plugin install container-service
    ibmcloud plugin install container-registry
    

    Para verificar su instalación, ejecute

    ibmcloud plugin list
    

    Recibirá una respuesta como esta:

    Listing installed plug-ins...
    
    Plugin Name                            Version   Status
    container-registry                     0.1.382
    container-service/kubernetes-service   0.3.34
    
  4. Descargue e instale la CLI de Kubernetes.

    Siga las instrucciones para descargar e instalar la CLI de Kubernetes para la plataforma que está utilizando.

  5. Conéctese a IBM Cloud en la herramienta de CLI y siga las indicaciones para iniciar la sesión.

    ibmcloud login
    

    Si tiene un ID de usuario federado, utilice el mandato ibmcloud login --sso para iniciar sesión con su ID de inicio de sesión único.

Creación de la base de datos

Este proceso crea una instancia de base de datos estándar en el servicio que especifique que puede incurrir en cargos adicionales en el plan seleccionado.

  1. Debe elegir como destino un grupo de recursos utilizando el mandato siguiente:

    ibmcloud target -g <RESOURCE_GROUP>
    

Para obtener más información, consulte Cómo trabajar con recursos y grupos de recursos (recurso ibmcloud).

  1. La base de datos se puede crear desde la CLI utilizando el mandato ibmcloud resource service-instance-create. El mandato toma un nombre de instancia de servicio, un nombre de servicio, un nombre de plan y una ubicación.

  2. El nombre del servicio es uno de los Cloud Databases siguientes: databases-for-elasticsearch, databases-for-mongodb, databases-for-postgresql, databases-for-redis, messages-for-rabbitmq, o databases-for-mysql.

    ibmcloud resource service-instance-create <INSTANCE_NAME> <SERVICE_NAME> standard <REGION>
    

Recuerde el nombre de la instancia de la base de datos. Busque aquí el identificador de región.

El ejemplo anterior aprovisiona una instancia de Shared Compute. Para más información, consulte el resumen de modelos de alojamiento.

Configuración de la app de Kubernetes

  1. Cree un Kubernetes Service. Elija la ubicación y el grupo de recursos en el que desea configurar el clúster. Seleccione el tipo de clúster que desea utilizar. Este ejemplo solo necesita el plan lite, que viene con un nodo de trabajador. Después de suministrar un clúster, se le proporciona una lista de pasos para acceder al clúster y establecer las variables de entorno en la pestaña Acceso. También puede verificar que el despliegue se ha suministrado y se está ejecutando normalmente.

  2. Asegúrese de que elegir como destino el grupo de recursos de IBM Cloud correcto de Kubernetes Service.

    Si el nombre del grupo de recursos no es default, utilice el mandato siguiente para elegir como destino el grupo de recursos de clúster:

    ibmcloud target -g <RESOURCE_GROUP_NAME>
    

    Este ejemplo utiliza el grupo de recursos default.

  3. Cree su propio repositorio de imágenes privadas en Container Registry para almacenar la imagen de Docker de la aplicación. Puesto que queremos que las imágenes sean privadas, tenemos que crear un espacio de nombres, que crea un URL exclusivo para el repositorio de imágenes.

    ibmcloud cr namespace-add <YOUR_NAMESPACE>
    
  4. Añada el despliegue de Cloud Databases al clúster.

    ibmcloud ks cluster service bind --cluster <YOUR_CLUSTER_NAME> --namespace default    --service <INSTANCE_NAME_OR_CRN>
    

    El espacio de nombres "default" hace referencia a la instancia de Kubernetes y no al espacio de nombres del almacén de imágenes creado por el usuario. Del mismo modo, si la base de datos utiliza puntos finales públicos y privados, el punto final público se utiliza de forma predeterminada. Por lo tanto, si desea seleccionar el punto final privado, primero debe crear una clave de servicio para la base de datos para que Kubernetes pueda utilizarlo al enlazar con la base de datos. Puede configurar una clave de servicio con el siguiente mandato:

    ibmcloud resource service-key-create <YOUR-PRIVATE-KEY> --instance-name    <INSTANCE_NAME_OR_CRN> --service-endpoint private  
    

    El punto final de servicio privado se selecciona con --service-endpoint private. Después, enlace la base de datos al clúster de Kubernetes a través del punto final privado utilizando el mandato

    ibmcloud ks cluster service bind <YOUR_CLUSTER_NAME> default    <INSTANCE_NAME_OR_CRN> --key <YOUR-PRIVATE-KEY>
    
  5. Verifique que el secreto de Kubernetes se ha creado en el espacio de nombres del clúster. Kubernetes utiliza secretos para almacenar información confidencial, como la clave de API de IBM Cloud Identity and Access Management (IAM) y el URL que utiliza el contenedor para obtener acceso. Para establecer el clúster como contexto para esta sesión y luego obtener la clave de API para acceder a la instancia del despliegue, ejecute los mandatos siguientes

    ibmcloud ks cluster config --cluster <CLUSTER_NAME_OR_ID>
    

    Haga lo siguiente

    kubectl get secrets --namespace=default
    

    Guarde el nombre del secreto que se ha generado al enlazar your_database_name al servicio Kubernetes.

  6. Si aún no lo ha hecho, clone la app en uno de los lenguajes disponibles en el entorno local desde la consola con el siguiente mandato

    git clone -b <LANGUAGE> git@github.com:IBM-Cloud/clouddatabases-helloworld-kubernetes-examples.git
    
  7. Vaya (cd) al directorio que acaba de crear y vaya (cd) a la carpeta de la base de datos. El código para conectarse al servicio y leer y actualizar la base de datos se encuentra en server.js. Consulte Estructura de código y los comentarios del código para obtener información sobre las funciones de la app. Un directorio public contiene html, hojas de estilo y JavaScript para la aplicación web. Sin embargo, para que la aplicación funcione, primero hay que enviar la imagen Docker de esta aplicación a nuestro Container Registry.

  8. Cree y envíe la imagen de Docker de la aplicación a Container Registry. Especifique la región adecuada y asigne un nombre al contenedor.

    ibmcloud cr build -t <REGION>.icr.io/<NAMESPACE>/<CONTAINER_NAME> .
    

    Puede ver la imagen en el registro de contenedor utilizando

    ibmcloud cr images
    

    La respuesta obtenida será parecida a la siguiente

    REPOSITORY                                TAG      DIGEST        NAMESPACE   CREATED       SIZE    SECURITY STATUS
    <region>.icr.io/mynamespace/container_name latest   81c3959ea657  mynamespace 4 hours ago   28 MB   No Issues
    
  9. Actualice el archivo de configuración de despliegue de Kubernetes clouddb-deployment.yaml.

    Cambie el nombre de image por el nombre de repositorio que ha obtenido del paso anterior:

    image: "<REGION>.icr.io/mynamespace/<container_name>" # Edit me
    

    Ahora, bajo secretKeyRef, cambie el nombre de <db-secret-name> para que coincida con el nombre del secreto que se ha creado al enlazar el despliegue de la base de datos al clúster de Kubernetes.

    secretKeyRef:
       name: <DB-SECRET-NAME> # Edit me
    

    En cuanto a la configuración de service al final del archivo, nodePort indica el puerto desde el que se puede acceder a la aplicación. Puede utilizar los puertos comprendidos entre 30000 y 32767, pero elija el 30081. El puerto TCP se establece en 8080, que es el puerto en el que se ejecuta la aplicación Node.js en el contenedor.

Despliegue de la app de Kubernetes

  1. Despliegue la aplicación en Kubernetes Service. Cuando se despliega la aplicación, se enlaza automáticamente al clúster de Kubernetes.

    kubectl apply -f clouddb-deployment.yaml
    
  2. Obtenga la IP correspondiente a la aplicación.

    ibmcloud ks workers -c <CLUSTER_NAME>
    

    El resultado se parecerá al siguiente:

    ID                                                 Public IP        PrivateIP      Machine Type   State    Status   Zone    Version
    kube-hou02-pa1a59e9fd92f44af9b4147a27a31db5c4-w1   199.199.99.999   10.76202.188   free           normal   Ready    hou02   1.10.11_1536
    

    Ahora puede acceder a la aplicación desde la IP pública desde el puerto 30082.

    La aplicación clouddatabases-helloworld muestra el contenido de una base de datos examples. Para demostrar que la app está conectada al servicio, añada algunas palabras a la base de datos. Las palabras se muestran a medida que las añade; las últimas palabras añadidas se muestran en primer lugar.

Estructura del código

Estructura del código
Archivo Descripción
server.js Establece una conexión con la base de datos utilizando credenciales desde BINDING (el nombre que hemos creado en el archivo de despliegue de Kubernetes para visualizar las credenciales) y maneja las operaciones de creación y lectura en la base de datos.
main.js Maneja la entrada de usuario para un mandato PUT y analiza los resultados de un mandato GET para generar el contenido de la base de datos.

La app utiliza una operación PUT y GET:

  • PUT

    • Toma la entrada de usuario de main.js.
    • Añade la entrada de usuario a la base de datos.
  • GET

    • Recupera el contenido de la base de datos.
    • Devuelve la respuesta del mandato de base de datos a main.js.