Orquestación de Contenedores Avanzada con Google Kubernetes Engine (GKE): Despliegue Robusto y Escalable
Este tutorial te guiará a través de las capacidades avanzadas de Google Kubernetes Engine (GKE) para la orquestación de contenedores. Aprenderás a configurar clústeres, desplegar aplicaciones escalables, gestionar actualizaciones y asegurar tus cargas de trabajo para construir sistemas resilientes en la nube.
Google Kubernetes Engine (GKE) es la plataforma gestionada de Kubernetes de Google Cloud, que simplifica la implementación, gestión y escalado de aplicaciones en contenedores. Al abstraer la complejidad subyacente de Kubernetes, GKE permite a los desarrolladores y operadores centrarse en sus aplicaciones, no en la infraestructura. Este tutorial te sumergirá en las funcionalidades avanzadas de GKE, desde la configuración inicial hasta estrategias de despliegue robustas y la gestión del ciclo de vida de tus clústeres.
🚀 Introducción a Google Kubernetes Engine (GKE)
Kubernetes se ha convertido en el estándar de facto para la orquestación de contenedores. Permite automatizar el despliegue, escalado y gestión de aplicaciones en contenedores. GKE lleva esto un paso más allá, proporcionando una solución completamente gestionada que se integra con el ecosistema de Google Cloud, ofreciendo características como: autoescalado, actualización automática de nodos, redes avanzadas y un sólido modelo de seguridad.
¿Por qué GKE para la Orquestación Avanzada?
La elección de GKE para orquestación avanzada se basa en varios pilares clave:
- Gestión Simplificada: Google se encarga de la capa de control de Kubernetes, lo que reduce drásticamente la carga operativa.
- Escalabilidad Automática: GKE puede escalar automáticamente tus clústeres y pods en función de la demanda, optimizando el uso de recursos y costos.
- Integración Nativas: Se integra perfectamente con otros servicios de Google Cloud como Cloud Monitoring, Cloud Logging, Cloud Load Balancing y Google Container Registry.
- Seguridad Reforzada: Ofrece características de seguridad integradas, incluyendo nodos blindados, protección contra amenazas de imagen y aislamiento de cargas de trabajo.
- Innovación Continua: GKE siempre está a la vanguardia de las últimas características y mejoras de Kubernetes.
🛠️ Configuración Inicial y Creación de un Clúster GKE
Antes de desplegar nuestras aplicaciones, necesitamos configurar un clúster GKE. Utilizaremos gcloud, la herramienta de línea de comandos de Google Cloud, para esta tarea.
Requisitos Previos
- Cuenta de Google Cloud: Asegúrate de tener una cuenta de Google Cloud activa.
- Proyecto de Google Cloud: Crea un nuevo proyecto o selecciona uno existente.
- SDK de Google Cloud: Instala el SDK de Google Cloud en tu máquina local. Esto incluye
gcloudykubectl.
gcloud init
gcloud components install kubectl
- Habilitar APIs: Habilita las APIs necesarias para GKE y Compute Engine.
gcloud services enable container.googleapis.com compute.googleapis.com
Creando un Clúster Regional
Para una alta disponibilidad, es recomendable crear clústeres regionales que distribuyan los nodos de trabajo entre múltiples zonas dentro de una región. Esto protege contra fallos zonales.
export PROJECT_ID="your-gcp-project-id"
export REGION="europe-west1"
export CLUSTER_NAME="advanced-gke-cluster"
gcloud config set project $PROJECT_ID
gcloud container clusters create $CLUSTER_NAME \
--region $REGION \
--num-nodes=1 \
--machine-type=e2-medium \
--image-type=COS_CONTAINERD \
--release-channel=regular \
--enable-autoscaling --min-nodes=1 --max-nodes=3 \
--enable-network-policy \
--no-enable-basic-auth \
--no-issue-client-certificate \
--enable-ip-alias \
--create-subnetwork name=gke-subnet-01,range=/20,stack-type=IPV4_ONLY \
--metadata disable-legacy-endpoints=true
Este comando crea un clúster GKE con las siguientes características:
--region: Despliega el clúster en una región específica para mayor disponibilidad.--num-nodes=1: Inicia con un nodo por defecto (se autoescalará).--machine-type=e2-medium: Tipo de máquina para los nodos.--image-type=COS_CONTAINERD: Imagen del sistema operativo optimizada para contenedores.--release-channel=regular: Canal de lanzamiento para las versiones de Kubernetes (ofrece un equilibrio entre estabilidad y nuevas características).--enable-autoscaling: Habilita el autoescalado del clúster (Cluster Autoscaler) entre 1 y 3 nodos.--enable-network-policy: Habilita la imposición de políticas de red entre pods.--enable-ip-alias: Utiliza rangos de IP alias para los pods y servicios, mejorando la seguridad y la gestión de la red.--create-subnetwork: Crea una subred dedicada para el clúster, lo que es una buena práctica de aislamiento de red.
Una vez creado el clúster, obtén las credenciales para kubectl:
gcloud container clusters get-credentials $CLUSTER_NAME --region $REGION
Verifica que kubectl pueda comunicarse con tu clúster:
kubectl get nodes
🔄 Despliegue de Aplicaciones Escalables y Resilientes
Ahora que tenemos un clúster, vamos a desplegar una aplicación de ejemplo y explorar estrategias para hacerla escalable y resistente a fallos.
Despliegue Básico con un Manifiesto YAML
Crearemos un simple despliegue (Deployment) y un servicio (Service) para una aplicación web NGINX.
Guarda el siguiente contenido como nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
Aplica este manifiesto a tu clúster:
kubectl apply -f nginx-deployment.yaml
Verifica el despliegue y el servicio:
kubectl get deployments
kubectl get services
El servicio de tipo LoadBalancer provisionará automáticamente un balanceador de carga de red de Google Cloud, que expondrá tu aplicación a Internet. Puede tomar unos minutos para que se asigne una IP externa.
kubectl get services nginx-service
Busca la EXTERNAL-IP en la salida y accede a ella desde tu navegador.
Autoescalado Horizontal de Pods (HPA)
El Autoescalador Horizontal de Pods (Horizontal Pod Autoscaler - HPA) ajusta automáticamente el número de réplicas de un Deployment o ReplicaSet basándose en métricas de CPU o memoria, o métricas personalizadas.
Primero, necesitas habilitar el servidor de métricas si no está ya habilitado (en GKE, suele estarlo por defecto).
Para habilitar el HPA, utilizaremos un objetivo de uso de CPU del 50%:
kubectl autoscale deployment nginx-app --cpu-percent=50 --min=2 --max=10
Ahora, tu nginx-app escalará automáticamente entre 2 y 10 réplicas para mantener el uso de CPU promedio por debajo del 50%.
kubectl get hpa
Para probar el HPA, puedes generar carga en los pods de NGINX:
kubectl run -i --tty --rm load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://nginx-service; done"
Observarás cómo el número de pods de nginx-app aumenta en respuesta a la carga.
Actualizaciones por Despliegue (Rolling Updates)
Kubernetes permite realizar actualizaciones de aplicaciones sin tiempo de inactividad utilizando Rolling Updates. Esto reemplaza las instancias de la aplicación una por una, asegurando que siempre haya instancias en ejecución para servir el tráfico.
Actualicemos la imagen de NGINX a una versión más reciente:
kubectl set image deployment/nginx-app nginx=nginx:1.15.8
Observa el proceso de actualización:
kubectl rollout status deployment/nginx-app
Verás cómo los pods antiguos se terminan y nuevos pods con la nueva imagen se inician gradualmente. Si algo sale mal, puedes deshacer la actualización:
kubectl rollout undo deployment/nginx-app
🛡️ Seguridad y Políticas de Red en GKE
La seguridad es primordial en cualquier entorno de producción. GKE ofrece varias características para proteger tus cargas de trabajo.
Control de Acceso Basado en Roles (RBAC)
RBAC permite definir quién puede realizar qué acciones en tu clúster de Kubernetes. Por defecto, GKE configura RBAC, y gcloud gestiona los roles de IAM de Google Cloud y los mapea a roles de RBAC de Kubernetes.
Para ver los roles predeterminados:
kubectl get clusterroles
kubectl get roles --all-namespaces
Políticas de Red (Network Policies)
Las políticas de red permiten controlar el tráfico de red entre pods y/o de pods a otros endpoints de red. Si habilitaste --enable-network-policy al crear el clúster, puedes usar Network Policies.
Crearemos una política que solo permita a los pods con la etiqueta app: backend comunicarse con los pods nginx-app en el puerto 80. Primero, un backend-app de ejemplo:
Guarda como backend-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-app
labels:
app: backend
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "echo 'Backend running' && sleep 3600"]
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
kubectl apply -f backend-deployment.yaml
Ahora, crea la política de red (nginx-network-policy.yaml):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend-to-nginx
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 80
kubectl apply -f nginx-network-policy.yaml
Esta política solo permite el tráfico entrante al pod nginx-app desde pods etiquetados como app: backend en el puerto 80. Cualquier otro tráfico entrante será denegado.
¿Cómo probar la política de red?
Puedes probarla intentando acceder al `nginx-service` desde un pod *sin* la etiqueta `app: backend` y luego desde uno que *sí* la tenga. Por ejemplo, crea un pod temporal sin la etiqueta, intenta `wget nginx-service`, y verás que falla. Luego, puedes añadir la etiqueta a un pod temporal y funcionará.📊 Monitoreo y Logging con Google Cloud Operations (antes Stackdriver)
Monitorear la salud y el rendimiento de tus aplicaciones y clústeres es crucial. GKE se integra de forma nativa con Google Cloud Operations (Cloud Monitoring y Cloud Logging).
Cloud Logging
Cloud Logging recopila automáticamente los logs de todos los componentes de tu clúster (nodos, pods, contenedores, componentes del plano de control). Puedes verlos en la Consola de Google Cloud, bajo "Logging" -> "Explorador de registros".
Aquí puedes filtrar logs por recursos (GKE Cluster, Pod, Container), etiquetas y severidad. Por ejemplo, para ver los logs de los contenedores NGINX:
resource.type="k8s_container"
resource.labels.project_id="your-gcp-project-id"
resource.labels.location="europe-west1"
resource.labels.cluster_name="advanced-gke-cluster"
resource.labels.container_name="nginx"
Cloud Monitoring
Cloud Monitoring recopila métricas de tus clústeres GKE, incluyendo el uso de CPU, memoria, red y disco de nodos y pods. Puedes crear dashboards personalizados, alertas y gráficos para visualizar el rendimiento.
En la Consola de Google Cloud, ve a "Monitoring" -> "Explorador de métricas". Aquí puedes construir consultas de métricas. Algunas métricas útiles incluyen:
kubernetes.io/container/cpu/usage_timekubernetes.io/container/memory/usage_byteskubernetes.io/node/network/received_bytes_count
📈 Optimización de Costos y Rendimiento
Maximizar el rendimiento y minimizar los costos es un objetivo constante en la nube. GKE ofrece varias funciones para ayudar.
Autoescalado del Clúster (Cluster Autoscaler)
Ya lo configuramos al crear el clúster (--enable-autoscaling --min-nodes=1 --max-nodes=3). El Cluster Autoscaler de GKE aumenta o disminuye el número de nodos en tu clúster automáticamente basándose en la demanda de recursos de los pods.
- Escalado hacia arriba: Si hay pods pendientes de asignación por falta de recursos en los nodos existentes, el Cluster Autoscaler añade más nodos.
- Escalado hacia abajo: Si un nodo tiene una baja utilización de recursos por un período de tiempo y todos sus pods pueden ser reubicados en otros nodos sin violar restricciones, el Cluster Autoscaler lo elimina.
Autoaprovisionamiento de Nodos (Node Auto-Provisioning)
Esta característica va más allá del Cluster Autoscaler. Cuando hay pods pendientes de programarse debido a la falta de un tipo de máquina o una combinación de recursos específica, el autoaprovisionamiento de nodos puede crear nuevos tipos de grupos de nodos para satisfacer esas necesidades.
Para habilitarlo en un clúster existente:
gcloud container clusters update $CLUSTER_NAME \
--enable-autoprovisioning \
--autoprovisioning-scopes=https://www.googleapis.com/auth/cloud-platform \
--autoprovisioning-locations=europe-west1-b,europe-west1-c \
--autoprovisioning-max-cpu=10 \
--autoprovisioning-max-memory=100Gi
Consideraciones de Recursos (Requests y Limits)
Es fundamental definir requests y limits de CPU y memoria para tus contenedores en tus manifiestos de Kubernetes. Esto permite al planificador de Kubernetes asignar pods de manera eficiente y al Cluster Autoscaler tomar decisiones informadas.
requests: La cantidad de recursos que Kubernetes garantiza para tu contenedor. El planificador usarequestspara decidir dónde colocar un pod.limits: El límite máximo de recursos que un contenedor puede usar. Si un contenedor excede sulimit, Kubernetes puede terminarlo o ralentizarlo.
Ejemplo en un manifiesto:
containers:
- name: my-app
image: my-image:latest
resources:
requests:
memory: "64Mi"
cpu: "250m" # 0.25 de una CPU
limits:
memory: "128Mi"
cpu: "500m"
🔄 Gestión del Ciclo de Vida del Clúster
La gestión a largo plazo de un clúster GKE incluye actualizaciones de versión, mantenimiento y, eventualmente, la eliminación.
Actualizaciones de Versión de GKE
GKE gestiona las actualizaciones del plano de control automáticamente. Para los nodos de trabajo, puedes configurar el canal de lanzamiento (release-channel) o gestionar las actualizaciones manualmente.
Para clústeres en canales de lanzamiento, las actualizaciones automáticas se aplican progresivamente. Puedes verificar la versión disponible:
gcloud container get-server-config --region $REGION
Para actualizar los nodos de un grupo de nodos a una versión específica (si no usas canales de lanzamiento o quieres forzar una actualización):
gcloud container clusters upgrade $CLUSTER_NAME \
--cluster-version latest \
--location $REGION \
--node-pool default-pool
Mantenimiento y Ventanas de Mantenimiento
Para minimizar interrupciones, puedes configurar ventanas de mantenimiento y exclusiones para el clúster. Esto es útil para actualizaciones automáticas de GKE y permite programar cuándo pueden ocurrir las interrupciones.
gcloud container clusters update $CLUSTER_NAME \
--maintenance-window "daily 03:00-04:00 America/Los_Angeles" \
--maintenance-exclusion-start "2024-12-24T00:00:00Z" \
--maintenance-exclusion-end "2025-01-02T00:00:00Z" \
--maintenance-exclusion-name "HolidayFreeze"
Eliminación del Clúster
Una vez que hayas terminado de experimentar, es importante eliminar el clúster para evitar incurrir en costos innecesarios.
gcloud container clusters delete $CLUSTER_NAME --region $REGION
Confirma la eliminación cuando se te solicite.
🎯 Próximos Pasos y Características Avanzadas
Este tutorial ha cubierto una base sólida para la orquestación avanzada en GKE. Aquí hay algunas áreas para explorar a continuación:
- Istio en GKE: Service Mesh para gestión de tráfico, seguridad y observabilidad.
- Cloud Build/Cloud Deploy: Integración con CI/CD para automatizar los despliegues en GKE.
- Velero: Solución de backup y restauración para tus clústeres de Kubernetes.
- Cloud Run for Anthos: Despliega cargas de trabajo serverless en tu propio clúster GKE.
- Clústeres multi-inquilino: Uso de Namespaces, Network Policies y Quotas para aislar equipos.
- Almacenamiento Persistente: Uso de Persistent Volumes y Persistent Volume Claims con Persistent Disks o Filestore.
✅ Conclusión
Google Kubernetes Engine te proporciona las herramientas para desplegar, gestionar y escalar tus aplicaciones en contenedores de una manera robusta y eficiente. Desde el autoescalado y las actualizaciones sin interrupciones hasta las políticas de red y el monitoreo integrado, GKE simplifica la complejidad de Kubernetes, permitiéndote construir y operar sistemas altamente disponibles y seguros. Al dominar estas capacidades, estarás bien equipado para manejar cargas de trabajo empresariales y aplicaciones de misión crítica en la nube.
Tutoriales relacionados
- Optimización de Costos en Google Cloud: Estrategias Efectivas con Committed Use Discounts y Budget Alertsintermediate15 min
- Despliegue de Aplicaciones Serverless con Cloud Run en Google Cloudintermediate18 min
- Migrando Bases de Datos a Cloud SQL: Guía Completa para SQL Server, MySQL y PostgreSQLintermediate20 min
- Gestionando Identidades y Accesos con Google IAM: Control Preciso para tus Recursos en la Nubeintermediate15 min
- Analítica de Logs y Monitoreo con Cloud Logging y Cloud Monitoring en Google Cloudintermediate20 min
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!