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:
- Escalado horizontal: aumenta o disminuye el número de réplicas de la carga de trabajo.
- Escalado vertical: ajustas los recursos disponibles para las réplicas in situ.
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:
Obtén una lista de pods y consulta cuáles no están en buen estado:
kubectl get pods
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:
Ve a la página Cargas de trabajo de la Google Cloud consola.
En la lista de cargas de trabajo, haz clic en el nombre de la carga de trabajo que quieras escalar.
Haz clic en list Acciones > Escalar > Editar réplicas.
Introduce el nuevo número de Réplicas de la carga de trabajo.
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:
Ve a la página Cargas de trabajo de la Google Cloud consola.
En la lista de cargas de trabajo, haz clic en el nombre del despliegue que quieras escalar automáticamente.
Haga clic en list Acciones > Escalado automático.
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.
En Métricas de escalado automático, seleccione y configure las métricas que quiera.
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.