Brains4Cloud
ESEN
Practicar

Tema 2 de 10

D3 · Garantizar el funcionamiento de una solución en la nube

Operar GKE

El temario dedica media docena de puntos a la operación diaria de GKE: ver el inventario del clúster, configurar el acceso a Artifact Registry, trabajar con grupos de nodos, con recursos de Kubernetes como Pods, Services y StatefulSets, gestionar el autoescalado horizontal y vertical de Pods, las peticiones de recursos en Autopilot y el reparto de tráfico.

Google separa dos tipos de herramientas: las de Google Cloud (consola y gcloud container) para gestionar el clúster, y las de Kubernetes (kubectl) para lo que pasa dentro. En la consola, la página de GKE muestra clústeres, nodos y cargas de trabajo.

gcloud container clusters list
gcloud container clusters get-credentials CLUSTER --location=us-central1
kubectl get nodes
kubectl get pods --all-namespaces
kubectl get services
kubectl describe pod POD_NAME

Cada nodo lleva la etiqueta cloud.google.com/gke-nodepool con el nombre de su grupo de nodos, útil para filtrar.

GKE descarga imágenes directamente de los repositorios Docker de Artifact Registry. La clave es la identidad de los nodos:

  • Por defecto los nodos usan la cuenta de servicio predeterminada de Compute Engine.
  • Si esa cuenta ya no tiene el rol Editor (la restricción iam.automaticIamGrantsForDefaultServiceAccounts se aplica por defecto en organizaciones creadas desde el 3 de mayo de 2024), hay que darle Artifact Registry Reader (roles/artifactregistry.reader).
  • Con eso, GKE descarga imágenes de repositorios del mismo proyecto. Para otro proyecto, para subir imágenes o para usar una cuenta de servicio propia, hay que configurar el acceso de forma explícita.
  • Los ámbitos de acceso de los nodos existentes no se pueden cambiar.

Google recomienda sustituir el rol Editor de la cuenta predeterminada por roles menos permisivos, usando Policy Simulator para ver el impacto.

Grupos de nodos

Un grupo de nodos es un conjunto de nodos de un clúster Standard con la misma configuración. En Autopilot no se configuran: GKE gestiona los nodos.

  • El grupo por defecto tiene tres nodos en cada zona del clúster, con la imagen cos_containerd.
  • Se añaden grupos con otras máquinas, Local SSD, Spot VMs u otra imagen para Pods con necesidades distintas, y se dirigen los Pods con nodeSelector o taints.
  • No se configura un nodo suelto: cualquier cambio afecta a todos los nodos del grupo.
  • Cada grupo se crea, actualiza, redimensiona y borra por separado; por defecto usa la versión del plano de control.
gcloud container node-pools create highmem-pool --cluster=CLUSTER \
  --location=us-central1 --machine-type=n2-highmem-4 --service-account=SA_EMAIL
gcloud container clusters resize CLUSTER --node-pool=highmem-pool --num-nodes=2 --location=us-central1
gcloud container node-pools update highmem-pool --cluster=CLUSTER --location=us-central1 ...
gcloud container node-pools delete highmem-pool --cluster=CLUSTER --location=us-central1

Cluster autoscaler

Ajusta automáticamente el número de nodos de un grupo entre un mínimo y un máximo. Se basa en las peticiones de recursos de los Pods, no en su uso real:

  • Si hay Pods que no caben en ningún nodo (unschedulable), añade nodos.
  • Si los nodos están infrautilizados y todos los Pods caben en menos nodos, quita nodos hasta el mínimo.
  • --min-nodes/--max-nodes son por zona; --total-min-nodes/--total-max-nodes son para todo el grupo.
  • Al quitar nodos los Pods se reprograman: Google recomienda usar controladores con varias réplicas, como un Deployment.
  • En Autopilot no hace falta: los nodos se aprovisionan y escalan solos.
gcloud container node-pools update default-pool --cluster=CLUSTER --location=us-central1 \
  --enable-autoscaling --total-min-nodes=3 --total-max-nodes=12

Recursos de Kubernetes

RecursoPara qué
PodLa unidad mínima: uno o varios contenedores que comparten red y almacenamiento
DeploymentAplicaciones sin estado con réplicas, actualizaciones graduales y rollback
StatefulSetPods con identidad persistente, nombre de host estable y un volumen persistente por réplica. Se empareja con un Service headless
ServicePunto de acceso estable a un grupo de Pods

En un StatefulSet, las IP de las réplicas pueden cambiar si GKE reprograma un Pod: hay que usar Services en lugar de IP fijas. Para aplicaciones sin estado, Google indica usar Deployments.

Tipos de Service

TipoCómo llegan los clientes
ClusterIP (por defecto)Clientes internos, a una IP interna estable
NodePortA la IP de un nodo en un puerto concreto. Extiende ClusterIP
LoadBalancerA la IP de un balanceador de carga de red. Extiende NodePort
ExternalNameEl nombre DNS del Service es un alias de un nombre DNS externo
HeadlessAgrupa Pods sin IP estable; usado por los StatefulSets

Horizontal Pod Autoscaler

Aumenta o reduce el número de Pods de una carga. No cambia el número de nodos: para eso está el cluster autoscaler.

Uso de recursos

CPU o memoria, en valor absoluto o como porcentaje de lo que pide el Pod.

Métricas personalizadas

Métricas de objetos del clúster, como peticiones por segundo.

Métricas externas

De fuera del clúster, como el tamaño de una cola de Pub/Sub.

  • Para usar porcentajes de CPU o memoria, todos los contenedores deben tener peticiones de ese recurso; si no, el HPA no actúa sobre esa métrica.
  • Con varias métricas, evalúa cada una por separado y calcula la escala para cada una.
  • Google desaconseja usar el HPA y el VPA estándar a la vez sobre CPU o memoria.
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
kubectl get hpa
kubectl scale deployment nginx --replicas=3   # escalado manual

Vertical Pod Autoscaler

Analiza el uso histórico y ajusta las peticiones y límites de CPU y memoria de los contenedores. Funciona mejor con cargas homogéneas de larga duración; para picos repentinos Google recomienda el HPA. Está activado por defecto en los clústeres Autopilot.

Modo (updateMode)Comportamiento
Auto / Recreate (por defecto)Desaloja y recrea el Pod para aplicar las nuevas peticiones. Conviene limitarlo con un Pod disruption budget
InitialAsigna las peticiones solo al crear el Pod; nunca las cambia después
OffNo aplica cambios: solo muestra recomendaciones para aplicarlas a mano
InPlaceOrRecreate (vista previa)Intenta cambiar los recursos sin recrear el Pod; si no puede, lo recrea

La implementación de GKE tiene en cuenta el tamaño máximo de nodo y las cuotas, avisa al cluster autoscaler y usa datos históricos de antes de activarlo.

Peticiones de recursos en Autopilot

En Autopilot se paga por lo que piden los Pods, así que las peticiones importan. Autopilot usa esas peticiones para configurar los nodos y las valida:

  • Si no indicas peticiones, aplica valores por defecto: en las clases General-purpose, Balanced y Scale-Out, 0,5 vCPU y 2 GiB de memoria; 1 GiB de almacenamiento efímero para los contenedores normales. Los contenedores de DaemonSets reciben 50 mCPU, 100 MiB de memoria y 100 MiB de almacenamiento efímero.
  • Si las peticiones están por debajo del mínimo, Autopilot las sube automáticamente.
  • Si están por encima del máximo, rechaza la carga con un error.
  • Los mínimos y máximos dependen de la clase de cómputo o del hardware (por ejemplo, GPU). Si indicas solo CPU o solo memoria, completa la otra según la proporción permitida.
  • Google recomienda fijar las peticiones de cada contenedor de forma explícita, porque los valores por defecto pueden no bastar.

Actualizaciones y reparto de tráfico

Rolling update del Deployment

  • Estrategia por defecto: sustituye Pods poco a poco.
  • maxUnavailable y maxSurge (25 % por defecto) controlan cuántos Pods pueden faltar o sobrar durante el despliegue.
  • kubectl rollout undo deployment/NOMBRE vuelve a la revisión anterior (o a otra con --to-revision).

Gateway API

  • Permite repartir tráfico entre Services por pesos en un HTTPRoute (por ejemplo, 90 % a v1 y 10 % a v2).
  • También enruta por cabeceras: las peticiones con env: canary pueden ir a otra versión.
  • Estas capacidades en Ingress solo existían con anotaciones personalizadas.

Escenarios de examen

SituaciónRespuestaPor qué
Pods de una carga necesitan mucha memoria y el resto noUn grupo de nodos aparte con nodeSelectorTodos los nodos de un grupo son idénticos.
Hay Pods pendientes porque no caben en los nodosCluster autoscalerAñade nodos según las peticiones de los Pods.
Escalar réplicas según los mensajes pendientes en Pub/SubHPA con métrica externaEl HPA admite métricas de fuera del clúster.
No sabes qué CPU y memoria pedir para un servicio estableVPA en modo OffDa recomendaciones sin aplicarlas.
Base de datos con identidad estable y un disco por réplicaStatefulSet con Service headlessIdentidad persistente y volúmenes por Pod.
Los nodos no pueden descargar imágenes de Artifact RegistryDar Artifact Registry Reader a la cuenta de servicio de los nodosEs la identidad que usan para leer.
Mandar el 10 % del tráfico a la versión nuevaGateway API con pesos en HTTPRouteReparto de tráfico por pesos.
Una nueva versión del Deployment fallakubectl rollout undoVuelve a la revisión anterior.

Trampas frecuentes del examen

❓ ¿El HPA añade nodos al clúster?

No. Solo cambia el número de Pods; los nodos los añade el cluster autoscaler.

❓ ¿El cluster autoscaler mira el uso real de CPU?

No. Decide según las peticiones de recursos de los Pods.

❓ ¿Se puede configurar un solo nodo de un grupo?

No. Los cambios afectan a todos los nodos del grupo.

❓ ¿Qué hace Autopilot si un Pod pide más del máximo permitido?

Rechaza la carga. Si pide menos del mínimo, sube las peticiones automáticamente.

❓ ¿Qué modo de VPA solo da recomendaciones?

Off. Auto/Recreate es el modo por defecto y recrea los Pods.

❓ ¿Por qué un HPA por porcentaje de CPU no escala?

Probablemente porque algún contenedor no tiene petición de CPU; sin ella no puede calcular el porcentaje.

¿Entendiste este tema?

Pon a prueba lo que acabas de aprender

En un clúster GKE Standard, el HPA crea más réplicas durante un pico, pero los Pods nuevos quedan en estado Pending porque no caben en los nodos. ¿Qué hace?

¿Listo para poner a prueba "Operar GKE"?

Preguntas originales, cada una con su explicación.

Empezar un simulacro