arrow_back

Hello Node Kubernetes

Unirse Acceder
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Hello Node Kubernetes

Lab 1 hora universal_currency_alt 5 créditos show_chart Intermedio
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP005

Labs de autoaprendizaje de Google Cloud

Descripción general

El objetivo de este lab práctico es que convierta el código que desarrolló en una aplicación replicada que se ejecute en Kubernetes y en Kubernetes Engine. Para este lab, el código será una simple aplicación node.js Hello World.

A continuación, encontrará un diagrama de las diversas piezas en juego en este lab, a fin de ayudarlo a comprender de qué manera las piezas encajan entre sí. Úselo como referencia a medida que avanza en el lab. Todo tendría que cobrar sentido cuando llegue al final (pero puede ignorarlo por el momento).

ba830277f2d92e04.png

Kubernetes es un proyecto de código abierto (disponible en kubernetes.io) que se puede ejecutar en distintos entornos, desde laptops hasta clústeres de múltiples nodos de alta disponibilidad, desde nubes públicas hasta implementaciones locales, desde máquinas virtuales hasta equipos físicos.

Para cumplir con el objetivo de este lab, utilizar un entorno administrado como Kubernetes Engine (una versión de Kubernetes alojada en Google que se ejecuta en Compute Engine) le permitirá enfocarse más en la experimentación de Kubernetes que en la configuración de la infraestructura subyacente.

Actividades

  • Crear un servidor Node.js

  • Crear una imagen de contenedor de Docker

  • Crear un clúster de contenedor

  • Crear un pod de Kubernetes

  • Escalar verticalmente sus servicios

Requisitos previos

  • Se recomienda estar familiarizado con editores de texto estándares de Linux, como vim, emacs o nano.

Incentivamos a los estudiantes a que escriban los comandos ellos mismos para así fomentar el aprendizaje de los conceptos básicos. Varios labs incluyen un bloque de código que contiene los comandos obligatorios. Durante el lab, puede copiar y pegar fácilmente los comandos del bloque de código en los lugares apropiados.

Configuración

Antes de hacer clic en el botón Comenzar lab

Lee estas instrucciones. Los labs son cronometrados y no se pueden pausar. El cronómetro, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.

Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.

Para completar este lab, necesitarás lo siguiente:

  • Acceso a un navegador de Internet estándar (se recomienda el navegador Chrome)
Nota: Usa una ventana de navegador privada o de Incógnito para ejecutar este lab. Así evitarás cualquier conflicto entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.
  • Tiempo para completar el lab: Recuerda que, una vez que comienzas un lab, no puedes pausarlo.
Nota: Si ya tienes un proyecto o una cuenta personal de Google Cloud, no los uses en este lab para evitar cargos adicionales en tu cuenta.

Cómo iniciar su lab y acceder a la consola de Google Cloud

  1. Haga clic en el botón Comenzar lab. Si debe pagar por el lab, se abrirá una ventana emergente para que seleccione su forma de pago. A la izquierda, se encuentra el panel Detalles del lab que tiene estos elementos:

    • El botón Abrir la consola de Google
    • Tiempo restante
    • Las credenciales temporales que debe usar para el lab
    • Otra información para completar el lab, si es necesaria
  2. Haga clic en Abrir la consola de Google. El lab inicia recursos y abre otra pestaña en la que se muestra la página de acceso.

    Sugerencia: Ordene las pestañas en ventanas separadas, una junto a la otra.

    Nota: Si ve el diálogo Elegir una cuenta, haga clic en Usar otra cuenta.
  3. Si es necesario, copie el nombre de usuario del panel Detalles del lab y péguelo en el cuadro de diálogo Acceder. Haga clic en Siguiente.

  4. Copie la contraseña del panel Detalles del lab y péguela en el cuadro de diálogo de bienvenida. Haga clic en Siguiente.

    Importante: Debe usar las credenciales del panel de la izquierda. No use sus credenciales de Google Cloud Skills Boost. Nota: Usar su propia Cuenta de Google podría generar cargos adicionales.
  5. Haga clic para avanzar por las páginas siguientes:

    • Acepte los términos y condiciones.
    • No agregue opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
    • No se registre para obtener pruebas gratuitas.

Después de un momento, se abrirá la consola de Cloud en esta pestaña.

Nota: Para ver el menú con una lista de los productos y servicios de Google Cloud, haga clic en el Menú de navegación que se encuentra en la parte superior izquierda de la pantalla. Ícono del menú de navegación

Activa Cloud Shell

Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud. Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.

  1. Haz clic en Activar Cloud Shell Ícono de Activar Cloud Shell en la parte superior de la consola de Google Cloud.

Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu PROJECT_ID. El resultado contiene una línea que declara el PROJECT_ID para esta sesión:

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con la función de autocompletado con tabulador.

  1. Puedes solicitar el nombre de la cuenta activa con este comando (opcional):
gcloud auth list
  1. Haz clic en Autorizar.

  2. Ahora, el resultado debería verse de la siguiente manera:

Resultado:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. Puedes solicitar el ID del proyecto con este comando (opcional):
gcloud config list project

Resultado:

[core] project = <project_ID>

Resultado de ejemplo:

[core] project = qwiklabs-gcp-44776a13dea667a6 Nota: Para obtener toda la documentación de gcloud, consulta la guía con la descripción general de gcloud CLI en Google Cloud.

Cree su aplicación Node.js

Con Cloud Shell, escriba un servidor Node.js simple para implementarlo en Kubernetes Engine:

vi server.js

Inicie el editor:

i

Agregue este contenido al archivo:

var http = require('http');
var handleRequest = function(request, response) {
  response.writeHead(200);
  response.end("Hello World!");
}
var www = http.createServer(handleRequest);
www.listen(8080);

Guarde el archivo server.js: presione Esc. Luego, escriba lo siguiente:

:wq

Ya que Cloud Shell tiene instalado el ejecutable node, ejecute este comando para iniciar el servidor del nodo (el comando no muestra ningún resultado):

node server.js

Utilice la función de vista previa web incorporada de Cloud Shell para abrir una nueva pestaña del navegador y enviar una solicitud a través de un proxy a la instancia que acaba de iniciar en el puerto 8080.

bde9fe42e27656fb.png

Se abrirá una pestaña nueva en el navegador en la que se mostrarán sus resultados:

24aab6bb51533e91.png

Antes de continuar, vuelva a Cloud Shell y presione Ctrl+C para detener la ejecución del servidor del nodo.

Ahora deberá empaquetar esta aplicación en un contenedor de Docker.

Cree una imagen de contenedor de Docker

Ahora, genere un Dockerfile que describa la imagen que quiere crear. Las imágenes de contenedor de Docker pueden extenderse desde otras imágenes existentes, por lo que, para esta imagen, haremos una extensión desde una imagen de nodo existente.

vi Dockerfile

Inicie el editor.

i

Agregue este contenido:

FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js

La "receta" para la imagen de Docker hará lo siguiente:

  • Comenzará desde la imagen node que se encuentra en el hub de Docker.
  • Expondrá el puerto 8080.
  • Copiará el archivo server.js en la imagen.
  • Iniciará el servidor del nodo como ya hicimos manualmente.

Guarde este Dockerfile. Para ello, presione Esc y, luego, escriba lo siguiente:

:wq

Compile la imagen con el siguiente comando y reemplace PROJECT_ID por su ID de proyecto de GCP que se encuentra en Console y en la sección Connection Details del lab:

docker build -t gcr.io/PROJECT_ID/hello-node:v1 .

La descarga y extracción tardará un tiempo, pero puede ver las barras de progreso a medida que se compila la imagen.

Una vez finalizada, pruebe la imagen localmente con el siguiente comando que ejecutará un contenedor de Docker como un daemon en el puerto 8080 desde su imagen de contenedor compilada recientemente (reemplace PROJECT_ID por el ID del proyecto de GCP que se encuentra en Console y en la sección Connection Details del lab):

docker run -d -p 8080:8080 gcr.io/PROJECT_ID/hello-node:v1

El resultado debería ser similar a este:

325301e6b2bffd1d0049c621866831316d653c0b25a496d04ce0ec6854cb7998

Puede usar la función de vista previa web de Cloud Shell para ver los resultados:

bde9fe42e27656fb.png

O utilice curl desde la ventana de Cloud Shell:

curl http://localhost:8080

Este es el resultado que debería ver:

Hello World!

A continuación, detenga el contenedor en ejecución.

Para encontrar el ID del contenedor de Docker, ejecute lo siguiente:

docker ps

El resultado debería verse así:

CONTAINER ID        IMAGE                              COMMAND
2c66d0efcbd4        gcr.io/PROJECT_ID/hello-node:v1    "/bin/sh -c 'node

Detenga el contenedor con el siguiente comando y reemplace CONTAINER ID por el valor que se obtuvo en el paso anterior:

docker stop [CONTAINER ID]

El resultado de su consola debería verse así (ID de su contenedor):

2c66d0efcbd4

Ahora que la imagen funciona como es debido, insértela en Google Container Registry, un repositorio privado para sus imágenes de Docker accesible desde sus proyectos de Google Cloud.

Ejecute el siguiente comando y reemplace PROJECT_ID por su ID de proyecto de GCP que se encuentra en Console o en la sección Connection Details del lab.

gcloud auth configure-docker
docker push gcr.io/PROJECT_ID/hello-node:v1

La inserción inicial podría tardar unos minutos en completarse. Verá las barras de progreso a medida que se completa la operación.

The push refers to a repository [gcr.io/qwiklabs-gcp-6h281a111f098/hello-node]
ba6ca48af64e: Pushed
381c97ba7dc3: Pushed
604c78617f34: Pushed
fa18e5ffd316: Pushed
0a5e2b2ddeaa: Pushed
53c779688d06: Pushed
60a0858edcd5: Pushed
b6ca02dfe5e6: Pushed
v1: digest: sha256:8a9349a355c8e06a48a1e8906652b9259bba6d594097f115060acca8e3e941a2 size: 2002

La imagen del contenedor aparecerá en Console. Seleccione el menú de navegación y, luego, Container Registry.

Kubernetes_Container_reg.png

Ahora posee una imagen de Docker disponible para todo el proyecto, a la que Kubernetes puede acceder y que puede organizar.

container_reg.png

Cree su clúster

Ahora está listo para crear su clúster de Kubernetes Engine. Un clúster consiste en un servidor de API principal de Kubernetes alojado por Google y en un conjunto de nodos trabajadores. Los nodos trabajadores son máquinas virtuales de Compute Engine.

Asegúrese de haber configurado su proyecto con gcloud (reemplace PROJECT_ID con su ID de proyecto de GCP que se encuentra en Console y en la sección Connection Details del lab):

gcloud config set project PROJECT_ID

Cree un clúster con dos nodos n1-standard-1 (esto tardará unos minutos en completarse):

gcloud container clusters create hello-world \
                --num-nodes 2 \
                --machine-type n1-standard-1 \
                --zone us-central1-a

Puede ignorar con seguridad las advertencias que aparecen cuando se construye el clúster.

El resultado de Console debería ser similar al siguiente:

Creating cluster hello-world...done.
Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-central1-a/clusters/hello-world].
kubeconfig entry generated for hello-world.
NAME         ZONE           MASTER_VERSION  MASTER_IP       MACHINE_TYPE   STATUS
hello-world  us-central1-a  1.5.7           146.148.46.124  n1-standard-1  RUNNING

Nota: También puede crear este clúster desde Console para abrir menú de navegación y seleccionar Kubernetes Engine > Clústeres > Crear clúster.

Si selecciona el menú de navegación > Kubernetes Engine, verá que ahora tiene un clúster de Kubernetes completamente funcional con la tecnología de Kubernetes Engine:

kubernetes_cluster.png

Es hora de implementar su propia aplicación en contenedores en el clúster de Kubernetes. A partir de ahora, use la línea de comandos kubectl (que ya está configurada en su entorno de Cloud Shell).

Haga clic en Verificar mi progreso a continuación para revisar su progreso en el lab.

Cree su clúster

Cree su pod

Un pod de Kubernetes es un grupo de contenedores unidos para funciones administrativas y de herramientas de redes. Puede tener uno o muchos contenedores. Aquí, deberá usar un contenedor compilado con su imagen de Node.js almacenada en su Container Registry privado. Este entregará contenido en el puerto 8080.

Cree un pod con el comando kubectl run (reemplace PROJECT_ID por su ID de proyecto de GCP que se encuentra en Console y en la sección Connection Details del lab):

kubectl create deployment hello-node \
    --image=gcr.io/PROJECT_ID/hello-node:v1

Este es el resultado que debería ver:

deployment.apps/hello-node created

Como puede ver, creó un objeto de implementación. Las implementaciones son la forma recomendada para crear y escalar pods. Aquí, una nueva implementación administra una única réplica de pod que ejecuta la imagen hello-node:v1.

Ejecute el siguiente comando para ver la implementación:

kubectl get deployments

Este es el resultado que debería ver:

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           1m36s

Para ver el pod creado por la implementación, ejecute lo siguiente:

kubectl get pods

Este es el resultado que debería ver:

NAME                         READY     STATUS    RESTARTS   AGE
hello-node-714049816-ztzrb   1/1       Running   0          6m

Ahora es un buen momento para revisar algunos comandos kubectl interesantes. Ninguno de estos cambiará el estado del clúster. La documentación completa está disponible aquí:

kubectl cluster-info
kubectl config view

Y para la solución de problemas:

kubectl get events
kubectl logs <pod-name>

Ahora debe hacer que su pod sea accesible públicamente.

Haga clic en Verificar mi progreso a continuación para revisar su progreso en el lab.

Cree su pod

Permita el tráfico externo

Según la configuración predeterminada, el pod únicamente es accesible mediante su IP interna dentro del clúster. Para hacer accesible el contenedor hello-node desde afuera de la red virtual de Kubernetes, tiene que exponer el pod como un servicio de Kubernetes.

Desde Cloud Shell, puede exponer el pod a la Internet pública con el comando kubectl expose y la marca --type="LoadBalancer". Esta marca es necesaria para la creación de una IP accesible de forma externa:

kubectl expose deployment hello-node --type="LoadBalancer" --port=8080

Este es el resultado que debería ver:

service/hello-node exposed

La marca utilizada en este comando especifica que se usará el balanceador de cargas provisto por la infraestructura subyacente (en este caso, el balanceador de cargas de Compute Engine). Tenga en cuenta que se expone directamente la implementación, no el pod. Esto hará que el servicio resultante balancee la carga de tráfico en todos los pods administrados por la implementación (en este caso, solo 1 pod, pero luego podrá agregar más réplicas).

La instancia principal de Kubernetes crea el balanceador de cargas y las reglas de reenvío de Compute Engine relacionadas, los grupos de destino y las reglas de firewall para que el servicio se vuelva completamente accesible desde el exterior de Google Cloud Platform.

Para obtener la dirección IP públicamente accesible del servicio, solicite que kubectl averigüe todos los servicios del clúster:

kubectl get services

Este es el resultado que debería ver:

NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-node   10.3.250.149   104.154.90.147   8080/TCP   1m
kubernetes   10.3.240.1     <none>           443/TCP    5m

Se mencionan 2 direcciones IP para su servicio hello-node, y ambas entregan contenido al puerto 8080. CLUSTER-IP corresponde a la IP interna que solo es visible dentro de su red virtual de Cloud, mientras que EXTERNAL-IP corresponde a la IP externa de balanceo de cargas.

Ahora debería poder acceder al servicio dirigiendo su navegador a esta dirección: http://<EXTERNAL_IP>:8080

67cfa8c674f8c708.png

Para este momento, ya hemos ganado varias funciones debido al traslado hacia los contenedores y Kubernetes No hace falta que especifiquemos en qué host hay que ejecutar nuestra carga de trabajo. Además, nos beneficiamos de la supervisión y el reinicio del servicio. Veamos qué más podemos obtener gracias a nuestra nueva infraestructura de Kubernetes.

Haga clic en Verificar mi progreso a continuación para revisar su progreso en el lab.

Cree un servicio de Kubernetes

Escale su servicio verticalmente

Una de las características avanzadas que ofrece Kubernetes es la gran facilidad para escalar su aplicación. Supongamos que, de repente, necesita más capacidad para su aplicación. Puede indicarle al controlador de replicación que administre una nueva cantidad de réplicas para su pod:

kubectl scale deployment hello-node --replicas=4

Este es el resultado que debería ver:

deployment.extensions/hello-node scaled

Puede solicitar una descripción de la implementación actualizada:

kubectl get deployment

Este es el resultado que debería ver:

NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-node   4         4         4            4           16m

posible que deba ejecutar el comando anterior hasta que vea las 4 réplicas creadas. También puede enumerar todos los pods::

kubectl get pods

Este es el resultado que debería ver:

NAME                         READY     STATUS    RESTARTS   AGE
hello-node-714049816-g4azy   1/1       Running   0          1m
hello-node-714049816-rk0u6   1/1       Running   0          1m
hello-node-714049816-sh812   1/1       Running   0          1m
hello-node-714049816-ztzrb   1/1       Running   0          16m

Aquí se usa un enfoque declarativo. En vez de iniciar o detener nuevas instancias, usted declara cuántas instancias deberían estar en ejecución constantemente. Los ciclos de conciliación de Kubernetes se aseguran de que la realidad coincida con lo que solicitó y, de ser necesario, ejecutan acciones.

Aquí tiene un diagrama que resume el estado de su clúster de Kubernetes:

587f7f0a097aaa2.png

Haga clic en Verificar mi progreso a continuación para revisar su progreso en el lab.

Escale su servicio verticalmente

Implemente una actualización en su servicio

En algún momento, la aplicación que implementó en producción requerirá la corrección de errores o funciones adicionales. Kubernetes lo ayuda a implementar una nueva versión en la producción sin afectar a sus usuarios.

En primer lugar, modifique la aplicación. Edite el archivo server.js:

vi server.js
i

Luego, actualice el mensaje de respuesta:

response.end("Hello Kubernetes World!");

Guarde el archivo server.js. Para ello, presione Esc y, luego, escriba lo siguiente:

:wq

Ahora puede compilar y publicar una nueva imagen de contenedor en el registro con una etiqueta incrementada (en este caso, v2):

Ejecute el siguiente comando y reemplace PROJECT_ID por su ID de proyecto del lab:

docker build -t gcr.io/PROJECT_ID/hello-node:v2 .
docker push gcr.io/PROJECT_ID/hello-node:v2

Kubernetes actualizará sin problemas su controlador de replicación a la nueva versión de la aplicación. Para cambiar la etiqueta de la imagen de su contenedor en ejecución, deberá editar hello-node deployment y cambiar la imagen de gcr.io/PROJECT_ID/hello-node:v1 a gcr.io/PROJECT_ID/hello-node:v2.

Para hacerlo, utilice el comando kubectl edit. Este abre un editor de texto que muestra la configuración yaml completa de la implementación. No es necesario entender toda la configuración yaml por ahora, solo basta con comprender que cuando se actualiza el campo spec.template.spec.containers.image de la configuración, le indica a la implementación que actualice los pods con la nueva imagen.

kubectl edit deployment hello-node

Busque Spec > containers > image y cambie el número de versión a v2:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: 2016-03-24T17:55:28Z
  generation: 3
  labels:
    run: hello-node
  name: hello-node
  namespace: default
  resourceVersion: "151017"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-node
  uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
  replicas: 4
  selector:
    matchLabels:
      run: hello-node
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hello-node
    spec:
      containers:
      - image: gcr.io/PROJECT_ID/hello-node:v1 ## Update this line ##
        imagePullPolicy: IfNotPresent
        name: hello-node
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30

Luego de realizar el cambio, guarde y cierre el archivo. Para ello, presione Esc y, luego, escriba lo siguiente:

:wq

Este es el resultado que debería ver:

deployment.extensions/hello-node edited

Ejecute lo siguiente para actualizar la implementación con la nueva imagen.

kubectl get deployments

Se crearán nuevos pods con la nueva imagen, y los pods anteriores se borrarán.

Este es el resultado que debería ver:

NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-node   4         4         4            4           1h

Mientras esto se aplica, los usuarios de sus servicios no deberían sufrir ninguna interrupción. Luego de un rato, comenzarán a acceder a la nueva versión de su aplicación. Puede encontrar más información sobre la implementación de actualizaciones escalonada en esta documentación.

Una vez que haya configurado su clúster de Kubernetes Engine, con estas funciones de implementación y escalamiento actualizadas, estará de acuerdo con que Kubernetes lo ayudará a enfocarse más en la aplicación que en la infraestructura.

Ponga a prueba sus conocimientos

Para poner a prueba sus conocimientos sobre Google Cloud Platform, realice nuestro cuestionario (seleccione varias opciones correctas).

Felicitaciones

De esta manera, finaliza este lab práctico con Kubernetes. Solo vimos una mínima parte de esta tecnología, por eso lo alentamos a que siga explorando con sus propios pods, con los controladores de replicación y con los servicios, y que también verifique las pruebas de vitalidad (verificaciones de estado) y considere utilizar directamente la API de Kubernetes.

Realice su próximo lab

Continúe su Quest con Administración de implementaciones con Kubernetes Engine o consulte estas sugerencias:

Próximos pasos/Más información

Capacitación y certificación de Google Cloud

Recibe la formación que necesitas para aprovechar al máximo las tecnologías de Google Cloud. Nuestras clases incluyen habilidades técnicas y recomendaciones para ayudarte a avanzar rápidamente y a seguir aprendiendo. Para que puedas realizar nuestros cursos cuando más te convenga, ofrecemos distintos tipos de capacitación de nivel básico a avanzado: a pedido, presenciales y virtuales. Las certificaciones te ayudan a validar y demostrar tus habilidades y tu conocimiento técnico respecto a las tecnologías de Google Cloud.

Última actualización del manual: 4 de diciembre de 2020
Prueba más reciente del lab: 4 de diciembre de 2020

Copyright 2024 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.