Salta al contenuto

Come posso recuperare i log del piano di controllo (control-plane) di Amazon EKS da CloudWatch Logs?

9 minuti di lettura
0

Desidero risolvere un problema di Amazon Elastic Kubernetes Service (Amazon EKS). Devo recuperare i log di CloudWatch dai componenti in esecuzione sul piano di controllo (control-plane) EKS.

Risoluzione

Prerequisito: per visualizzare gli eventi di log in Amazon CloudWatch Logs, devi attivare la registrazione del piano di controllo (control-plane) di Amazon EKS nel cluster. Per ulteriori informazioni, consulta Visualizza i log del piano di controllo (control-plane) del cluster.

Utilizza Amazon CloudWatch Logs Insights per accedere ai log del piano di controllo (control-plane) di Amazon EKS. Quindi esegui una query sui dati di log del piano di controllo (control-plane) di EKS.

Per ulteriori informazioni, consulta Analisi dei dati di log con CloudWatch Logs Insights.

Visualizza i log del piano di controllo (control-plane) di Amazon EKS

Completa i seguenti passaggi:

  1. Apri la console CloudWatch.
  2. Nel pannello di navigazione, scegli Log, quindi seleziona Log Insights.
  3. Nel menu Seleziona uno o più i gruppi di log, seleziona il gruppo di log del cluster su cui desideri eseguire query.
  4. Scegli Esegui per visualizzare i risultati.

Nota: per esportare i risultati come file .csv o copiare i risultati negli appunti, scegli Esporta risultati. Puoi modificare l'esempio di query per ottenere dati per un caso d'uso specifico.

Esempi di query per i casi d'uso più comuni di EKS

Vedi i seguenti esempi di query per i casi d'uso più comuni di EKS:

Nota: puoi salvare ed eseguire nuovamente le query in Amazon CloudWatch Logs Insights.

Individua le modifiche mutanti

Esegui questa query per individuare le modifiche mutanti apportate alla ConfigMap 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  

Individua le richieste negate

Esegui questa query per individuare i messaggi che contengono uno stato denied:

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

Individua il nodo di un pod pianificato

Esegui questa query per individuare il nodo su cui è stato pianificato 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: sostituisci example-pod-name con il nome del tuo pod.

Individua gli errori del server HTTP 5xx

Esegui questa query per individuare gli errori del server HTTP 5xx per le richieste del server API Kubernetes:

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

Risolvi i problemi di attivazione di un oggetto CronJob

Esegui questa query per individuare le chiamate API effettuate da 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

Individua le chiamate API replicaset-controller

Esegui questa query per individuare le chiamate API effettuate da 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

Individua e conta i codici di risposta HTTP

Esegui questa query per contare il numero di codici di risposta HTTP per le chiamate effettuate al server API Kubernetes:

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

Esempio di output:

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

Nota: le statistiche dei codici di risposta del server API mostrano 35.066 occorrenze di richiesta riuscita per HTTP 200, 525 occorrenze di risorsa creata per HTTP 201, 125 occorrenze di richiesta vietata per HTTP 403, 116 occorrenze di errore non trovato per HTTP 404 e 2 occorrenze di richiesta di commutazione di protocollo per HTTP 101.

Individua le modifiche apportate a DaemonSets/Addons

Esegui questa query per individuare le modifiche apportate a DaemonSets/Addons nel namespace 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

Individua le chiamate di patch, aggiornamento, creazione ed eliminazione

Esegui questa query per individuare tutte le chiamate di patch, aggiornamento, creazione ed eliminazione relative a una specifica distribuzione e a specifici pod di distribuzione:

`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: sostituisci example-deployment-name con il nome della distribuzione. Nella query precedente, puoi rimuovere la riga | filter objectRef.resource not like /events/ per escludere eventi.

Identifica l'utente che ha eliminato un nodo o una risorsa

Esegui questa query per individuare l'utente che ha eliminato 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

Esegui questa query per individuare l'utente che ha eliminato una risorsa, ad esempio una ConfigMap, un pod o una distribuzione:

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: sostituisci aws-auth con il nome del tuo pod per individuare le chiamate di eliminazione per il tuo pod.

Individua la versione dell'immagine di una distribuzione

Esegui questa query per individuare la versione dell'immagine di una distribuzione:

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: sostituisci example-deployment-name con il nome della distribuzione.

Identifica gli eventi per un nodo specifico

Esegui questa query per individuare un nodo che non è stato aggiornato:

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

Nota: sostituisci example-node-name con il nome del tuo nodo.
Esegui questa query per verificare il tempo dell'ultima transizione per i parametri di un nodo specifico:

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: sostituisci example-node-name con il nome del tuo nodo.

Identifica l'utente che ha reso indisponibile un nodo

Esegui questa query per individuare l'utente che ha reso indisponibili nodi specifici o ha reso i nodi non pianificabili:

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: sostituisci example-node-IP con l'indirizzo IP del tuo nodo.

Identifica il PoDip di un pod eliminato

Esegui questa query per trovare il podIP di un pod eliminato:

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: sostituisci example-pod-name con il nome del tuo pod.

Individua l'output dell'oggetto di un pod sconosciuto

Esegui questa query per visualizzare l'output della descrizione di un pod eliminato senza il nome 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: sostituisci example-deployment-name con il nome della tua distribuzione e example-namespace con il tuo namespace. Se non sono più presenti oggetti con lo stesso nome in più namespace, rimuovi la riga che contiene filter requestURI like.

Individua il nodo di un pod pianificato

Esegui questa query per individuare il nodo su cui hai pianificato 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: sostituisci example-pod-name con il nome del tuo pod.

Verifica la presenza di un'API eviction

Nota: se le patch del sistema operativo di AWS Fargate hanno eliminato i pod o i nodi, nei log di controllo viene visualizzata l'API eviction.

Esegui questa query per verificare se nei log di controllo appare un'API eviction:

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'

Esegui questa query per individuare l'evento della chiamata API eviction:

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

Individua l'ID attività di un pod Fargate

Esegui questa query per individuare l'ID attività del pod Fargate:

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

Nota: nella query precedente, sostituisci example-fargate-node-IP con l'indirizzo IP del tuo nodo Amazon Fargate.

Identifica un URL che riceve errori

Esegui questa query per individuare un URL che riceve più di un certo numero di errori 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: sostituisci example-filter-count con il numero minimo di errori che l'output della query deve visualizzare.

Risolvi gli errori di webhook

Esegui questa query per individuare gli errori di webhook:

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)

Elenca i controlli dell'integrità del server API non superati

Esegui questa query per elencare i controlli dell'integrità del server API che non sono stati superati:

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

Conta le richieste provenienti da oggetti Kubernetes e userAgent in CloudWatch Logs Insights

Esegui questa query per contare le richieste provenienti da oggetti Kubernetes e userAgent in CloudWatch Logs Insights:

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

Visualizza i log frequenti

Esegui questa query per visualizzare i log più frequenti:

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
AWS UFFICIALEAggiornata 7 mesi fa