Escalar una aplicación

En esta página se explica cómo escalar una aplicación desplegada en Google Kubernetes Engine (GKE).

Información general

Cuando despliega una aplicación en GKE, define cuántas réplicas de la aplicación quiere ejecutar. Cada réplica de la aplicación representa un pod de Kubernetes que encapsula los contenedores de la aplicación.

Cuando escalas una aplicación, aumentas o disminuyes el número de réplicas de carga de trabajo o ajustas los recursos que están disponibles para las réplicas. Hay dos métodos para escalar una aplicación:

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Inspeccionar una aplicación

Antes de escalar la aplicación, debes inspeccionar la aplicación y asegurarte de que funciona correctamente.

Para ver todas las aplicaciones implementadas en tu clúster, ejecuta el siguiente comando:

kubectl get CONTROLLER

Sustituye CONTROLLER por deployments, statefulsets u otro tipo de objeto de controlador.

Por ejemplo, si ejecutas kubectl get deployments y solo has creado una implementación, la salida del comando debería ser similar a la siguiente:

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-app                1         1         1            1           10m

El resultado de este comando es similar para todos los objetos, pero puede mostrarse ligeramente diferente. En el caso de los despliegues, el resultado tiene seis columnas:

  • NAME crea una lista con los nombres de los despliegues del clúster.
  • DESIRED muestra el número de réplicas que quieres o el estado deseado de la aplicación, que defines al crear el Deployment.
  • CURRENT muestra cuántas réplicas se están ejecutando actualmente.
  • UP-TO-DATE muestra el número de réplicas que se han actualizado para alcanzar el estado deseado.
  • AVAILABLE muestra cuántas réplicas de la aplicación están disponibles para tus usuarios.
  • AGE muestra el tiempo que la aplicación ha estado en ejecución en el clúster.

En este ejemplo, solo hay una implementación, my-app, que solo tiene una réplica porque su estado deseado es una réplica. El estado deseado se define en el momento de la creación y se puede cambiar en cualquier momento al escalar la aplicación.

Inspeccionar objetos StatefulSets

Antes de escalar un StatefulSet, debes inspeccionarlo ejecutando el siguiente comando:

kubectl describe statefulset my-app

En el resultado de este comando, comprueba el campo del estado de los pods. Si el valor de Failed es mayor que 0, es posible que no se pueda aplicar el escalado.

Si un StatefulSet parece no estar en buen estado, haz lo siguiente:

  1. Obtén una lista de pods y consulta cuáles no están en buen estado:

    kubectl get pods
    
  2. Elimina el pod incorrecto:

    kubectl delete POD_NAME
    

Intentar escalar un objeto StatefulSet si no funciona correctamente puede provocar que no esté disponible.

Escalar una aplicación

En las siguientes secciones se describe cada método que puedes usar para escalar una aplicación. El método kubectl scale es la forma más rápida de ampliar la escala. Sin embargo, puede que prefieras otro método en algunas situaciones, como al actualizar archivos de configuración o al realizar modificaciones in situ.

kubectl scale

El comando kubectl scale te permite cambiar al instante el número de réplicas que quieres ejecutar en tu aplicación.

Para usar kubectl scale, especifica el nuevo número de réplicas definiendo la marca --replicas. Por ejemplo, para escalar my-app a cuatro réplicas, ejecuta el siguiente comando y sustituye CONTROLLER por deployment, statefulset u otro tipo de objeto de controlador:

kubectl scale CONTROLLER my-app --replicas 4

Si la acción se realiza correctamente, el resultado de este comando debería ser similar al de deployment "my-app" scaled.

A continuación, ejecuta lo siguiente:

kubectl get CONTROLLER my-app

La salida debería ser similar a la siguiente:

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-app                4         4         4            4           15m

kubectl patch

A partir de la versión 1.33 de Kubernetes, puedes usar el comando kubectl patch para escalar verticalmente tu carga de trabajo. Para ello, actualiza los recursos asignados a un contenedor sin tener que volver a crear el pod. Para obtener más información, incluidas las limitaciones, consulta la documentación de Kubernetes sobre cómo cambiar el tamaño de los recursos de CPU y memoria.

Para usar el comando kubectl patch, especifica la solicitud de recursos actualizada con la marca --patch. Por ejemplo, para escalar my-app a 800 mCPUs, ejecuta el siguiente comando:

kubectl patch pod my-app --subresource resize --patch \
  '{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'

kubectl apply

Puedes usar kubectl apply para aplicar un nuevo archivo de configuración a un objeto de controlador. kubectl apply es útil para hacer varios cambios en un recurso y puede ser útil para los usuarios que prefieren gestionar sus recursos en archivos de configuración.

Para escalar con kubectl apply, el archivo de configuración que proporciones debe incluir un nuevo número de réplicas en el campo replicas de la especificación del objeto.

A continuación, se muestra una versión actualizada del archivo de configuración del objeto my-app de ejemplo. En el ejemplo se muestra un Deployment, por lo que, si usas otro tipo de controlador, como un StatefulSet, cambia el kind en consecuencia. Este ejemplo funciona mejor en un clúster con al menos tres nodos.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: my-container
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0

En este archivo, el valor del campo replicas es 3. Cuando se aplica este archivo de configuración, el objeto my-app se escala a tres réplicas.

Si quieres aplicar un archivo de configuración actualizado, ejecuta el siguiente comando:

kubectl apply -f config.yaml

A continuación, ejecuta lo siguiente:

kubectl get CONTROLLER my-app

La salida debería ser similar a la siguiente:

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-app                3         3         3            3           15m

Consola

Para escalar una carga de trabajo en la consola de Google Cloud , sigue estos pasos:

  1. Ve a la página Cargas de trabajo de la Google Cloud consola.

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, haz clic en el nombre de la carga de trabajo que quieras escalar.

  3. Haz clic en Acciones > Escalar > Editar réplicas.

  4. Introduce el nuevo número de Réplicas de la carga de trabajo.

  5. Haz clic en Escalar.

Autoescalar despliegues

Puedes autoescalar los despliegues en función del uso de CPU de los pods mediante kubectl autoscale o desde el menú Cargas de trabajo de GKE en la consola deGoogle Cloud .

kubectl autoscale

kubectl autoscale crea un objeto HorizontalPodAutoscaler (o HPA) que se dirige a un recurso específico (denominado objetivo de escalado) y lo escala según sea necesario. El objeto HPA ajusta de forma periódica el número de réplicas del objetivo de escala para que coincida con el uso medio de la CPU que se haya especificado.

Cuando usas kubectl autoscale, especificas un número máximo y mínimo de réplicas para tu aplicación, así como un objetivo de utilización de la CPU. Por ejemplo, para establecer el número máximo de réplicas en seis y el mínimo en cuatro con un objetivo de uso de CPU del 50 %, ejecuta el siguiente comando:

kubectl autoscale deployment my-app --max 6 --min 4 --cpu-percent 50

En este comando, es obligatorio usar la marca --max. La marca --cpu-percent es la utilización de CPU objetivo de todos los pods. Este comando no escala inmediatamente la implementación a seis réplicas, a menos que ya haya una demanda sistémica.

Después de ejecutar kubectl autoscale, se crea el objeto HorizontalPodAutoscaler y se orienta a la aplicación. Cuando cambia la carga, el objeto aumenta o disminuye las réplicas de la aplicación.

Para obtener una lista de los objetos HorizontalPodAutoscaler de tu clúster, ejecuta el siguiente comando:

kubectl get hpa

Para ver un objeto HorizontalPodAutoscaler específico de tu clúster, ejecuta el siguiente comando:

kubectl get hpa HPA_NAME

Sustituye HPA_NAME por el nombre de tu objeto HorizontalPodAutoscaler.

Para ver la configuración de HorizontalPodAutoscaler, haz lo siguiente:

kubectl get hpa HPA_NAME -o yaml

El resultado debe ser similar al siguiente:

apiVersion: v1
items:
- apiVersion: autoscaling/v1
  kind: HorizontalPodAutoscaler
  metadata:
    creationTimestamp: ...
    name: HPA_NAME
    namespace: default
    resourceVersion: "664"
    selfLink: ...
    uid: ...
  spec:
    maxReplicas: 10
    minReplicas: 1
    scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: HPA_NAME
    targetCPUUtilizationPercentage: 50
  status:
    currentReplicas: 0
    desiredReplicas: 0
kind: List
metadata: {}
resourceVersion: ""
selfLink: ""

En este ejemplo de salida, el campo targetCPUUtilizationPercentage contiene el valor de porcentaje 50 que se ha transferido desde el ejemplo kubectl autoscale.

Para ver una descripción detallada de un objeto HorizontalPodAutoscaler específico del clúster, sigue estos pasos:

kubectl describe hpa HPA_NAME

Puedes modificar el HorizontalPodAutoscaler aplicando un nuevo archivo de configuración con kubectl apply, kubectl edit o kubectl patch.

Para eliminar un objeto HorizontalPodAutoscaler, sigue estos pasos:

kubectl delete hpa HPA_NAME

Consola

Si quieres autoescalar un despliegue, sigue estos pasos:

  1. Ve a la página Cargas de trabajo de la Google Cloud consola.

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, haz clic en el nombre del despliegue que quieras escalar automáticamente.

  3. Haga clic en Acciones > Escalado automático.

  4. Introduce el Número máximo de réplicas y, de forma opcional, el Número mínimo de réplicas de la implementación.

  5. En Métricas de escalado automático, seleccione y configure las métricas que quiera.

  6. Haz clic en Autoescalar.

Autoescalado con métricas personalizadas

Puedes escalar tus implementaciones en función de las métricas personalizadas exportadas desde Cloud Monitoring.

Para saber cómo usar métricas personalizadas para autoescalar despliegues, consulta el tutorial Autoescalar despliegues con métricas personalizadas.

Siguientes pasos