En este documento, se explica cómo puedes usar el aumento de inicio de CPU con el ajuste de escala automático vertical de Pods (VPA) en Google Kubernetes Engine (GKE) para aumentar temporalmente los recursos de CPU asignados a un Pod durante su fase de inicialización.
El aumento de CPU de inicio acelera el inicio de la aplicación y mejora la eficiencia en cuanto a costos, ya que aumenta temporalmente las solicitudes de CPU durante la inicialización y las reduce a los niveles de referencia de forma local. En este documento, se abordan los requisitos, la configuración (a nivel del Pod y del contenedor), la verificación y las prácticas recomendadas del aumento del inicio.
Este documento está dirigido a ingenieros de DevOps y de plataformas, y a desarrolladores de aplicaciones que deseen optimizar el rendimiento del inicio de las aplicaciones en GKE.
Beneficios
El uso del aumento de la CPU de inicio proporciona los siguientes beneficios:
- Inicio más rápido: Acelera la inicialización de aplicaciones que consumen muchos recursos, como las escritas en Java, Node.js o Python.
- Eficiencia en los costos: Evita el aprovisionamiento excesivo de CPU para el funcionamiento en estado estable y, al mismo tiempo, satisface las demandas de inicio. La operación en estado estable es el período posterior a la finalización de la inicialización de una aplicación y a la estabilización de su uso de recursos.
- Sin interrupciones: Reduce los recursos a los niveles de referencia con el cambio de tamaño de Pods in situ (IPPR) de Kubernetes sin reiniciar los contenedores.
- Reducción del esfuerzo manual: Minimiza el desperdicio de recursos y el esfuerzo manual necesario para ajustar el tamaño de tus cargas de trabajo.
Requisitos
Para usar el aumento de la CPU de inicio, debes cumplir con los siguientes requisitos:
- Versión de GKE: Usa
1.36.0-gke.4447000y versiones posteriores para los clústeres Standard y Autopilot. - VPA enabled: Habilita el ajuste de escala automático vertical de Pods en clústeres estándar. GKE habilita el VPA de forma predeterminada en los clústeres de Autopilot. Puedes usar el VPA exclusivamente para el aumento de CPU de inicio si eliges un modo de actualización específico. Para habilitar y configurar el VPA, consulta Establece solicitudes de recursos de Pods de forma automática.
- Tipo de carga de trabajo: Usa un controlador, como una Deployment o un StatefulSet, para administrar tu carga de trabajo.
- Capacidad del nodo: Asegúrate de que los clústeres estándar tengan capacidad suficiente para el Pod potenciado. Si no hay capacidad suficiente, GKE limita la solicitud de Pod potenciado para que quepa en el nodo.
Cómo funciona el aumento de la CPU de inicio
Para obtener más información sobre el ciclo de vida del aumento y cómo el aumento de CPU de inicio calcula los incrementos de recursos, consulta Cómo funciona el aumento de CPU de inicio.
Antes de comenzar
Antes de comenzar, asegúrate de haber seleccionado el Cloud de Confiance by S3NS proyecto que contiene el clúster que deseas potenciar y de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando
gcloud components updatepara obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos que se indican en este documento.
Configura gcloud CLI para usar el proyecto seleccionado:
gcloud config set project PROJECT_IDReemplaza
PROJECT_IDpor el ID de tu proyecto.Asegúrate de tener un clúster de GKE existente. Si no tienes uno, consulta Crea un clúster.
Roles obligatorios
Para obtener los permisos que necesitas para habilitar y usar el aumento de velocidad de inicio de la CPU, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
- Administrador de Kubernetes Engine (
roles/container.admin) - Desarrollador de Kubernetes Engine (
roles/container.developer)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Habilita el aumento de CPU en el inicio
Para habilitar el aumento de CPU de inicio, agrega un bloque de configuración startupBoost a tu manifiesto de VerticalPodAutoscaler (VPA). Puedes configurar el aumento para que se aplique a todos los contenedores de un Pod o segmentar contenedores individuales con aumentos de recursos específicos.
Configura un aumento a nivel del Pod
Un aumento a nivel del Pod aplica el mismo incremento de recursos de CPU a cada contenedor de la carga de trabajo. Puedes configurar el aumento de CPU de inicio con o sin la administración continua de recursos del VPA.
Para configurar un aumento a nivel del Pod, usa una de las siguientes opciones.
Opción A: Aumento de inicio habilitado y modo de actualización del VPA inhabilitado
Usa esta opción para aprovechar el VPA exclusivamente por sus capacidades de aumento del inicio de la CPU sin activar las recomendaciones regulares del VPA. En el siguiente ejemplo, se aplica un factor de multiplicación de CPU de 2 y se mantiene durante 10 segundos después de que el Pod alcanza el estado Ready:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "Off"
startupBoost:
cpu:
type: "Factor"
factor: 2
durationSeconds: 10
Opción B: Se habilitaron el inicio rápido y el modo de actualización de VPA
Si deseas que GKE administre el aumento de inicio y, luego, siga ajustando automáticamente las solicitudes de recursos de tu Pod según el uso continuo, usa esta opción. En el siguiente ejemplo, se aplica el inicio rápido y se configura el campo updateMode como InPlaceOrRecreate:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "InPlaceOrRecreate"
startupBoost:
cpu:
type: "Factor"
factor: 2
durationSeconds: 10
Configura un aumento a nivel del contenedor
Si tu carga de trabajo incluye sidecars o cualquier otro contenedor que no requiera recursos adicionales, puedes segmentar contenedores específicos para un aumento del inicio en la sección resourcePolicy. El valor de containerName debe coincidir con el campo name de un contenedor en la especificación de tu Deployment.
Para configurar un aumento a nivel del contenedor, usa una de las siguientes opciones.
Opción A: Potencia un contenedor específico (actuación de VPA inhabilitada)
Usa esta opción para aplicar un aumento a un solo contenedor y mantener intactas las solicitudes de recursos del resto del Pod. En el siguiente manifiesto de ejemplo, se agregan dos vCPUs a la solicitud de referencia de un contenedor llamado boosted-container-name:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: "boosted-container-name"
mode: "Off"
startupBoost:
cpu:
type: "Quantity"
quantity: "2"
Opción B: Inhabilita un contenedor específico para que no se aplique una potenciación a nivel del Pod
Usa esta opción si tienes un aumento a nivel del Pod configurado, pero deseas excluir un contenedor específico. En el siguiente manifiesto de ejemplo, se aplica un factor de multiplicación de CPU de 2 a todo el Pod, pero se inhabilita el aumento para un contenedor llamado disable-cpu-boost-for-this-container estableciendo su factor en 1:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "InPlaceOrRecreate"
startupBoost:
cpu:
type: "Factor"
factor: 2
resourcePolicy:
containerPolicies:
- containerName: "disable-cpu-boost-for-this-container"
startupBoost:
cpu:
type: "Factor"
factor: 1
Verifica el aumento de CPU de inicio
Para verificar que tus Pods reciban el aumento, comprueba la configuración del VPA, las solicitudes de recursos del Pod, las anotaciones del Pod y los eventos del VPA.
Verifica la configuración del VPA
Para verificar los detalles de tu objeto VerticalPodAutoscaler, ejecuta el siguiente comando:
kubectl describe vpa VPA_NAME
Reemplaza VPA_NAME por el nombre de tu objeto de VPA.
Verifica la solicitud de CPU amplificada en el Pod
Para verificar las solicitudes de recursos actuales de tu Pod, ejecuta el siguiente comando:
kubectl describe pod POD_NAME
Reemplaza POD_NAME por el nombre del Pod.
Verifica el aumento de CPU con anotaciones de Pod
El webhook de admisión de VPA inserta una anotación con alcance de contenedor para hacer un seguimiento de los recursos originales a los que debe volver cada contenedor cuando venza el aumento. Para verificar estas anotaciones, ejecuta el siguiente comando:
kubectl get pod POD_NAME --output yaml
En la sección metadata.annotations, busca una anotación con el formato vpaCpuStartupBoost/CONTAINER_NAME. Por ejemplo:
metadata:
annotations:
vpaCpuStartupBoost/slow-starter: '{"requests":{"cpu":"50m","memory":"64Mi"},"limits":{"cpu":"200m","memory":"128Mi"}}'
El resultado del comando indica uno de los siguientes resultados de verificación:
- Aumento exitoso: La anotación
vpaCpuStartupBoost/CONTAINER_NAMEestá presente en el Pod. - Mejora sin éxito: Falta la anotación por completo. Esto significa que el controlador de admisión ignoró el aumento, posiblemente debido a los límites de capacidad de los nodos o las limitaciones de recursos de Autopilot.
Verifica si hay eventos de reducción de escala
Para verificar que GKE haya reducido correctamente la asignación de recursos de CPU al valor de referencia, revisa los eventos del clúster ejecutando el siguiente comando:
kubectl get events --field-selector reason=InPlaceResizedByVPA
El resultado del comando indica uno de los siguientes resultados de verificación:
- Desactivación exitosa del aumento: Verás un evento
InPlaceResizedByVPAcon un mensaje que indica que el actualizador del VPA cambió el tamaño del Pod en el mismo lugar. Esto confirma que la solicitud de CPU volvió a su valor de referencia sin reiniciar el contenedor. - Desactivación sin éxito: La anotación
vpaCpuStartupBoost/CONTAINER_NAMEpermanece en el Pod mucho después de que debería haber vencido la potenciación, y no hay ningún eventoInPlaceResizedByVPA.
Prácticas recomendadas y limitaciones
Revisa lo siguiente cuando uses el aumento de la CPU de inicio.
Interacciones con el ajuste de escala automático horizontal de Pods
Si usas el escalador automático horizontal de Pods (HPA) con el aumento de inicio de CPU, sigue estos lineamientos:
- Define sondeos de estado: Debes definir un
readinessProbepara tus cargas de trabajo. - Configura la demora de duración: Debes establecer el parámetro
durationSecondsen0. Esta configuración evita que el HPA escale horizontalmente tu aplicación de forma prematura debido al alto uso de CPU durante el inicio.
Escalador automático del clúster y bucles de desalojo
Si usas el escalador automático de clústeres en los clústeres de GKE Standard, ten en cuenta estos comportamientos de los nodos:
- Posibles bucles de desalojo: Un aumento temporal de la CPU podría activar un aumento de escala del nodo. Después de que el Pod esté listo y se reduzca la escala, el uso insuficiente podría activar la reducción de la escala del nodo y expulsar el Pod, lo que generaría un bucle sin fin.
- Mitigación: Recomendamos enfáticamente usar GKE Autopilot para mitigar los problemas de desfragmentación de nodos y bucles de desalojo.
Reinicios de contenedor
Para comprender cómo los reinicios de contenedores afectan el aumento de la CPU de inicio, revisa los siguientes comportamientos:
- Solo durante la creación del Pod: El aumento de la CPU de inicio solo se aplica durante la etapa inicial de creación del Pod.
- Sin aumento en el reinicio: Si se reinicia un contenedor, por ejemplo, debido a un evento OOMKill, pero el Pod permanece activo, GKE no vuelve a aplicar el aumento. Este comportamiento se produce porque el webhook de admisión de Pod se activa solo durante el proceso inicial de creación del Pod.
Realiza una limpieza
Debido a que configuras el aumento de inicio de la CPU en las cargas de trabajo existentes, ten en cuenta lo siguiente para evitar interrupciones en las cargas de trabajo:
- No es necesario que borres ningún recurso de Kubernetes.
- Si aún necesitas tu objeto VerticalPodAutoscaler o los controladores de carga de trabajo (como Deployments o StatefulSets) para las operaciones de estado estable, no los borres.
Si no necesitas el aumento de la CPU de inicio, puedes inhabilitar solo el aumento con uno de los siguientes métodos según tu alcance:
- Inhabilita el aumento para toda la carga de trabajo: Borra el bloque
startupBoostde la especificación del objeto VerticalPodAutoscaler y aplica el manifiesto actualizado a tu clúster. Inhabilita el aumento para un contenedor específico: Para excluir un contenedor específico de un aumento a nivel del Pod, agrega una política de contenedor en la sección
containerPoliciesy configura el factor multiplicador de CPU en 1.startupBoost: cpu: type: "Factor" factor: 1Para obtener más información, consulta Cómo configurar un aumento a nivel del contenedor.
- Inhabilita el aumento para toda la carga de trabajo: Borra el bloque
¿Qué sigue?
- Cómo escalar las solicitudes y los límites de los recursos del contenedor
- Configura el ajuste de escala automático horizontal de Pods
- Redimensiona las cargas de trabajo a gran escala