Saltar al contenido

¿Cómo puedo recuperar los registros del plano de control de Amazon EKS de Registros de CloudWatch?

10 minutos de lectura
0

Quiero solucionar un problema de Amazon Elastic Kubernetes Service (Amazon EKS). Necesito recopilar los registros de CloudWatch de los componentes que se ejecutan en el plano de control de EKS.

Solución

Requisito previo: Para ver los eventos de registro en Registros de Amazon CloudWatch, debes activar el registro del plano de control de Amazon EKS en tu clúster. Para obtener más información, consulta Visualización de registros del plano de control del clúster.

Utiliza Información de registros de Amazon CloudWatch para acceder a los registros del plano de control de Amazon EKS. A continuación, consulta los datos de registro del plano de control de EKS.

Para obtener más información, consulta Análisis de datos de registro con Información de registros de CloudWatch.

Visualización de los registros del plano de control de Amazon EKS

Sigue estos pasos:

  1. Abre la consola de CloudWatch.
  2. En el panel de navegación, elige Registros y, a continuación, selecciona Información de registros.
  3. En el menú Seleccionar grupos de registros, selecciona el grupo de registro del clúster que deseas consultar.
  4. Selecciona Ejecutar para ver los resultados.

Nota: Para exportar los resultados como un archivo .csv o copiarlos al portapapeles, selecciona Exportar resultados. Puedes cambiar la consulta de ejemplo para obtener datos para un caso práctico específico.

Ejemplos de consultas para casos prácticos comunes de EKS

Consulta los siguientes ejemplos de consultas para ver los casos prácticos comunes de EKS:

Nota: Puedes guardar y volver a ejecutar las consultas en Información de registros de Amazon CloudWatch.

Búsqueda de cambios mutantes

Ejecuta la siguiente consulta para buscar los cambios mutantes realizados en el ConfigMap de aws-auth:

fields @logStream, @timestamp, @message  
| filter @logStream like /^kube-apiserver-audit/  
| filter requestURI like /\/api\/v1\/namespaces\/kube-system\/configmaps/  
| filter objectRef.name = "aws-auth"  
| filter verb like /(create|delete|patch)/  
| sort @timestamp desc  
| limit 50  

Localización de las solicitudes denegadas

Ejecuta la siguiente consulta para buscar mensajes que contengan un estado denegado:

fields @logStream, @timestamp, @message  
| filter @logStream like /authenticator/  
| filter @message like "denied"  
| sort @timestamp asc  
| limit 50

Búsqueda del nodo de un pod programado

Ejecuta la siguiente consulta para buscar el nodo en el que se programó un pod:

fields  @timestamp, @message  
| filter @logStream like /kube-scheduler/  
| filter @message like "example-pod-name"  
| filter @message like "ip-"  
| sort @timestamp asc  
| limit 3

Nota: Sustituye example-pod-name por el nombre del pod.

Búsqueda de errores del servidor HTTP 5xx

Ejecuta la siguiente consulta para encontrar errores del servidor HTTP 5xx en las solicitudes del servidor de la API de Kubernetes:

fields @logStream, @timestamp, responseStatus.code, @message  
| filter @logStream like /^kube-apiserver-audit/  
| filter responseStatus.code >= 500  
| limit 50

Solución de problemas de activación de un objeto CronJob

Ejecuta la siguiente consulta para buscar las llamadas a la API que realizó cronjob-controller:

fields @logStream, @timestamp, @message  
| filter @logStream like /kube-apiserver-audit/  
| filter user.username like "system:serviceaccount:kube-system:cronjob-controller"  
| display @logStream, @timestamp, @message, objectRef.namespace, objectRef.name  
| sort @timestamp desc  
| limit 50

Búsqueda de llamadas a la API de replicaset-controller

Ejecuta la siguiente consulta para buscar las llamadas a la API que realizó replicaset-controller:

fields @logStream, @timestamp, @message  
| filter @logStream like /kube-apiserver-audit/  
| filter user.username like "system:serviceaccount:kube-system:replicaset-controller"  
| display @logStream, @timestamp, requestURI, verb, user.username  
| sort @timestamp desc  
| limit 50

Búsqueda y recuento de códigos de respuesta HTTP

Ejecuta la siguiente consulta para contar la cantidad de códigos de respuesta HTTP para las llamadas realizadas al servidor de la API de Kubernetes:

fields @logStream, @timestamp, @message  
|filter @logStream like /^kube-apiserver-audit/  
| stats count(*) as count by responseStatus.code  
| sort count desc

Resultado de ejemplo:

responseStatus.code,count  
200,35066  
201,525  
403,125  
404,116  
101,2

Nota: Las estadísticas del código de respuesta del servidor de la API muestran 35 066 solicitudes correctas para HTTP 200, 525 recursos creados para HTTP 201, 125 solicitudes prohibidas para HTTP 403, 116 errores not found para HTTP 404 y 2 solicitudes de protocolo de conmutación para HTTP 101.

Búsqueda de los cambios realizados en DaemonSets/Complementos

Ejecuta la siguiente consulta para encontrar los cambios que has realizado en los DaemonSets/complementos en el espacio de nombres kube-system:

filter @logStream like /^kube-apiserver-audit/  
| fields @logStream, @timestamp, @message  
| filter verb like /(create|update|delete)/ and strcontains(requestURI,"/apis/apps/v1/namespaces/kube-system/daemonsets")  
| sort @timestamp desc  
| limit 50

Búsqueda de llamadas de parches, actualización, creación y eliminación

Ejecuta la siguiente consulta para buscar todas las llamadas de parches, actualización, creación y eliminación relacionadas con un despliegue y unos pods de despliegue específicos:

`fields @timestamp,verb, objectRef.name, objectRef.resource, requestObject.message   | filter objectRef.name like /example-deployment-name/   | filter objectRef.resource not like /serviceaccounts/   `| filter objectRef.resource not like /events/`   | filter verb like /create|delete|patch|update/   | sort @timestamp asc`

Nota: Sustituye example-deployment-name por el nombre del despliegue. En la consulta anterior, puedes eliminar la línea | filter objectRef.resource not like /events/ para excluir eventos.

Identificación del usuario que ha eliminado un nodo o un recurso

Ejecuta la siguiente consulta para buscar el usuario que ha eliminado un nodo:

fields @logStream, @timestamp, @message  
| filter @logStream like /^kube-apiserver-audit/  
| filter verb == "delete" and requestURI like "/api/v1/nodes"  
| sort @timestamp desc  
| limit 10

Ejecuta la siguiente consulta para buscar el usuario que ha eliminado un recurso, como un ConfigMap, un pod o un despliegue:

fields @timestamp,verb, user.username, user.extra.arn.0, user.extra.canonicalArn.0   
| filter  objectRef.name like /aws-auth/  
| filter verb like /delete/  
| sort @timestamp asc

Nota: Sustituye aws-auth por el nombre del pod para buscar las llamadas de eliminación del pod.

Búsqueda de la versión de imagen de un despliegue

Ejecuta la siguiente consulta para buscar la versión de imagen de un despliegue:

fields @timestamp, verb, objectRef.name,  objectRef.resource  
| filter objectRef.name like /example-deployment-name/  
| filter @message like /image/  
| filter objectRef.resource  like /deployments/  
| parse requestObject.spec.template.spec ‘image”:*,’ as image  
| sort @timestamp asc  
| limit 10000

Nota: Sustituye example-deployment-name por el nombre del despliegue.

Identificación de eventos para un nodo específico

Ejecuta la siguiente consulta para localizar un nodo que no se haya actualizado:

fields @timestamp, @message, @logStream  
| sort @timestamp asc  
| filter @message like "node example-node-name hasn't been updated for"

Nota: Sustituye example-node-name por el nombre de tu nodo.
Ejecuta la siguiente consulta para comprobar el último tiempo de transición para los parámetros de un nodo específico:

fields @timestamp  
| parse responseObject.status.conditions.0 "lastTransitionTime*" as MemoryPressure  
| parse responseObject.status.conditions.1 "lastTransitionTime*" as DiskPressure  
| parse responseObject.status.conditions.2 "lastTransitionTime*" as PIDPressure  
| parse responseObject.status.conditions.3 "lastTransitionTime*" as ReadyStatus  
| parse responseObject.status.conditions.3 "lastTransitionTime*" as Timepass  
| filter objectRef.name like /example-node-name/  
| filter verb like /patch/  
| filter @message like /lastTransitionTime/  
| sort @timestamp asc

Nota: Sustituye example-node-name por el nombre de tu nodo.

Identificación del usuario que acordonó un nodo

Ejecuta la siguiente consulta para encontrar el usuario que acordonó nodos específicos o hizo que los nodos no se pudieran programar:

fields @timestamp, objectRef.name as node_name, verb,user.username, user.extra.sessionName.0 as name, requestObject.spec.unschedulable as unschedulable_flag| filter @logStream like /kube-apiserver-audit/  
| filter @message like /example-node-IP/  
| filter verb like /patch/  
| filter requestObject.spec.unschedulable like /1/

Nota: Sustituye example-node-IP por la dirección IP del nodo.

Identificación del PodIP de un pod eliminado

Ejecuta la siguiente consulta para buscar el podIP de un pod eliminado:

fields @timestamp,objectRef.name as pod, requestObject.status.podIP as podIP  
| filter @logStream like /kube-apiserver-audit/  
| filter objectRef.name = "example-pod-name"  
| filter verb like /patch/  
| filter ispresent(requestObject.status.podIP)  
| sort @timestamp asc

Nota: Sustituye example-pod-name por el nombre del pod.

Búsqueda de la salida del objeto de un pod desconocido

Ejecuta la siguiente consulta para ver el resultado de la descripción de un pod eliminado sin el nombre del pod:

fields @timestamp, requestURI, requestObject.message  
| filter requestURI like '/api/v1/namespaces/example-namespace/events'   
| filter  responseObject.involvedObject.name like /example-deployment-name/  
| sort @timestamp asc

Nota: Sustituye example-deployment-name por el nombre del despliegue y example-namespace por el espacio de nombres. Si no hay varios objetos con el mismo nombre en varios espacios de nombres, elimina la línea que contiene filter requestURI like.

Búsqueda del nodo de un pod programado

Ejecuta la siguiente consulta para buscar el nodo en el que has programado un pod:

fields  @timestamp, @message  
| filter @logStream like /kube-scheduler/  
| filter @message like "example-pod-name"  
| filter @message like "ip-"  
| sort @timestamp asc  
| limit 3

Nota: Sustituye example-pod-name por el nombre del pod.

Comprobar si hay una API de expulsión

Nota: Si los parches del sistema operativo (SO) AWS Fargate eliminaron tus pods o nodos, la API de expulsión aparecerá en los registros de auditoría.

Ejecuta la siguiente consulta para comprobar si aparece una API de expulsión en tus registros de auditoría:

filter @logStream like /kube-apiserver-audit/  
| fields @timestamp, user.username,user.extra.canonicalArn.0, responseStatus.code, responseObject.status, responseStatus.message  
| sort @timestamp asc  
| filter verb == "create" and objectRef.subresource == 'eviction'

 Ejecuta la siguiente consulta para encontrar el evento de la llamada a la API de expulsión:

fields @logStream, @timestamp, @message   
| sort @timestamp asc   
| filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod"

Búsqueda del ID de tarea de un pod de Fargate

Ejecuta la siguiente consulta para encontrar el ID de la tarea del pod Fargate:

fields @timestamp, verb, responseObject.spec.providerID as InstanceID  
| filter @message like /example-fargate-node-IP/  
| filter ispresent(responseObject.spec.providerID)

Nota: En la consulta anterior, sustituye example-fargate-node-IP por la dirección IP de tu nodo de Amazon Fargate.

Identificación de una URL que recibe errores

Ejecuta la siguiente consulta para buscar una URL que reciba más de un número determinado de errores 4## o 5##:

fields requestURI   
| filter @logStream like "kube-apiserver-audit-i"   
| filter count > example-filter-count   
| stats count(*) as count by requestURI, responseStatus.code   
| filter responseStatus.code >= 400  
| sort count desc

Nota: Sustituye example-filter-count por el número mínimo de errores que debe mostrar el resultado de la consulta.

Solución de errores de webhooks

Ejecuta la siguiente consulta para buscar errores con los webhooks:

fields @timestamp, @message  
| filter @logStream like /kube-apiserver/ and @logStream not like /kube-apiserver-audit/  
| filter @message like /failed calling webhook/  
| sort @timestamp desc  
| stats count(*) by bin(1m)

Enumeración de las comprobaciones de estado fallidas del servidor de la API

Ejecuta la siguiente consulta para enumerar las comprobaciones de estado del servidor de la API que fallaron:

fields @message  
| sort @timestamp asc  
| filter @logStream like "kube-apiserver"  
| filter @logStream not like "kube-apiserver-audit"  
| filter @message like "healthz check failed"

Recuento de los objetos de Kubernetes y userAgent de Información de registros de CloudWatch

Ejecuta la siguiente consulta para contar las solicitudes de los objetos de Kubernetes y userAgent de Información de registros de CloudWatch:

fields @timestamp, @message, @logStream  
| filter @logStream like "kube-apiserver-audit"   
| display @logStream, requestURI, verb   
| stats count(*) as count by objectRef.resource, userAgent  
| sort count desc  
| display objectRef.resource, userAgent, count

Visualización de registros frecuentes

Ejecuta la siguiente consulta para ver los registros más frecuentes:

fields @timestamp, @message, @logStream  
| filter @logStream not like /kube-apiserver-audit/  
| parse @message "*] *" as loggingTimeStamp, loggingMessage  
| stats count(*) as count by loggingMessage   
| sort count desc
OFICIAL DE AWSActualizada hace 4 meses