En este instructivo, se muestra cómo implementar una aplicación web en contenedores en un clúster de Google Kubernetes Engine (GKE).
Esta página está dirigida a operadores y desarrolladores que aprovisionan y configuran recursos de la nube, y que implementan apps y servicios. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que se hace referencia en el contenido de Google Cloud, consulta Roles y tareas comunes de los usuarios de GKE.
Antes de leer esta página, asegúrate de estar familiarizado con Kubernetes.
Crea un repositorio
En este instructivo, almacenarás una imagen en Artifact Registry y la implementarás desde el registro. En esta guía de inicio rápido, crearás un repositorio llamado hello-repo.
Establece la variable de entorno
PROJECT_IDen tu ID del proyectoGoogle Cloud (PROJECT_ID). Usarás esta variable de entorno cuando compiles la imagen de contenedor y la envíes a tu repositorio.export PROJECT_ID=PROJECT_IDConfirma que la variable de entorno
PROJECT_IDtenga el valor correcto:echo $PROJECT_IDConfigura el ID del proyecto para Google Cloud CLI:
gcloud config set project $PROJECT_IDResultado:
Updated property [core/project].Crea el repositorio
hello-repocon el siguiente comando:gcloud artifacts repositories create hello-repo \ --repository-format=docker \ --location=REGION \ --description="Docker repository"Reemplaza
REGIONpor una región para el repositorio, comous-west1. Para ver una lista de las ubicaciones disponibles, ejecuta el siguiente comando:gcloud artifacts locations list
Compila la imagen de Docker de hello-app
En este instructivo, implementarás una aplicación web de muestra llamada hello-app, un servidor web escrito en Go que responde a todas las solicitudes con el mensaje Hello, World! en el puerto 8080.
GKE acepta imágenes de Docker como el formato de implementación de la aplicación.
Antes de implementar hello-app en GKE, debes empaquetar el código fuente de hello-app como una imagen de Docker.
Para compilar una imagen de Docker, necesitas un código fuente y un Dockerfile. Un Dockerfile contiene instrucciones para compilar la imagen.
Descarga el código fuente de
hello-appy el Dockerfile mediante la ejecución de los siguientes comandos:git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/quickstarts/hello-appCompila y etiqueta la imagen de Docker para
hello-app:docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 .Con este comando, se le indica a Docker que compile la imagen mediante el
Dockerfileen el directorio actual, que la guarde en tu entorno local y la etiquete con un nombre, comous-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1. La imagen se envía a Artifact Registry en la siguiente sección.- La variable
PROJECT_IDasocia la imagen de contenedor con el repositoriohello-repoen tu proyecto Google Cloud . - El prefijo
us-west1-docker.pkg.devhace referencia a Artifact Registry, el host regional de tu repositorio.
- La variable
Ejecuta el comando
docker imagesa fin de verificar que la compilación se realizó de forma correcta:docker imagesResultado:
REPOSITORY TAG IMAGE ID CREATED SIZE us-west1-docker.pkg.dev/my-project/hello-repo/hello-app v1 25cfadb1bf28 10 seconds ago 54 MBAgrega vinculaciones de políticas de IAM a tu cuenta de servicio:
gcloud artifacts repositories add-iam-policy-binding hello-repo \ --location=REGION \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role="roles/artifactregistry.reader"Reemplaza
PROJECT_NUMBERpor el número de proyecto de tu proyecto.
Ejecuta tu contenedor de Docker de forma local (opcional)
Prueba tu imagen de contenedor mediante el motor de Docker local:
docker run --rm -p 8080:8080 REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1Haz clic en el botón Vista previa en la Web
y selecciona el número de puerto
8080. GKE abre la URL de vista previa en su servicio de proxy en una nueva ventana del navegador.
Envía tu imagen de Docker a Artifact Registry
Debes subir la imagen de contenedor a un registro para que tu clúster de GKE pueda descargarla y ejecutarla. En este instructivo, almacenarás tu contenedor en Artifact Registry.
Configura la herramienta de línea de comandos de Docker para que se autentique en Container Registry:
gcloud auth configure-docker REGION-docker.pkg.devEnvía la imagen de Docker que acabas de compilar al repositorio:
docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
Crea un clúster de GKE
Ahora que la imagen de Docker está almacenada en Container Registry, crea un clúster de GKE para ejecutar hello-app. Un clúster de GKE consiste en un grupo de instancias de VM de Compute Engine que ejecutan Kubernetes, el sistema de organización de clústeres de código abierto que se usa en GKE.
Cloud Shell
Configura tu región de Compute Engine:
gcloud config set compute/region REGIONPara los clústeres zonales estándar, establece una zona de Compute Engine más cercana al repositorio de Artifact Registry.
Crea un clúster llamado
hello-cluster:gcloud container clusters create-auto hello-clusterLa creación de tu clúster de GKE y la verificación de su estado toma unos minutos. Para ejecutar este instructivo en un clúster de GKE Standard, usa el comando
gcloud container clusters createen su lugar.
Console
En la consola de Google Cloud , ve a la página Crea un clúster de Autopilot.
En el campo Nombre, ingresa el nombre
hello-cluster.Selecciona una región de Compute Engine de la lista desplegable Región, como
us-west1.Haz clic en Crear.
Espera a que se cree el clúster. Cuando el clúster está listo, aparece una marca de verificación junto al nombre del clúster.
Implementa el hello-app en GKE
Ya estás listo para implementar la imagen de Docker que compilaste en el clúster de GKE.
Kubernetes representa las aplicaciones como Pods, que son unidades escalables que contienen uno o más contenedores. Un Pod es la unidad más pequeña que se puede implementar en Kubernetes. Por lo general, implementas los Pods como un conjunto de réplicas que se pueden escalar y distribuir juntas en el clúster. Una forma de implementar un conjunto de réplicas es mediante una implementación de Kubernetes.
En esta sección, crearás una implementación de Kubernetes para ejecutar hello-app en tu clúster. Esta implementación tiene réplicas (Pods). Un pod de implementación contiene solo un contenedor: la imagen de Docker hello-app.
También crearás un recurso HorizontalPodAutoscaler que escale la cantidad de pods de 3 a un número entre 1 y 5 según la carga de la CPU.
Cloud Shell
Asegúrate de estar conectado a tu clúster de GKE.
gcloud container clusters get-credentials hello-clusterCrea una implementación de Kubernetes para la imagen de Docker de
hello-app.kubectl create deployment hello-app --image=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1Establece en 3 el número del modelo de referencia de las réplicas de la implementación.
kubectl scale deployment hello-app --replicas=3Crea un recurso
HorizontalPodAutoscalerpara la implementación.kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5Para ver los Pods creados, ejecuta el siguiente comando:
kubectl get podsResultado:
NAME READY STATUS RESTARTS AGE hello-app-784d7569bc-hgmpx 1/1 Running 0 90s hello-app-784d7569bc-jfkz5 1/1 Running 0 90s hello-app-784d7569bc-mnrrl 1/1 Running 0 95s
Console
Accede a la página Cargas de trabajo de la consola de Google Cloud .
Haz clic en add_box Implementar.
En la sección Especificar contenedor, selecciona Imagen de contenedor existente.
En el campo Ruta de acceso a la imagen, haz clic en Seleccionar.
En el panel Seleccionar imagen del contenedor, selecciona la imagen
hello-appque enviaste a Artifact Registry y haz clic en Seleccionar.En la sección Contenedor, haz clic en Listo y, luego, en Continuar.
En la sección Configuración, en Etiquetas, ingresa
appen Clave yhello-appen Valor.En YAML de configuración, haz clic en Ver YAML. De esta forma, se abrirá un archivo de configuración YAML que representa los dos recursos de la API de Kubernetes que se están por implementar en el clúster: una implementación y un
HorizontalPodAutoscalerpara la implementación.Haz clic en Cerrar y, luego, en Implementar.
Cuando los pods de implementación estén listos, se abrirá la página Detalles de la implementación.
En Pods administrados, ten en cuenta los tres pods en ejecución para la implementación
hello-app.
Expón la app a Internet
Si bien los Pods tienen direcciones IP asignadas de forma individual, solo se puede acceder a estas desde el interior del clúster. Además, los pods de GKE están diseñados para ser efímeros y para iniciarse o detenerse según las necesidades de escalamiento. Cuando un Pod falla debido a un error, GKE volverá a implementarlo de forma automática y le asignará una dirección IP nueva cada vez que esto suceda.
Esto significa que, en cualquier implementación, el conjunto de direcciones IP correspondiente al conjunto activo de Pods es dinámico. Necesitamos una forma de: 1) agrupar los Pods en un nombre de host estático y 2) exponer un grupo de Pods fuera del clúster a la Internet.
Los Servicios de Kubernetes resuelven estos dos problemas.
Los servicios agrupan los Pods en una dirección IP estática, a la que se puede acceder desde cualquier Pod dentro del clúster.
GKE también asigna un nombre de host de DNS a esa IP estática. Por ejemplo, hello-app.default.svc.cluster.local.
El tipo de servicio predeterminado en GKE se llama ClusterIP. En este tipo, el servicio obtiene una dirección IP a la que solo se puede acceder desde interior del clúster.
Para exponer un servicio de Kubernetes fuera del clúster, debes crear un servicio de tipo LoadBalancer.
Este tipo de servicio genera una IP del balanceador de cargas externo para un conjunto de Pods, a la que se puede acceder a través de Internet.
En esta sección, debes exponer la implementación hello-app a Internet mediante un servicio de tipo LoadBalancer.
Cloud Shell
Usa el comando
kubectl exposea fin de generar un servicio de Kubernetes para la implementación dehello-app.kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080Aquí, la marca
--portespecifica el número de puerto configurado en el balanceador de cargas y la marca--target-portespecifica el número de puerto en el que escucha el contenedor dehello-app.Ejecuta el siguiente comando con el fin de obtener los detalles del servicio para
hello-app-service.kubectl get serviceResultado:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-app-service 10.3.251.122 203.0.113.0 80:30877/TCP 10sCopia la dirección
EXTERNAL_IPen el portapapeles (por ejemplo,203.0.113.0).
Console
Accede a la página Cargas de trabajo de la consola de Google Cloud .
Haz clic en hello-app.
En la página Detalles de la implementación, haz clic en list Acciones > Exponer.
En el cuadro de diálogo Exponer, configura el Puerto de destino como
8080. Este es el puerto en el que escucha el contenedor dehello-app.En la lista desplegable Tipo de servicio, selecciona Balanceador de cargas.
Haz clic en Exponer a fin de crear un servicio de Kubernetes para
hello-app.Cuando el balanceador de cargas esté listo, se abrirá la página Detalles del servicio.
Desplázate hacia abajo hasta el campo Extremos externos y copia la dirección IP.
Ahora que los Pods de hello-app están expuestos a la Internet a través de un servicio de Kubernetes, puedes abrir una pestaña nueva del navegador y navegar a la dirección IP del servicio que copiaste en el portapapeles. Aparecerá un mensaje Hello, World!, junto con un campo Hostname. El Hostname corresponde a uno de los tres Pods de hello-app que entregan la solicitud HTTP al navegador.
Implementa una versión nueva de hello-app
En esta sección, deberás actualizar hello-app a una versión nueva mediante la compilación y la implementación de una imagen de Docker nueva en el clúster de GKE.
La actualización progresiva de Kubernetes te permite actualizar tus objetos Deployment sin tiempo de inactividad. Durante una actualización progresiva, el clúster de GKE reemplaza de forma incremental los Pods de hello-app existentes por Pods que contengan la imagen de Docker de la versión nueva.
Durante la actualización, el servicio del balanceador de cargas enruta el tráfico solo a los Pods disponibles.
Regresa a Cloud Shell, donde clonaste el código fuente de hello-app y el Dockerfile. Actualiza la función
hello()en el archivomain.gopara informar la versión nueva2.0.0.Compila y etiqueta una nueva imagen de Docker de
hello-app.docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 .Envía la imagen a Artifact Registry
docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
Ya estás listo para actualizar la implementación de Kubernetes de hello-app con el fin de usar una imagen de Docker nueva.
Cloud Shell
Aplica una actualización progresiva a la Deployment de
hello-appexistente con una actualización de imagen mediante el comandokubectl set image:kubectl set image deployment/hello-app hello-app=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2Mira cómo finalizan los Pods en ejecución que ejecutan la imagen
v1y cómo inician los Pods nuevos que ejecutan la imagenv2.watch kubectl get podsResultado:
NAME READY STATUS RESTARTS AGE hello-app-89dc45f48-5bzqp 1/1 Running 0 2m42s hello-app-89dc45f48-scm66 1/1 Running 0 2m40sEn una pestaña diferente, vuelve a navegar a la IP externa
hello-app-service. Ahora deberías ver laVersionconfigurada como2.0.0..
Console
Accede a la página Cargas de trabajo de la consola de Google Cloud .
Haz clic en hello-app.
En la página Detalles de la implementación, haz clic en listAcciones > Actualización progresiva.
En el cuadro de diálogo Actualización progresiva, establece el campo Imagen de hello-app en
REGION-docker.pkg.dev/PROJECT_ID/hello-repo/hello-app:v2.Haz clic en Actualizar.
En la página Detalles de la implementación, inspecciona la sección Revisiones activas. Ahora deberías ver dos revisiones: 1 y 2. La revisión 1 corresponde a la implementación inicial que creaste antes. La revisión 2 es la actualización progresiva que acabas de iniciar.
Después de unos momentos, actualiza la página. En Pods administrados, todas las réplicas de
hello-appahora corresponden a la revisión 2.En otra pestaña, navega nuevamente a la dirección IP del servicio que copiaste. El
Versiondebe ser2.0.0..