tutoriales.com

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.

Avanzado25 min de lectura14 views
Reportar error

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.
📌 Nota: Este tutorial asume un conocimiento básico de Docker y Kubernetes. Si eres nuevo en estos conceptos, te recomendamos familiarizarte con ellos antes de profundizar en GKE.

🛠️ 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

  1. Cuenta de Google Cloud: Asegúrate de tener una cuenta de Google Cloud activa.
  2. Proyecto de Google Cloud: Crea un nuevo proyecto o selecciona uno existente.
  3. SDK de Google Cloud: Instala el SDK de Google Cloud en tu máquina local. Esto incluye gcloud y kubectl.
gcloud init
gcloud components install kubectl
  1. 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.
💡 Consejo: Para entornos de producción, considera un número mayor de nodos iniciales y un rango más amplio para el autoescalado, así como tipos de máquina más potentes.

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
Región de Google Cloud (GKE Regional) Plano de Control GKE (Gestionado por Google - Alta Disponibilidad) Zona A Nodo Trabajador Compute Engine VM Zona B Nodo Trabajador Compute Engine VM Zona C Nodo Trabajador Compute Engine VM Gestionado por Google Gestionado por Usuario/GKE

🔄 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
🔥 Importante: Siempre aplica el principio del menor privilegio. Otorga solo los permisos necesarios a usuarios y cuentas de servicio.

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á.
Network Policy Aplicada Pod A app: backend Pod C (Sin etiqueta) Pod B app: nginx Puerto 80: Permitido Denegado

📊 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_time
  • kubernetes.io/container/memory/usage_bytes
  • kubernetes.io/node/network/received_bytes_count
⚠️ Advertencia: Configura alertas para métricas críticas (por ejemplo, alta utilización de CPU/memoria, número de pods fallidos) para responder proactivamente a posibles problemas.

📈 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 usa requests para decidir dónde colocar un pod.
  • limits: El límite máximo de recursos que un contenedor puede usar. Si un contenedor excede su limit, 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"
💡 Consejo: Empieza con `requests` basados en el uso real de tu aplicación bajo carga normal y `limits` que sean un poco más altos para permitir picos. Monitorea y ajusta con el tiempo.

🔄 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.
🔥 Importante: GKE es una plataforma potente y en constante evolución. Mantente al día con las últimas noticias y mejores prácticas de Google Cloud y la comunidad de Kubernetes.

✅ 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

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!