Cuando el escalado automático horizontal de Pods no funciona según lo esperado en Google Kubernetes Engine (GKE), es posible que tus cargas de trabajo no se escalen correctamente. Este problema puede impedir que las aplicaciones controlen la carga, lo que puede causar problemas de rendimiento o interrupciones. Es posible que veas que los Pods no aumentan a pesar de la CPU alta, que los valores de las métricas se muestran como <unknown> en el estado de HorizontalPodAutoscaler o que no se producen operaciones de ajuste de escala.
Usa este documento para diagnosticar y resolver problemas comunes relacionados con el ajuste automático de escala horizontal de Pods, desde errores de configuración iniciales en tus objetos HorizontalPodAutoscaler hasta fallas más complejas dentro de la canalización de métricas. Si sigues estos pasos para solucionar problemas, puedes asegurarte de que tus aplicaciones se escale de manera eficiente y confiable según la demanda, lo que permite usar de manera eficaz el recurso HorizontalPodAutoscaler.
Esta información es importante para los desarrolladores de aplicaciones que configuran objetos HorizontalPodAutoscaler y necesitan asegurarse de que sus aplicaciones se ajusten correctamente. También ayuda a los administradores y operadores de la plataforma a solucionar problemas relacionados con la canalización de métricas o la configuración del clúster que afectan todas las cargas de trabajo con ajuste de escala automático. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Cloud de Confiance by S3NS , consulta Roles y tareas comunes del usuario de GKE.
Antes de comenzar
- Asegúrate de usar objetos HorizontalPodAutoscaler con cargas de trabajo escalables, como Deployments y StatefulSets. No puedes usar el ajuste automático de escala horizontal de Pods con cargas de trabajo que no se pueden escalar, por ejemplo, DaemonSets.
-
Para obtener los permisos que necesitas para solucionar problemas del ajuste de escala automático horizontal de Pods en GKE, lo que incluye inspeccionar objetos HorizontalPodAutoscaler y ver los registros del clúster, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
-
Inspecciona los recursos de GKE:
Visualizador de GKE (
roles/container.viewer) -
Para ver los registros del clúster, usa el Visualizador de registros (
roles/logging.viewer).
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.
-
Inspecciona los recursos de GKE:
Visualizador de GKE (
Configura la herramienta de línea de comandos de
kubectlpara que se comunique con tu clúster de GKE:gcloud container clusters get-credentials CLUSTER_NAME \ --location LOCATION \ --project PROJECT_IDReemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.LOCATION: Es la región o zona de Compute Engine (por ejemplo,us-central1ous-central1-a) del clúster.PROJECT_ID: Es el ID del proyecto de Cloud de Confiance by S3NS .
Diagnostica problemas de HorizontalPodAutoscaler
Para diagnosticar problemas con un HorizontalPodAutoscaler, inspecciona el estado y la configuración con los comandos de kubectl o la consola de Cloud de Confiance .
Describe el HorizontalPodAutoscaler
Para ver los cálculos en tiempo real y las decisiones de ajuste recientes, usa el comando kubectl describe hpa:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAME
Reemplaza lo siguiente:
HPA_NAME: Es el nombre de tu objeto HorizontalPodAutoscaler.NAMESPACE_NAME: Es el espacio de nombres de tu objeto HorizontalPodAutoscaler.
El resultado es similar a lo siguiente:
Name: php-apache-hpa
Namespace: default
Reference: Deployment/php-apache
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 1% (1m) / 50%
Min replicas: 1
Max replicas: 10
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HorizontalPodAutoscaler was able to successfully calculate a replica count
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 39m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization...
Normal SuccessfulRescale 26m horizontal-pod-autoscaler New size: 1; reason: cpu resource utilization...
En el resultado, las siguientes tres secciones te ayudan a diagnosticar el problema:
Metrics: Muestra los valores actuales de las métricas en comparación con sus objetivos. Un valor de métrica de<unknown>indica que HorizontalPodAutoscaler no recuperó la métrica o que la canalización de métricas está interrumpida.Conditions: Muestra si HorizontalPodAutoscaler puede recuperar métricas (AbleToScale) y realizar cálculos de ajuste de escala (ScalingActive). El estadoFalseen cualquiera de estas condiciones indica una falla.Events: Registra las acciones de ajuste de escala, las advertencias y los errores recientes del controlador de HorizontalPodAutoscaler. A menudo, es el primer lugar donde se pueden encontrar mensajes o motivos de error específicos, comoFailedGetScaleoFailedGetResourceMetric.
Verifica tu manifiesto de HorizontalPodAutoscaler
El manifiesto YAML de tu objeto HorizontalPodAutoscaler te permite ver información sobre su configuración y su estado actual.
Para ver el manifiesto YAML, selecciona una de las siguientes opciones:
Console
En la consola de Cloud de Confiance , ve a la página Navegador de objetos.
En la lista Object Kinds, selecciona la casilla de verificación HorizontalPodAutoscaler y haz clic en OK.
Navega al grupo de APIs autoscaling y, luego, haz clic en la flecha de expansión de HorizontalPodAutoscaler.
Haz clic en el nombre del objeto HorizontalPodAutoscaler que deseas inspeccionar.
Revisa la sección YAML, que muestra la configuración completa del objeto HorizontalPodAutoscaler.
kubectl
Ejecuta el comando siguiente:
kubectl get hpa HPA_NAME -n NAMESPACE_NAME -o yaml
Reemplaza lo siguiente:
HPA_NAME: Es el nombre de tu objeto HorizontalPodAutoscaler.NAMESPACE_NAME: Es el espacio de nombres de tu objeto HorizontalPodAutoscaler.
Después de recuperar el manifiesto, busca estas secciones clave:
spec(tu configuración):scaleTargetRef: Es la carga de trabajo (como una Deployment) que el HorizontalPodAutoscaler está configurado para escalar.minReplicasymaxReplicas: Son los parámetros de configuración de réplicas mínimos y máximos.metrics: Son las métricas configuradas para el ajuste de escala (por ejemplo, el uso de CPU o las métricas personalizadas).
status(el estado activo de HorizontalPodAutoscaler):currentMetrics: Son los valores de métricas más recientes que observó el HorizontalPodAutoscaler.currentReplicasydesiredReplicas: La cantidad actual de Pods y la cantidad a la que el HorizontalPodAutoscaler desea escalar.conditions: Muestra el estado del HorizontalPodAutoscaler:AbleToScale: Indica si el HorizontalPodAutoscaler puede encontrar su destino y sus métricas.ScalingActive: Muestra si se permite que HorizontalPodAutoscaler calcule y realice el ajuste de escala.ScalingLimited: Muestra si el HorizontalPodAutoscaler desea escalar, pero está limitado por la configuración deminReplicasomaxReplicas.
Cómo ver registros de eventos
Para obtener información más detallada sobre tu objeto HorizontalPodAutoscaler, usa los siguientes tipos de registros:
Cómo ver eventos de HorizontalPodAutoscaler en Cloud Logging: Usa un filtro de registros para encontrar todos los eventos de HorizontalPodAutoscaler de un clúster específico. Por ejemplo:
En la consola de Cloud de Confiance , accede a la página Explorador de registros.
En el panel de consultas, ingresa la siguiente consulta:
resource.type="k8s_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="LOCATION" logName="projects/PROJECT_ID/logs/events" jsonPayload.involvedObject.kind="HorizontalPodAutoscaler"Reemplaza lo siguiente:
CLUSTER_NAME: Es el nombre del clúster al que pertenece el HorizontalPodAutoscaler.LOCATION: Es la región o zona de Compute Engine (por ejemplo,us-central1ous-central1-a) del clúster.PROJECT_ID: el ID de tu proyecto
Haz clic en Ejecutar consulta y revisa el resultado.
Ver eventos del escalador automático horizontal de Pods: Estos registros proporcionan registros estructurados y legibles que explican cómo el escalador automático horizontal de Pods calcula una recomendación, lo que ofrece información detallada sobre su proceso de toma de decisiones.
Soluciona problemas de errores de configuración de HorizontalPodAutoscaler
En las siguientes secciones, se abordan los errores de configuración en el manifiesto de HorizontalPodAutoscaler, como campos con errores de escritura, destinos de métricas no válidos o configuraciones en conflicto.
No se encontró la carga de trabajo objetivo
Síntomas
La sección Events tiene una condición de FailedGetScale con un mensaje similar al siguiente:
the HorizontalPodAutoscaler controller was unable to get the target's current scale: WORKLOAD_TYPE.apps "TARGET_WORKLOAD" not found
En esta salida, se incluyen los siguientes valores:
WORKLOAD_TYPE: Es el tipo de carga de trabajo, comoDeploymentoStatefulSet.TARGET_WORKLOAD: Es el nombre de la carga de trabajo.
Causa
El controlador HorizontalPodAutoscaler no puede encontrar la carga de trabajo (como un Deployment o un StatefulSet) que está configurado para administrar. Este problema se produce debido a un error de configuración en el campo scaleTargetRef dentro del manifiesto de HorizontalPodAutoscaler. Es posible que el recurso especificado no exista, se haya borrado o tenga un error ortográfico.
Solución
Prueba las siguientes soluciones:
- Verifica el campo
scaleTargetRefdel manifiesto de HorizontalPodAutoscaler: Asegúrate de que los valores dename,kindyapiVersionen el camposcaleTargetRefcoincidan exactamente con los metadatos correspondientes de tu carga de trabajo objetivo. Si el nombre de la carga de trabajo es incorrecto, actualiza el camposcaleTargetRefde HorizontalPodAutoscaler para que apunte al nombre correcto. - Confirma que la carga de trabajo existe: Verifica que la carga de trabajo de destino exista en el mismo espacio de nombres que HorizontalPodAutoscaler. Puedes verificar esto con un comando como
kubectl get deployment DEPLOYMENT_NAME. Si borraste la carga de trabajo de forma intencional, borra el objeto HorizontalPodAutoscaler correspondiente para limpiar tu clúster. Si necesitas volver a crear la carga de trabajo, el HorizontalPodAutoscaler la encontrará automáticamente cuando esté disponible y el error se resolverá. - Verifica que HorizontalPodAutoscaler y la carga de trabajo estén en el mismo espacio de nombres: HorizontalPodAutoscaler y su carga de trabajo de destino deben estar en el mismo espacio de nombres. Si olvidas especificar un espacio de nombres cuando creas un objeto con comandos
kubectl, Kubernetes coloca el objeto en el espacio de nombresdefault. Este comportamiento puede causar una discrepancia si tu HorizontalPodAutoscaler está en el espacio de nombresdefaulty tu carga de trabajo está en otro, o viceversa. Verifica el espacio de nombres de ambos objetos y comprueba que coincidan.
Después de que HorizontalPodAutoscaler localiza correctamente su destino, la condición AbleToScale se convierte en True y el mensaje cambia a the HorizontalPodAutoscaler controller was able to get the target's current scale.
Métricas no válidas
Síntomas
Si el HorizontalPodAutoscaler no puede calcular las réplicas necesarias debido a un problema de configuración, su sección Events muestra un motivo de FailedComputeMetricsReplicas con un mensaje similar al siguiente:
invalid metrics (1 invalid out of 1)
Causa
Por lo general, este error significa que hay una discrepancia entre la métrica type y el target que definiste en tu manifiesto de HorizontalPodAutoscaler. Por ejemplo, es posible que hayas especificado un type de Utilization, pero proporcionaste un valor objetivo de averageValue en lugar de averageUtilization.
Solución
Corrige el manifiesto de HorizontalPodAutoscaler para que el valor del campo target se alinee con la métrica type:
- Si
typeesUtilization, el valor del campotargetdebe seraverageUtilization. - Si
typeesAverageValue, el valor del campotargetdebe seraverageValue.
No se permite la etiqueta de métrica
Síntomas
Observas el siguiente error:
unable to fetch metrics from external metrics API: googleapi: Error 400: Metric label: 'LABEL_NAME' is not allowed
En este resultado, LABEL_NAME es el nombre de la etiqueta incorrecta.
Causa
El manifiesto de HorizontalPodAutoscaler especifica una clave de etiqueta no válida en la sección metric.selector.matchLabels, y Cloud Monitoring no reconoce ni permite esta clave para la métrica.
Solución
Para solucionar este problema, haz lo siguiente:
- Identifica el nombre de la etiqueta no permitida en el mensaje de error.
- Quita o corrige esta clave de etiqueta en la sección
metric.selector.matchLabelsdel manifiesto de HorizontalPodAutoscaler. - Para encontrar una clave de etiqueta válida que se pueda filtrar, consulta la documentación de Cloud Monitoring para esa métrica.
Varios HorizontalPodAutoscalers segmentan la misma carga de trabajo
Síntomas
No hay ningún Condition o Reason específico en el estado de un HorizontalPodAutoscaler que indique directamente este conflicto. En su lugar, es posible que observes los siguientes síntomas:
- El recuento de réplicas de la carga de trabajo puede fluctuar de forma inesperada.
- Es posible que las decisiones de ajuste de escala no parezcan corresponderse con las métricas definidas en ningún HorizontalPodAutoscaler individual.
- Cuando veas eventos, es posible que veas eventos
SuccessfulRescalealternados o contradictorios de diferentes objetos HorizontalPodAutoscaler.
Causa
Este problema se produce porque más de un objeto HorizontalPodAutoscaler dentro del mismo espacio de nombres especifica exactamente la misma carga de trabajo en el campo spec.scaleTargetRef. Cada HorizontalPodAutoscaler calcula de forma independiente los recuentos de réplicas y trata de escalar la carga de trabajo en función de su propio conjunto de métricas y objetivos. Kubernetes no bloquea esta configuración, pero genera ajustes de escalamiento erráticos porque los HorizontalPodAutoscalers compiten entre sí.
Solución
Para evitar conflictos, define todas las métricas de ajuste de escala en un solo objeto HorizontalPodAutoscaler. Cada HorizontalPodAutoscaler calcula las necesidades de ajuste de escala a partir de su propio campo spec.metrics, por lo que la combinación de ambos permite que el objeto HorizontalPodAutoscaler elegido considere todos los factores, como la CPU y las solicitudes por segundo, de forma conjunta:
Para identificar qué HorizontalPodAutoscalers segmentan la misma carga de trabajo, obtén el manifiesto YAML de cada objeto HorizontalPodAutoscaler. Presta mucha atención al campo
spec.scaleTargetRefen el resultado.kubectl get hpa -n NAMESPACE_NAME -o yamlReemplaza
NAMESPACE_NAMEpor el espacio de nombres de tu objeto HorizontalPodAutoscaler.Busca instancias en las que diferentes recursos de HorizontalPodAutoscaler tengan los mismos valores para
apiVersion,kindynamedentro de su camposcaleTargetRef.Consolida las métricas en un solo objeto HorizontalPodAutoscaler:
- Elige un objeto HorizontalPodAutoscaler para conservar. Este HorizontalPodAutoscaler será el que modifiques.
- Examina la sección
spec.metricsen el manifiesto de cada uno de los otros objetos HorizontalPodAutoscaler que tienen como objetivo la misma carga de trabajo. - Copia las definiciones de métricas que deseas conservar de las secciones
spec.metricsde los objetos HorizontalPodAutoscaler duplicados. - Pega estas definiciones de métricas copiadas en el array
spec.metricsdel HorizontalPodAutoscaler que decidiste conservar.
Aplica los cambios:
kubectl apply -f MANIFEST_NAMEReemplaza
MANIFEST_NAMEpor el nombre del manifiesto de HorizontalPodAutoscaler que decidiste conservar.Borra los otros objetos HorizontalPodAutoscaler que tenían como objetivo la misma carga de trabajo:
kubectl delete hpa DUPLICATE_MANIFEST_NAME -n NAMESPACE_NAMEReemplaza
DUPLICATE_MANIFEST_NAMEpor el nombre del objeto HorizontalPodAutoscaler redundante que deseas borrar.
Soluciona problemas relacionados con errores de cargas de trabajo y servicios
En las siguientes secciones, se abordan los errores causados por la carga de trabajo de destino o sus servicios asociados, en lugar del objeto HorizontalPodAutoscaler en sí.
Faltan solicitudes de recursos para el cálculo del ajuste de escala
Síntomas
La condición ScalingActive es False con un Reason de FailedGetResourceMetric. Por lo general, también verás un mensaje similar al siguiente:
the HorizontalPodAutoscaler was unable to compute the replica count
Causa
El HorizontalPodAutoscaler necesita calcular el uso de recursos como un porcentaje para escalar la carga de trabajo, pero no puede realizar este cálculo porque falta una definición de resources.requests para el recurso correspondiente (cpu o memory) en al menos un contenedor dentro de la especificación del Pod.
Solución
Para resolver este problema, actualiza el manifiesto del Pod en tu Deployment, StatefulSet o cualquier otro controlador para incluir un campo resources.requests para el recurso (cpu o memory) en el que el HorizontalPodAutoscaler intenta realizar el ajuste de escala para todos los contenedores del Pod. Por ejemplo:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
# Multiple lines are omitted here
spec:
containers:
- name: example-container
resources:
requests:
cpu: "100m"
memory: "128Mi"
No se pueden recuperar las métricas de Pod
Síntomas
Observarás un mensaje persistente similar al siguiente:
unable to fetch pod metrics for pod
Es normal ver este mensaje temporalmente cuando se inicia el servidor de métricas.
Causa
Para realizar el ajuste de escala en función del porcentaje de uso de los recursos (como cpu o memory), cada contenedor dentro de los Pods a los que se dirige el objeto HorizontalPodAutoscaler debe tener definido el campo resources.requests para ese recurso específico.
De lo contrario, el HorizontalPodAutoscaler no puede realizar los cálculos que necesita y no realiza ninguna acción en relación con esa métrica.
Solución
Si estos mensajes de error persisten y notas que los Pods no se escalan para tu carga de trabajo, verifica que hayas especificado solicitudes de recursos para cada contenedor en tu carga de trabajo.
Varios servicios seleccionan el mismo destino
Síntomas
Observas el siguiente error:
multiple services selecting the same target of HPA_NAME: SERVICE_NAME
En esta salida, se incluyen los siguientes valores:
HPA_NAME: Es el nombre del HorizontalPodAutoscaler.SERVICE_NAME: Es el nombre de un servicio.
Causa
Se configuró el ajuste de escala automático basado en el tráfico, pero más de un servicio de Kubernetes apunta al campo scaleTargetRef de HorizontalPodAutoscaler. El ajuste de escala automático basado en el tráfico solo admite una relación uno a uno entre el servicio y la carga de trabajo con ajuste de escala automático.
Solución
Para solucionar este problema, asegúrate de que solo el selector de etiquetas de un Service coincida con los Pods de tu carga de trabajo:
Encuentra las etiquetas del Pod de tu carga de trabajo:
kubectl get deployment HPA_TARGET_DEPLOYMENT \ -n NAMESPACE \ -o jsonpath='{.spec.template.metadata.labels}'Reemplaza lo siguiente:
HPA_TARGET_DEPLOYMENT: Es el nombre de la Deployment a la que se dirige el HorizontalPodAutoscaler.NAMESPACE: Es el espacio de nombres de la Deployment.
El resultado es similar a lo siguiente:
{"app":"my-app", "env":"prod"}Revisa el campo
spec.selectorde todos los servicios del espacio de nombres para encontrar todos los servicios que coincidan con esas etiquetas.kubectl get services -n NAMESPACE -o yamlIdentifica cada Service cuyo selector coincida con las etiquetas del paso anterior. Por ejemplo,
{"app": "my-app"}y{"app": "my-app", "env": "prod"}coinciden con las etiquetas de Pod de ejemplo.Para resolver el conflicto, elige una de las siguientes opciones:
- Para que el selector del servicio deseado sea único, agrega una etiqueta nueva y única al campo
spec.template.metadata.labelsde tu Deployment. Luego, actualiza el campospec.selectordel servicio one deseado para incluir esta nueva etiqueta. - Haz que otros selectores de Service sean más restrictivos. Para ello, cambia el campo
spec.selectorde todos los Services otros en conflicto para que sean más restrictivos y ya no coincidan con los Pods de tu carga de trabajo.
- Para que el selector del servicio deseado sea único, agrega una etiqueta nueva y única al campo
Aplica los cambios:
kubectl apply -f MANIFEST_NAMEReemplaza
MANIFEST_NAMEpor el nombre del archivo YAML que contiene el manifiesto actualizado del servicio o la Deployment.
Soluciona problemas relacionados con la API de métricas y la disponibilidad de datos
En las siguientes secciones, se explica cómo resolver los errores que se producen cuando HorizontalPodAutoscaler intenta comunicarse con una API de métricas o consultar un backend de métricas.
Soluciona problemas relacionados con las métricas personalizadas y externas
Cuando tu HorizontalPodAutoscaler depende de métricas de fuentes distintas de la CPU o la memoria predeterminadas, pueden ocurrir problemas dentro de la canalización de métricas personalizadas o externas. Esta canalización consta del controlador HorizontalPodAutoscaler, el servidor de la API de métricas de Kubernetes, el adaptador de métricas y la fuente de métricas (por ejemplo, Cloud Monitoring o Prometheus), como se muestra en el siguiente diagrama:
Síntomas
Los síntomas más comunes de un problema en la canalización de métricas son los siguientes:
- El valor de la métrica se muestra como
<unknown>. - Los eventos de HorizontalPodAutoscaler muestran errores como
FailedGetExternalMetricoFailedGetCustomMetric.
Causa
Existe un problema en la canalización de métricas personalizadas o externas.
Solución
Sigue estos pasos para depurar la canalización:
Verifica si el adaptador de métricas está registrado y disponible: El adaptador de métricas debe registrarse con el servidor principal de la API de Kubernetes para publicar métricas. Esta acción es la forma más directa de verificar si el adaptador se está ejecutando y si el servidor de la API puede acceder a él:
kubectl get apiservice | grep -E 'NAME|metrics.k8s.io'En el resultado, deberías ver las entradas
v1beta1.custom.metrics.k8s.ioov1beta1.external.metrics.k8s.ioy un valor deTrueen la columnaAvailable. Por ejemplo:NAME SERVICE AVAILABLE AGE v1beta1.metrics.k8s.io kube-system/metrics-server True 18dSi el valor de la columna
AvailableesFalseo falta, es probable que tu adaptador se haya fallado o esté mal configurado. Verifica los registros del Pod del adaptador en el espacio de nombreskube-systemocustom-metricspara detectar errores relacionados con permisos, conectividad de red a la fuente de la métrica o mensajes que indiquen que no se pudo encontrar la métrica.Si el valor es
True, continúa con el siguiente paso.
Consultar la API de métricas directamente: Si el adaptador está disponible, omite el HorizontalPodAutoscaler y solicita tu métrica directamente a la API de Kubernetes. Este comando prueba toda la canalización, desde el servidor de la API hasta el adaptador de métricas y la fuente de datos.
Para consultar métricas externas, ejecuta el siguiente comando:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/METRIC_NAME" | jq .Para consultar métricas personalizadas del Pod, ejecuta el siguiente comando:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/pods/*/METRIC_NAME" | jq .Reemplaza lo siguiente:
NAMESPACE_NAME: Es el espacio de nombres en el que se ejecutan tus Pods.METRIC_NAME: Es el nombre de la métrica personalizada o externa que intentas consultar. Por ejemplo,requests_per_secondoqueue_depth.
Analiza el resultado del comando: El resultado de los comandos anteriores te indica dónde está el problema. Elige la situación que coincida con tu resultado:
- Respuesta JSON correcta con un valor: La canalización de métricas funciona correctamente. Es probable que el problema se deba a un error de configuración en el manifiesto de HorizontalPodAutoscaler. Verifica si hay errores ortográficos en el nombre de la métrica o si el valor de
matchLabelses incorrecto. Error: Error from server (Service Unavailable): Por lo general, este error indica un problema de conectividad de red, que suele ser un problema de firewall en los clústeres que usan aislamiento de red.Identifica el servicio del adaptador de métricas. Por lo general, se encuentra en el espacio de nombres
custom-metricsokube-system:kubectl get service -n custom-metrics,kube-system | grep -E 'adapter|metrics'Busca el puerto en el que escucha el adaptador:
kubectl get service ADAPTER_SERVICE -n ADAPTER_NAMESPACE -o yamlReemplaza lo siguiente:
ADAPTER_SERVICE: Es el nombre del servicio de Kubernetes asociado con el adaptador de métricas que implementaste. Este Service es el que encontraste en el paso anterior. Este servicio expone la funcionalidad del adaptador a otras partes del clúster, incluido el servidor de la API de Kubernetes.ADAPTER_NAMESPACE: Es el espacio de nombres en el que reside el servicio del adaptador (por ejemplo,custom-metricsokube-system).
Busca las reglas de firewall entrantes para el plano de control de tu clúster:
gcloud compute firewall-rules list \ --filter="name~gke-CLUSTER_NAME-[0-9a-z]*-master"Reemplaza
CLUSTER_NAMEpor el nombre de tu clúster.Agrega el
targetPortdel adaptador a la regla:Describe la regla actual para ver los puertos permitidos existentes:
gcloud compute firewall-rules describe FIREWALL_RULE_NAMEReemplaza
FIREWALL_RULE_NAMEpor el nombre de la regla de firewall que rige el tráfico de red hacia el plano de control de tu clúster de Kubernetes.Actualiza la regla para agregar el puerto del adaptador a la lista:
gcloud compute firewall-rules update FIREWALL_RULE_NAME \ --allow tcp:443,tcp:10250,tcp:ADAPTER_PORTReemplaza
ADAPTER_PORTpor el puerto de red en el que escucha el adaptador de métricas.
Asegúrate de que las políticas de red de Kubernetes no bloqueen el tráfico a los Pods del adaptador de métricas:
kubectl get networkpolicy -n custom-metrics,kube-systemRevisa las políticas para verificar que permitan el tráfico de entrada desde el plano de control o el servidor de la API al
ADAPTER_SERVICEenADAPTER_PORT.
Una lista vacía
[]: Este resultado significa que el adaptador se está ejecutando, pero no puede recuperar la métrica específica, lo que indica un problema con la configuración del adaptador o con la fuente de la métrica.Problemas con el Pod del adaptador: Inspecciona los registros del Pod o los Pods del adaptador de métricas para detectar errores relacionados con las llamadas a la API, la autenticación o la recuperación de métricas. Para inspeccionar los registros, haz lo siguiente:
Busca el nombre del Pod del adaptador:
kubectl get pods -n ADAPTER_NAMESPACEConsulta sus registros:
kubectl logs ADAPTER_POD_NAME \ -n ADAPTER_NAMESPACEReemplaza lo siguiente:
ADAPTER_POD_NAME: Es el nombre del Pod del adaptador que identificaste en el paso anterior.ADAPTER_NAMESPACE: Es el espacio de nombres en el que reside el Pod del adaptador (por ejemplo,custom-metricsokube-system).
No hay datos en la fuente: Es posible que la métrica no exista en el sistema fuente. Usa una herramienta de supervisión, como el Explorador de métricas, para confirmar que la métrica existe y tiene el nombre y las etiquetas correctos.
- Respuesta JSON correcta con un valor: La canalización de métricas funciona correctamente. Es probable que el problema se deba a un error de configuración en el manifiesto de HorizontalPodAutoscaler. Verifica si hay errores ortográficos en el nombre de la métrica o si el valor de
No se encontraron versiones de la métrica o el adaptador no está disponible
Síntomas
Observas el siguiente error:
unable to fetch metrics from custom metrics API: no known available metric versions found
Causa
Este error indica una interrupción de la comunicación dentro del clúster, no un problema con la fuente de métricas (como Cloud Monitoring). Entre las causas comunes, se incluyen las siguientes:
- El servidor de la API de Kubernetes no está disponible temporalmente (por ejemplo, durante una actualización del clúster o una reparación del plano de control).
- Los Pods del adaptador de métricas (por ejemplo,
custom-metrics-stackdriver-adapter) no están en buen estado, no se están ejecutando o no se registraron correctamente en el servidor de la API.
Solución
Este problema suele ser temporal. Si el problema persiste, prueba las siguientes soluciones:
Comprueba el estado del plano de control de Kubernetes:
En la consola de Cloud de Confiance , consulta el estado y la condición de tu clúster.
Ir a la página Clústeres de Kubernetes
Revisa las columnas Estado y Notificaciones de tu clúster.
Haz clic en Notificaciones para buscar operaciones en curso, como actualizaciones o reparaciones. Es posible que el servidor de la API no esté disponible brevemente durante estos períodos.
Revisa los Registros de auditoría de Cloud en busca de errores relacionados con los componentes del plano de control. Para obtener información sobre cómo ver estos registros, consulta Información del registro de auditoría de GKE.
Verifica el estado y los registros de los Pods del adaptador de métricas: Asegúrate de que los Pods del adaptador de métricas tengan el estado
Runningy no se hayan reiniciado recientemente:kubectl get pods -n custom-metrics,kube-system -o wideSi el estado de un Pod es diferente de
Runningo tiene un recuento de reinicios alto, investiga el Pod para encontrar la causa raíz. Para obtener sugerencias sobre cómo solucionar problemas, consulta Cómo depurar Pods en la documentación de Kubernetes.Verifica que las APIs de métricas estén registradas y disponibles:
kubectl get apiservice | grep metrics.k8s.ioSi las APIs de métricas están en buen estado, el resultado es similar al siguiente:
NAME SERVICE AVAILABLE AGE v1beta1.custom.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.external.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.metrics.k8s.io kube-system/metrics-server True 18dSi la columna
AVAILABLEtiene un valor deFalse, la columnaMessageen el manifiesto completo de APIService podría proporcionar más detalles.Puedes ver el manifiesto completo con el siguiente comando:
kubectl get apiservice API_SERVICE_NAME -o yamlReemplaza
API_SERVICE_NAMEpor el nombre del objeto APIService, comov1beta1.custom.metrics.k8s.io.
La consulta de métricas no devuelve ninguna serie temporal
Síntomas
Observas el siguiente error:
unable to fetch metrics from custom or external metrics API: googleapi: Error
400: The supplied filter [...] query will not return any time series
Causa
La consulta enviada a Cloud Monitoring era válida, pero no devolvió datos. Esto significa que no existen puntos de datos que coincidan con tu filtro (lo que es diferente a encontrar una métrica con un valor de 0). La razón más probable de este problema es que la aplicación o la carga de trabajo responsable de generar la métrica personalizada no escribía datos en Cloud Monitoring durante el período en el que se informaron los errores.
Solución
Prueba las siguientes soluciones:
- Verifica la configuración: Asegúrate de que los nombres y las etiquetas de las métricas de tu objeto HorizontalPodAutoscaler coincidan exactamente con los que emite la aplicación.
- Verifica los permisos: Confirma que la aplicación esté configurada correctamente con los permisos y los extremos de API necesarios para publicar métricas en Cloud Monitoring.
- Confirma la actividad de la aplicación: Verifica que la aplicación responsable de la métrica haya estado operativa y haya intentado enviar datos a Cloud Monitoring durante el período en el que se produjeron las advertencias de HorizontalPodAutoscaler.
- Investiga si hay errores: Verifica los registros de la aplicación del mismo período para detectar errores explícitos relacionados con la emisión de métricas, como fallas de conexión, credenciales no válidas o problemas de formato.
Soluciona problemas de comportamientos de escalamiento correctos, pero inesperados
En las siguientes secciones, se abordan situaciones en las que la configuración de HorizontalPodAutoscaler es válida y las métricas están disponibles, pero las acciones de ajuste de escala no se producen según lo esperado.
HorizontalPodAutoscaler está en buen estado, pero no se escala
Síntomas
El HorizontalPodAutoscaler parece estar en buen estado, sus condiciones informan True y no muestra errores en sus eventos. Sin embargo, aún no realiza ninguna acción de ajuste.
Causa
Varios factores pueden causar este comportamiento esperado:
- Límites de réplicas: La cantidad actual de réplicas ya se encuentra en el límite establecido por el campo
minReplicasomaxReplicasen la configuración de HorizontalPodAutoscaler. - Período de tolerancia: Kubernetes usa un período de tolerancia predeterminado del 10% para evitar el ajuste de escala en fluctuaciones menores de las métricas. El ajuste solo se produce si la proporción de la métrica actual con respecto a la métrica objetivo se encuentra fuera del rango de 0.9 a 1.1. Por ejemplo, si el objetivo es el 85% de CPU y el uso actual es del 93%, la proporción es de aproximadamente 1.094 (93/85 ≈ 1.094). Como este valor es inferior a 1.1, HorizontalPodAutoscaler no realiza un ajuste de escala vertical.
- Pods no listos: HorizontalPodAutoscaler solo incluye los Pods con un estado
Readyen sus cálculos de ajuste de escala. Se ignoran los Pods que se atascan con un estadoPendingo que no se convierten enReady(debido a fallas en las verificaciones de estado o problemas de recursos), lo que puede impedir el ajuste de escala. - Demora en el período de sincronización: El controlador de HorizontalPodAutoscaler verifica las métricas de forma periódica. Es normal que haya una demora de entre 15 y 30 segundos entre el momento en que una métrica supera el umbral y el inicio de una acción de ajuste.
- Latencia de métrica nueva: Cuando un HorizontalPodAutoscaler usa una nueva métrica personalizada por primera vez, es posible que veas una latencia única de varios minutos. Este retraso se produce porque el sistema de supervisión (como Cloud Monitoring) debe crear la nueva serie temporal cuando se escribe el primer punto de datos.
- Cálculo de varias métricas: Cuando configuras varias métricas, el HorizontalPodAutoscaler calcula la cantidad de réplicas requerida para cada métrica de forma independiente y, luego, elige el valor calculado más alto como la cantidad final de réplicas. Debido a este comportamiento, tu carga de trabajo se ajusta para satisfacer las demandas de la métrica con las necesidades más altas. Por ejemplo, si las métricas de CPU calculan una necesidad de 9 réplicas, pero una métrica de solicitudes por segundo calcula una necesidad de 15, el HorizontalPodAutoscaler ajusta la cantidad de réplicas de la Deployment a 15.
Solución
Prueba las siguientes soluciones:
- Límites de réplicas: Verifica los valores de
minReplicasymaxReplicasen el manifiesto de HorizontalPodAutoscaler o en el resultado del comandokubectl describe. Ajusta estos límites si impiden el ajuste de escala necesario. - Ventana de tolerancia: Si se requiere un ajuste dentro de la tolerancia predeterminada, configura un valor de tolerancia diferente. De lo contrario, espera a que la métrica se mueva fuera de la proporción de 0.9 a 1.1.
- Pods no listos: Investiga por qué los Pods están en estado
Pendingo no están en estadoReadyy resuelve los problemas subyacentes (por ejemplo, restricciones de recursos, sondeos de disponibilidad con errores). Para obtener sugerencias sobre cómo solucionar problemas, consulta Cómo depurar Pods en la documentación de Kubernetes. - Retraso en el período de sincronización y latencia de métrica nueva: Estas latencias son normales. Espera a que se complete el período de sincronización o a que se cree la nueva serie temporal de la métrica personalizada.
- Cálculo de varias métricas: Este es el comportamiento esperado. Si el aumento se basa en una métrica (como las solicitudes por segundo), se anula correctamente el cálculo inferior de otra métrica (como la CPU).
HorizontalPodAutoscaler no puede reducir la escala
Síntomas
El HorizontalPodAutoscaler aumenta la carga de trabajo correctamente, pero no logra reducirla, incluso cuando las métricas, como el uso de CPU, son bajas.
Causa
Este comportamiento está diseñado para evitar el escalamiento vertical rápido y el escalamiento horizontal, o el escalamiento horizontal basado en información incompleta. Estos son los principales motivos:
- Uso de varias métricas: El HorizontalPodAutoscaler se ajusta según la métrica que requiere la mayor cantidad de réplicas. Si tienes varias métricas, la carga de trabajo no se reducirá a menos que todas las métricas indiquen que se necesitan menos réplicas. Una métrica que exige un recuento de réplicas alto impide la reducción, incluso si otras son bajas.
- Métricas no disponibles: Si alguna métrica deja de estar disponible (a menudo, se muestra como
<unknown>), el HorizontalPodAutoscaler se niega de forma conservadora a reducir la carga de trabajo. No puede determinar si falta la métrica porque el uso es realmente cero o porque la canalización de métricas no funciona. Este problema es común con las métricas personalizadas basadas en la tasa (por ejemplo,messages_per_second), que pueden dejar de registrar datos cuando no hay actividad, lo que hace que HorizontalPodAutoscaler vea la métrica como no disponible y detenga las operaciones de reducción de escala. - Retraso en la reducción de la escala desde la política de ajuste de escala: El campo
behaviorde HorizontalPodAutoscaler te permite configurar políticas de ajuste de escala. La política predeterminada para la reducción vertical incluye un período de estabilización de 300 segundos (cinco minutos). Durante este período, HorizontalPodAutoscaler no reducirá el recuento de réplicas, incluso cuando los valores de las métricas hayan caído por debajo del umbral objetivo. Esta ventana evita las fluctuaciones rápidas, pero puede hacer que la reducción sea más lenta de lo esperado.
Solución
Prueba las siguientes soluciones:
En el caso de varias métricas y métricas no disponibles, diagnostica la métrica que causa problemas:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAMEEn el resultado, busca en la sección
Metricscualquier métrica con el estado<unknown>y, en la secciónEvents, advertencias comoFailedGetCustomMetricoFailedGetExternalMetric. Para obtener información detallada sobre la depuración de canalizaciones, consulta la sección Soluciona problemas relacionados con las métricas externas y personalizadas.En el caso de las métricas no disponibles, si una métrica deja de estar disponible durante períodos de tráfico bajo (algo común con las métricas basadas en tasas), prueba una de las siguientes soluciones:
- Cuando sea posible, usa métricas basadas en indicadores en lugar de métricas basadas en tasas. Una métrica de medición, como la cantidad total de mensajes en una cola (por ejemplo,
subscriptiononum_undelivered_messages), informa un valor de forma coherente, incluso si ese valor es0, lo que permite que el HorizontalPodAutoscaler tome decisiones de escalamiento de manera confiable. - Asegúrate de que tu fuente de métricas informe valores cero. Si controlas la métrica personalizada, configúrala para que publique un
0durante los períodos de inactividad en lugar de no enviar datos.
- Cuando sea posible, usa métricas basadas en indicadores en lugar de métricas basadas en tasas. Una métrica de medición, como la cantidad total de mensajes en una cola (por ejemplo,
En el caso de las demoras en la reducción de la escala de la política de ajuste de escala, si el período de estabilización predeterminado de cinco minutos para las reducciones es demasiado largo, personalízalo. Inspecciona la sección
spec.behavior.scaleDowndel manifiesto de HorizontalPodAutoscaler. Puedes reducir el valor destabilizationWindowSecondspara permitir que el escalador automático reduzca la escala más rápido después de que disminuyan las métricas. Para obtener más información sobre la configuración de estas políticas, consulta Políticas de escalamiento en la documentación de Kubernetes.
¿Qué sigue?
Si no encuentras una solución a tu problema en la documentación, consulta Obtener asistencia para obtener más ayuda, como asesoramiento en los siguientes temas:
- Comunicarse con Atención al cliente de Cloud para abrir un caso de asistencia.
- Hacer preguntas en StackOverflow para obtener asistencia de
la comunidad y usar la etiqueta
google-kubernetes-enginepara buscar problemas similares. También puedes unirte al canal de Slack#kubernetes-enginepara obtener más Asistencia de la comunidad. - Abrir problemas o solicitudes de funciones con la herramienta de seguimiento de errores pública