Overview

Skill Level: Intermediate

Mediante un tutorial paso a paso usaremos una imagen previamente creada de una aplicación NodeJs (https://ibm.co/2HlbSWX) que accesa a Mongo y usaremos Kubernetes para tener primero un pod con MongoDb y después un pod con la app #DevelopersIBMmx

Ingredients

·       Cuenta de IBM Cloud Activa (https://console.bluemix.net)

·       Editor de código(https://code.visualstudio.com/download)

·       Node.Js(https://nodejs.org/en)

·       Bx CLI (https://console.bluemix.net/docs/cli/reference/bluemix_cli/download_cli.html)

·       Docker(https://docs.docker.com/install/)

·       Kubectl (https://kubernetes-v1-4.github.io/docs/user-guide/prereqs/)

·       Aplicacion Node.Js (http://github.com/isaaccarrada/kubernetes_nodejs_mongo) (Nota:los archivos que creamos están dentro de la carpeta kubernetes) 

·       Idealmente (pero no necesariamente) la parte 1 del tutorial: (https://developer.ibm.com/recipes/tutorials/docker-creacion-de-una- imagen-nodejs-y-realizar-un-push-al-ibm-container-registry/)

Step-by-step

  1. Crear un cluster

    Para crear un cluster realizamos el siguiente comando:

    $ bx cs cluster-create --name <name-of-cluster>

    Hacemos login a IBM Cloud:

    $ bx login 

    Corremos el siguiente comando para ver si nuestro cluster esta en un estado ‚ÄúNormal‚ÄĚ

    $ bx cs clusters

    Corremos el siguiente comando para ver que nuestros workers est√©n en un estado ‚Äúnormal‚ÄĚ con un estatus ‚Äúready‚ÄĚ

    bx cs workers <yourclustername>

    Capture 

    Tomamos nota de nuestra IP P√ļblica (En mi caso 184.172.234.189)

  2. Configuración de kubectl

    En nuestra línea de comandos corremos el siguiente comando: 

    bx cs cluster-config <yourclustername>

    Debería regresar una línea semejante a la siguiente:

    SET KUBECONFIG=C:\Users\IsaacYaelCarradaPalm\.bluemix\plugins\container-service\clusters\Track10\kube-config-hou02-Track10.yml 

    Corremos esta línea, estamos dirigiendo nuestra variable de ambiente hacia el archivo que bajó de nuestra configuración del cluster. Nota: recordar que para usar kubectl siempre tenemos que correr estos dos comandos

    Para verificar que kubectl est√° bien configurado:

    • Corremos kubectl cluster-info esto deber√≠a regresarnos a que direcci√≥n IP est√° apuntando nuestro kubernetes master
    • Corremos kubectl cluster-info dump este comando deber√≠a regresarnos un dump de toda la informaci√≥n de nuestro cluster

    Troubleshooting

    En caso de que alguno de estos dos comandos no funcione debemos reconfigurar el kubectl con los siguientes pasos:

    • $ bx logout
    • $ bx login
    • $ bx cs region-set us-south
    • $ bx cs cluster-config <yourclustername>
    • Ejecutamos la l√≠nea que regresa el √ļltimo comando (SET KUBECONFIG=C:‚Ķ..)
    • $ kubectl cluster-info
    • $ kubectl cluster-info dump

    Una vez que kubectl cluster info-dump contesta tenemos configurado correctamente kubectl, si en cualquier momento el comando nos regresa un error concerniente a que nuestro request no obtuvo respuesta volvemos a realizar los pasos del troubleshooting.

  3. Creación del archivo de configuración yaml del servicio y deployment de mongo

    Para este punto debemos estar dentro de la carpeta del proyecto que bajamos de github. Para hacer la configuración de mongo utilizaremos una imagen que está disponible para nosotros en DockerHub.

    Crearemos un archivo de nombre mongo.yaml en este directorio con la siguiente información:

    apiVersion: v1
    kind: Service
    metadata:
      name: mongo
      labels:
        run: mongo
    spec:
      ports:
      - port: 27017
        targetPort: 27017
        protocol: TCP
      selector:
        run: mongo
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: mongo
    spec:
      template:
        metadata:
          labels:
            run: mongo
        spec:
          containers:
          - name: mongo
            image: mongo
            ports:
            - containerPort: 27017

    Tener cuidado con la identación, debe ser de dos espacios por cada identación. Recorramos los puntos importantes del archivo:

    • Primero estamos configurando el servicio con un nombre de mongo y estamos especificando que corra el deployment mongo.
    • Especificamos el puerto del servicio (27017) que es con el cual nuestra aplicaci√≥n NodeJs acceder√° a nuestro pod de mongo
    • Despues estamos configurando el deployment de igual forma con un nombre de mongo
    • En la imagen ponemos simplemente mongo, este bajar√° la imagen de mongo en Docker Hub y hara el deployment de la misma

    Una vez que tenemos el archivo ejecutamos el comando kubectl create -f mongo.yaml para que se creen tanto el servicio como el deployment.

    Ejecutamos posteriormente el comando kubectl get svc Deberíamos de tener un output como el siguiente:

    lol2

    Confirmamos que el pod está en ejecución con el siguiente comando: kubectl get pods

    Deberíamos tener un output como el siguiente:

    Capture2

     

     

  4. Creación del archivo de configuración yaml del servicio y deployment de Node

    En la carpeta de nuestra aplicación node creamos un archivo llamado employee.yaml. El cual llenamos con:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-emp
      labels:
        run: my-emp
    spec:
      ports:
      - port: 80
        targetPort: 3000
        protocol: TCP
      type: NodePort
      selector:
        run: my-emp
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: my-emp
    spec:
      replicas:
      template:
        metadata:
          labels:
            run: my-emp
        spec:
          containers:
          - name: my-emp
            image: registry.ng.bluemix.net/<namespace>/my-emp
            ports:
            - containerPort: 3000

    Veamos lo importante de este yaml:

    • containerPort debe ser igual a el puerto en el cual expusimos nuestra aplicaci√≥n Node
    • en image va la direcci√≥n al repositorio en el cual hicimos el push de nuestra imagen en el container registry (en caso de no haber hecho el push usar isaaccarrada/my-emp para jalar la imagen de un repositorio en Docker Hub)
    • En el servicio este puerto es el que vamos a exponer para que se pueda acceder a este pod desde afuera
  5. Notas importantes para la aplicación

    Para la aplicación utilizamos el siguiente Dockerfile:

    FROM node:latest
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    COPY package.json /usr/src/app/
    RUN npm install
    RUN npm i -s nodemon
    COPY . /usr/src/app
    EXPOSE 3000
    ENV PORT=3000
    ENV MONGO_SERVICE_HOST=mongo
    ENV MONGO_SERVICE_PORT=27017
    CMD [ "npm", "start" ]

    En este dockerfile el EXPOSE es el puerto que utilizaremos para acceder a nuestra aplicación que es el mismo que irá en el deployment, la variable de ambiente MONGO_SERVICE_HOST debe tener el nombre de la imagen en el pod al que se comunicará la aplicación asi como el PORT es el que utilizamos en el mongo.yaml para hacer deploy de la imagen.

     

  6. Deployment de employee.yaml

    Ejecutamos el comando kubectl create -f mongo.yaml y deberíamos obtener algo semejante:

    service "my-emp" created

    deployment "my-emp" created

    Posteriormente para identificar que todo sucedió correctamente corremos kubectl get pods:

    kubectlgetpods

    Aqui notamos que nuestro deployment est√° funcionando, para comprobar que nuestro servicio esta funcionando corremos kubectl get svc

    kubectlgetsvc

    Tomamos nota del puerto de my-emp (En mi caso 32353)

    Una vez que sabemos que esta funcionando usamos bx cs workers <clusterName> Esto nos devolver√° algo semejante a:

    bx-cs-workers

    Tomamos nota de la direcci√≥n p√ļblica (En mi caso 184.172.234.189)

    Accedemos a este servicio con la ip publica (184.172.234.189) y el puerto (32353)

    En mi caso sería 184.172.234.189:32353

    (Basado en el tutorial https://developer.ibm.com/recipes/tutorials/kubernetes-how-to-run-a-node-js-application-which-accesses-mongo-database-where-both-are-running-in-containers-in-different-pods/)

Join The Discussion