En esta página, se describe cómo identificar y solucionar problemas de contención de recursos en tu entorno de GKE on VMware.
Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.Descripción general
A veces, tu GKE en VMware puede experimentar una contención de recursos, lo que provoca que tus contenedores se ralenticen, tengan un rendimiento inferior o se cierren. Esto puede ocurrir debido al alto consumo de memoria o CPU por parte de los contenedores.
Cómo funciona la administración de memoria y CPU
CPU:
- Un Pod se programa en un nodo en función de las solicitudes de CPU especificadas por los contenedores en el Pod.
- Un contenedor de un Pod no puede usar más CPU que el límite especificado por el contenedor
- El uso de CPU del contenedor se limita según el límite de CPU.
- Si se limita el uso de la CPU a nivel del nodo, a los contenedores se les asignan automáticamente los ciclos de CPU proporcionales a las solicitudes.
Obtén más información sobre cómo se programan los Pods con solicitudes de recursos.
Memoria:
- Un Pod se programa en un nodo en función de las solicitudes de memoria que especifican los contenedores del Pod.
- Un contenedor no puede usar más memoria que el límite que especifica el contenedor.
- Si no se especifica un límite de memoria, un contenedor puede consumir toda la memoria disponible de un nodo. Luego, el sistema podría activar el OOM-Killer (Out Of Memory Killer) y expulsar los Pods de baja prioridad.
Para obtener más información, consulta Asigna recursos de CPU, Asigna recursos de memoria en Kubernetes y Métricas de GKE Enterprise.
Problemas
El contenedor se vuelve lento
Los problemas de contención de CPU pueden hacer que los contenedores se vuelvan lentos. A continuación, se indican algunos de los motivos posibles:
Uso elevado de CPU en el contenedor:
Un contenedor puede volverse lento si no obtiene ciclos de CPU proporcionales a las solicitudes de CPU o si las solicitudes de CPU se configuraron en un valor demasiado bajo de lo que necesita el contenedor. Por lo tanto, verifica la proporción entre el límite de CPU y el uso de CPU del contenedor.
En la consola de Google Cloud > Supervisión > Explorador de métricas, en el editor de MQL, ejecuta la siguiente consulta:
fetch k8s_container
| metric 'kubernetes.io/anthos/container/cpu/limit_utilization'
| group_by 1m, [value_limit_utilization_mean: mean(value.limit_utilization)]
| filter resource.cluster_name == 'CLUSTER_NAME'
| filter resource.container_name == 'CONTAINER_NAME'
| filter resource.pod_name == 'POD_NAME'
| filter resource.namespace_name == 'NAMESPACE_NAME'
| every 1m
A continuación, realiza una de las siguientes acciones:
- Si esta proporción es alta (>=0.8), significa que el límite de CPU del contenedor es bajo y que Kubernetes limita los ciclos de CPU del contenedor para mantener el uso de CPU dentro del límite. Para resolver este problema, aumenta el límite de CPU del contenedor.
- Si esta proporción no es alta (<0.8), verifica si el uso de CPU es alto en el nodo.
Uso alto de CPU en el nodo
Si la proporción entre el límite de CPU y el uso no es alta para ningún contenedor individual del Pod, es posible que el nodo no tenga suficientes ciclos de CPU para asignar al conjunto de contenedores que se ejecutan en él. Por lo tanto, sigue estos pasos para comprobar la proporción entre el uso real de CPU y las CPU asignables en el nodo:
Obtén el nodo del Pod que funciona con lentitud:
kubectl get pod –kubeconfig CLUSTER_KUBECONFIG --namespace NAMESPACE POD --output wide
En la consola de Google Cloud > Supervisión > Explorador de métricas, en el editor de MQL, ejecuta la siguiente consulta:
fetch k8s_node | metric 'kubernetes.io/anthos/node/cpu/allocatable_utilization' | group_by 1m, [value_allocatable_utilization_mean: mean(value.allocatable_utilization)] | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.node_name == 'NODE_NAME' | every 1m
Si esta proporción es alta (>=0.8), significa que el nodo no tiene suficientes ciclos de CPU y está suscrito en exceso. Por lo tanto, sigue estos pasos para verificar el uso de CPU de todos los demás Pods en ese nodo y, luego, investiga si hay otro contenedor que use más CPU.
- Obtén todos los Pods del nodo:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=NODE_NAME
- Verifica el uso de CPU en cada contenedor:
fetch k8s_container | metric 'kubernetes.io/anthos/container/cpu/limit_utilization' | group_by 1m, [value_limit_utilization_mean: mean(value.limit_utilization)] | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.container_name == 'CONTAINER_NAME' | filter resource.pod_name == 'POD_NAME' | filter resource.namespace_name == 'NAMESPACE_NAME' | every 1m
Si hay otro contenedor que usa una capacidad de CPU alta en el nodo, aumenta las solicitudes de CPU y los límites en el contenedor que funciona con lentitud. De esta manera, se recreará el Pod en otro nodo para obtener los ciclos de CPU requeridos.
Si el Pod del sistema funciona lento, comunícate con el equipo de Atención al cliente de Google.
Sobresuscripción de CPU a nivel de vSphere
Si el consumo de CPU no es alto en el nodo o en el Pod, y el contenedor aún es lento, es posible que la VM esté suscrita de más en el nivel de vSphere. Por lo tanto, el nodo no puede obtener los ciclos de CPU esperados de la virtualización subyacente.
Sigue estos pasos para verificar si la VM está demasiado suscrita. Si se detecta un exceso de suscripciones, prueba lo siguiente:
- Traslada algunas VMs a otros hosts.
- Evaluar y disminuir la cantidad de CPU virtuales por VM para el host
- Asigna más recursos a las VMs de GKE Enterprise.
- Aumenta las solicitudes de CPU y los límites del contenedor. De esta manera, se recreará el Pod en otro nodo para obtener los ciclos de CPU requeridos.
Se elimina el OOM del Pod (se desactiva la memoria).
Los Pods pueden obtener OOMKilled debido a las fugas de memoria o a la mala configuración de las solicitudes de memoria y los límites en los contenedores. A continuación, se indican algunos de los motivos posibles:
Uso elevado de memoria en el contenedor
Un Pod puede inhabilitarse si algún contenedor del Pod consume demasiado la memoria asignada total. Por lo tanto, verifica la proporción entre las solicitudes de memoria y los límites de memoria del contenedor.
En la consola de Google Cloud > Supervisión > Explorador de métricas, en el editor de MQL, ejecuta la siguiente consulta:
fetch k8s_container
| metric 'kubernetes.io/anthos/container/memory/limit_utilization'
| filter (metric.memory_type == 'non-evictable')
| group_by 1m, [value_limit_utilization_mean: mean(value.limit_utilization)]
| filter resource.cluster_name == 'CLUSTER_NAME'
| filter resource.container_name == 'CONTAINER_NAME'
| filter resource.pod_name == 'POD_NAME'
| filter resource.namespace_name == 'NAMESPACE_NAME'
| every 1m
A continuación, realiza una de las siguientes acciones:
- Si esta proporción es alta (>= 0.8), aumenta el límite de memoria del contenedor.
- Si esta proporción no es alta (<0.8), verifica si el uso de memoria del nodo es alto.
Uso elevado de memoria en el nodo
Un Pod puede perderse si el uso de memoria de todos los Pods que se ejecutan en el nodo supera la memoria disponible. Por lo tanto, verifica si la condición MemoryPressure
del nodo es True
.
Ejecuta el siguiente comando y, luego, inspecciona la sección
Conditions
:kubectl describe nodes --kubeconfig CLUSTER_KUBECONFIG NODE-NAME
Si la condición
MemoryPressure
esTrue
, verifica el uso de memoria en el nodo:fetch k8s_node | metric 'kubernetes.io/anthos/node/memory/allocatable_utilization' | filter (metric.memory_type == 'non-evictable') | group_by 1m, [value_allocatable_utilization_mean: mean(value.allocatable_utilization)] | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.node_name = 'NODE_NAME' | every 1m
Si esta proporción es alta (>= 0.8), significa que el nodo no tiene suficiente memoria para asignar al Pod, posiblemente debido a que algunos procesos o algún otro Pod consumen mucha memoria.
En la consola de Google Cloud > Supervisión > Explorador de métricas, en el editor de MQL, ejecuta la siguiente consulta para verificar el uso de memoria de los contenedores en el nodo:
fetch k8s_node | metric 'kubernetes.io/anthos/container_memory_usage_bytes' | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.node_name == 'NODE_NAME' | group_by 1m, [value_container_memory_usage_bytes_mean: mean(value.container_memory_usage_bytes)] | every 1m
Si hay un contenedor que usa memoria alta, investiga su funcionamiento o aumenta la solicitud de memoria del contenedor, si es necesario.
Si se trata de un Pod del sistema que consume mucha memoria, comunícate con el equipo de Atención al cliente de Google.
Además, puedes habilitar la función de ajuste de escala automático en GKE en VMware para aumentar o reducir la escala verticalmente de forma automática de los grupos de nodos según las demandas de tus cargas de trabajo.
Obtén información sobre cómo habilitar el escalador automático.
Problemas con etcd
A veces, tus clústeres de Anthos alojados en VMware pueden experimentar fallas de contenedor debido a los problemas del servidor etcd, y es posible que observes lo siguiente:
Registros repetidos del servidor de la API con el siguiente formato:
etcdserver: request timed out
yetcdserver: leader changed
Registros de etcd repetidos con el formato:
W | wal: sync duration of 2.466870869s, expected less than 1s
yW | etcdserver: read-only range request * took too long
A continuación, se indican algunos de los motivos posibles:
Limitación de la CPU
El servidor de etcd puede ser lento debido a la limitación de la CPU en el Pod del servidor de etcd o en el nodo en el que se ejecuta el servidor de etcd. Consulta los pasos en la sección El contenedor se vuelve lento para verificar cualquier problema de contención de la CPU.
Si detectas la contención de la CPU en el Pod del servidor ectd o en el nodo, agrega las CPU al nodo del plano de control del clúster de usuario. Usa gkectl update para editar el campo cpus
en el archivo de configuración del clúster de usuario.
OOM del Pod de Etcd
El Pod de etcd podría inhabilitarse debido a problemas de contención de recursos. Consulta los pasos de la sección El Pod se elimina (sin memoria) para verificar si hay problemas de contención de memoria con el Pod del servidor de etcd o con el nodo en el que se ejecuta el servidor de etcd.
Si detectas OOMkills para el Pod de etcd, aumenta la memoria disponible para el nodo del plano de control del clúster de usuario. Usa gkectl update para editar el campo memoryMB
en el archivo de configuración del clúster de usuario.
Lentitud del disco
Si no hay problemas con el consumo de CPU o memoria en el nodo o el Pod del servidor de etcd, el etcd puede ser lento si el almacén de datos subyacente es lento o limitado.
Verifica los siguientes problemas:
Para verificar si el servidor de etcd tarda demasiado en leer o escribir en el disco subyacente, sigue estos pasos:
Obtén los registros de etcd:
kubectl –kubeconfig ADMIN_CLUSTER_KUBECONFIG logs -n ETCD_POD_NAMESPACE ETCD_POD
Busca las entradas del siguiente patrón para detectar si etcd tarda demasiado en leer desde el disco:
W | etcdserver: read-only range request "key:\"/registry/configmaps/default/clusterapi-vsphere-controller-manager-leader-election\" " with result "range_response_count:1 size:685" took too long (6.893127339s) to execute
Busca las entradas del siguiente patrón para detectar si etcd tarda demasiado en escribir en el disco:
W | wal: sync duration of 2.466870869s, expected less than 1s
Si alguno de los patrones de registro anteriores o ambos se muestran con frecuencia en los registros de etcd, esto indica que el disco es lentitud. Luego, verifica el rendimiento del almacén de datos y de los discos.
Para verificar las métricas de etcd, haz lo siguiente:
Recupera las latencias de sincronización de WAL de etcd:
En la consola de Google Cloud > Supervisión > Explorador de métricas, en el editor de MQL, ejecuta la siguiente consulta:
fetch k8s_container::kubernetes.io/anthos/etcd_disk_wal_fsync_duration_seconds | every 1m | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.pod_name == 'POD_NAME' | filter resource.namespace_name == 'NAMESPACE_NAME' | percentile 99
Recupera las latencias de escritura de etcd:
En la consola de Google Cloud > Supervisión > Explorador de métricas, en el editor de MQL, ejecuta la siguiente consulta:
fetch k8s_container::kubernetes.io/anthos/etcd_disk_backend_commit_duration_seconds | every 1m | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.pod_name == 'POD_NAME' | filter resource.namespace_name == 'NAMESPACE_NAME' | percentile 99
Si
p99
paraetcd_disk_wal_fsync_duration_seconds
supera continuamente 10 ms o sip99
paraetcd_disk_backend_commit_duration_seconds
supera continuamente 25 ms, significa que el disco es lento. Luego, verifica el rendimiento del almacén de datos y de los discos.
Latencias de lectura/escritura en el disco de la VM
Sigue estos pasos para verificar las latencias de lectura/escritura en el disco virtual de la VM
Identifica el nodo del Pod de etcd lento:
kubectl –kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods -n ETCD_POD_NAMESPACE ETCD_POD -owide
Accede a vSphere y selecciona la VM identificada en el paso anterior. En vSphere, ve a Monitor > Performance > Advanced y selecciona Virtual Disk en la sección View para identificar las latencias de lectura y escritura de los discos virtuales.
Si la latencia de lectura o escritura del disco virtual es alta, haz lo siguiente:
- Examina otras VMs que se ejecuten en el almacén de datos para verificar el alto uso de operaciones de entrada y salida por segundo (IOPS). Si alguna VM tiene aumentos repentinos en las IOPS, evalúa su funcionamiento.
- Consulte con su equipo de laboratorio o infraestructura para asegurarse de que el ancho de banda de lectura y escritura no esté limitado ni limitado en ningún momento.
- Consulta al equipo de laboratorio o de infraestructura para identificar los problemas de rendimiento del disco y rendimiento del almacenamiento, si corresponde.
Si deseas obtener más información, consulta las prácticas recomendadas para escalar tus recursos.
Problemas con el servidor de la API
Si los contenedores de tu GKE en VMware experimentan latencia mientras se comunican con el servidor de la API, o los comandos de Kubectl fallan o tardan demasiado en responder, esto podría indicar que hay problemas con el servidor de la API.
A continuación, se indican algunos de los motivos posibles:
Gran volumen de solicitudes a la API
Es posible que el servidor de la API responda lento si la frecuencia y el volumen de las solicitudes que recibe son demasiado altos. El tiempo de respuesta lento puede persistir incluso después de que el servidor de la API comienza a limitar las solicitudes. Así que verifica la tasa de solicitudes a la API en el servidor de la API.
En la consola de Google Cloud > Supervisión > Explorador de métricas, en el editor de MQL, ejecuta la siguiente consulta:
fetch k8s_container::kubernetes.io/anthos/apiserver_request_total
| filter resource.cluster_name == 'CLUSTER_NAME'
| filter resource.pod_name == 'APISERVER_POD_NAME'
| filter resource.namespace_name == 'NAMESPACE_NAME'
| align rate(1m)
| every 1m
| group_by [metric.verb]
Si hay un aumento inesperado en las solicitudes a la API, usa Cloud Audit Logging para identificar el Pod que podría estar consultando al servidor de la API con demasiada frecuencia.
- Si se trata de un Pod del sistema, comunícate con el equipo de Atención al cliente de Google.
- Si se trata de un Pod de usuario, investiga más a fondo para determinar si se esperan las solicitudes a la API.
Limitación de la CPU
Una tasa alta de solicitudes en el servidor de la API puede provocar la limitación de la CPU. Entonces, el servidor de la API podría volverse lento debido a la contención de la CPU en el Pod del servidor de la API o en el nodo.
Consulta la sección El contenedor se vuelve lento para verificar cualquier problema de contención de la CPU con el Pod o el nodo.
Pod del servidor de la API finalizado en OOM
El Pod del servidor de la API podría finalizarse en OOM debido a problemas de contención de recursos. Consulta los pasos en la sección El Pod se elimina (sin memoria) para verificar si hay problemas de contención de memoria con el Pod o el nodo.
Respuestas lentas de etcd
El servidor de la API depende de la comunicación con el clúster de etcd para entregar solicitudes de lectura y escritura a los clientes. Si el etcd es lento o no responde, el servidor de la API también se vuelve lento.
Recupera los registros del servidor de la API para verificar si el servidor de la API es lento debido a los problemas de etcd:
kubectl –kubeconfig ADMIN_CLUSTER_KUBECONFIG logs -n APISERVER_NAMESPACE APISERVER_POD_NAME
Si observas registros recurrentes, como etcdserver: request timedout
o etcdserver: leader changed
, sigue los pasos que se indican en Problemas de Etcd para resolver cualquier problema relacionado con los discos.