Perché non posso raccogliere metriche da container, pod o nodi utilizzando Metrics Server in Amazon EKS?
Non riesco a raccogliere metriche da container, pod o nodi con Metrics Server nel mio cluster Amazon Elastic Kubernetes Service (Amazon EKS).
Breve descrizione
In Amazon EKS, Metrics Server non è installato per impostazione predefinita. Se hai creato il tuo cluster di recente e non riesci a raccogliere metriche dai container utilizzando Metrics Server, conferma di aver distribuito l'applicazione Metrics Server nel tuo cluster.
Se ancora non riesci a raccogliere le metriche con Metrics Server, completa i passaggi nelle seguenti sezioni:
- Verifica se puoi recuperare le metriche dai nodi e dai pod del tuo cluster.
- Verifica se l'APIService è disponibile e può gestire le richieste.
- Controlla GitHub per i problemi più comuni.
- Controlla il tuo Horizontal Pod Autoscaler (HPA) e le richieste di risorse applicative se le metriche vengono visualizzate come <unknown>.
Nota: Metrics Server non è destinato al monitoraggio a lungo termine delle prestazioni di applicazioni e cluster. Per il monitoraggio a lungo termine, consulta Resource management for pods and containers sul sito web di Kubernetes. La community Kubernetes gestisce Metrics Server e segnala i problemi sulla sua pagina GitHub.
Risoluzione
Fai riferimento ai seguenti passaggi per risolvere alcuni dei problemi più comuni con Metrics Server.
Verifica se riesci a recuperare le metriche dai nodi e dai pod del tuo cluster
Verifica la presenza di errori tra il server dell’API e Metrics Server. Per estrarre le metriche dai nodi e dai pod del cluster, esegui i seguenti comandi:
$ kubectl top nodes
$ kubectl top pods
Se non ricevi un errore da nessuno dei due comandi, consulta la sezione Verifica se APIService è disponibile e può gestire le richieste.
Se ricevi un errore, completa i passaggi in una delle seguenti sezioni in base all'errore che hai ricevuto:
- Errore dal server (vietato)
- Errore dal server (servizio non disponibile)
- Client.Timeout superato in attesa delle intestazioni
- Connessione rifiutata
Errore dal server (vietato)
Questo messaggio di errore indica che hai un problema con l'autorizzazione RBAC. Per risolvere questo errore, conferma quanto segue:
- Il ServiceAccount è collegato correttamente alla distribuzione.
- Il ClusterRole/Role e ClusterRoleBinding/RoleBindings utilizzano le autorizzazioni RBAC corrette per Metrics Server.
Per ulteriori informazioni, consulta Using RBAC authorization sul sito web di Kubernetes.
Se accedi al tuo cluster tramite un ruolo definito in aws-auth ConfigMap, conferma di aver impostato il campo username e la mappatura.
-
Per descrivere la ConfigMap aws-auth, esegui il seguente comando:
$ kubectl describe -n kube-system configmap aws-auth
-
Conferma che il campo username sia impostato per il ruolo che accede al cluster. Considera il seguente esempio:
Name: aws-auth Namespace: kube-system Labels: <none> Annotations: <none> Data ==== mapRoles: ---- ... - groups: - system:masters rolearn: arn:aws:iam::123456789123:role/kubernetes-devops username: devops:{{SessionName}} # Ensure this has been specified.
Errore dal server (servizio non disponibile)
Per verificare la presenza di un problema con la configurazione dell'applicazione di servizio Metrics Server nel cluster, esegui il comando seguente:
$ kubectl describe apiservices v1beta1.metrics.k8s.io
L'output sarà simile al seguente esempio:
Name: v1beta1.metrics.k8s.io Namespace: Labels: app=metrics-server ... Status: Conditions: Last Transition Time: 2020-01-09T13:57:23Z Message: all checks passed Reason: Passed Status: True Type: Available Events: <none>
Se il servizio Metrics Server è disponibile e supera i controlli, Status è impostato su True.
Se imposti Status su True e il problema persiste, consulta la sezione Verifica se APIService è disponibile e può gestire le richieste.
Se Status è impostato su False, cerca il codice Reason associato e il Message relativo alle Conditions leggibile dall'uomo nell'output. Guarda il seguente esempio di un APIService fallito:
... Status: Conditions: Last Transition Time: 2020-01-09T14:40:28Z Message: no response from https://10.0.35.231:443: Get https://10.0.35.231:443: dial tcp 10.0.35.231:443: connect: connection refused Reason: FailedDiscoveryCheck Status: False Type: Available
Se Reason non è FailedDiscoveryCheck, consulta la sezione Altre cause di errore della condizione APIServer.
Se il codice del motivo è FailedDiscoveryCheck, il servizio Metrics Server è disponibile e i pod sono in esecuzione. Kubernetes APIServer restituisce un errore quando tenta di raggiungere l'endpoint Metrics Server.
Se il messaggio sulle condizioni di APIServer contiene "Client.Timeout superato durante l'attesa delle intestazioni", consulta la sezione di errore "Client.Timeout superato durante l'attesa delle intestazioni".
Se il messaggio APIServer Conditions contiene connessione rifiutata, completa i passaggi nella sezione di errore Risolvi la connessione rifiutata.
Risolvi l'errore "Client.Timeout superato durante l'attesa delle intestazioni"
Questo messaggio di errore su APIService indica che un gruppo di sicurezza o una lista di controllo degli accessi alla rete (ACL) non sono configurati correttamente. Ciò impedisce l'accesso ai pod di metrics-server. Considera il seguente esempio:
no response from https://10.0.35.231:443: Get https://10.0.35.231:443: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Per risolvere questo errore, conferma che i tuoi gruppi di sicurezza soddisfino i requisiti minimi di traffico per Amazon EKS.
Risolvi l'errore "connessione rifiutata"
Questo errore nel messaggio APIServer indica che il container è in ascolto sulla porta sbagliata. Considera il seguente esempio:
no response from https://10.0.35.231:443: Get https://10.0.35.231:443: dial tcp 10.0.35.231:443: connect: connection refused
Per risolvere questo errore, esegui il comando seguente per confermare che i valori per porte, immagine e comando siano corretti nell'implementazione di metrics-server:
$ kubectl describe deployment metrics-server -n kube-system
L'output sarà simile al seguente esempio:
Name: metrics-server Namespace: kube-system CreationTimestamp: Wed, 08 Jan 2020 11:48:45 +0200 Labels: app=metrics-server ... Containers: metrics-server: Image: gcr.io/google_containers/metrics-server-amd64:v0.3.6 Port: 443/TCP Command: - /metrics-server - --logtostderr - --secure-port=443 ...
Nota: i valori del Comando e dell'Immagine possono variare a seconda di come è stato distribuito Metrics Server e di dove sono archiviate le immagini. Se il Comando contiene il parametro --secure-port, la porta (443/TCP, nell'esempio precedente) esposta dal pod deve corrispondere a questo parametro. Se il Comando non contiene il parametro --secure-port, la porta predefinita è 443.
Altre cause di errore della condizione APIServer
Se ricevi uno dei seguenti codici per APIService, agisci in base al messaggio di errore associato: ServiceNotFound, ServiceAccessError, ServicePortError, EndpointsNotFound, EndpointsAccessError o MissingEndpoints.
-
Per ottenere informazioni sul servizio con l'errore, esegui il seguente comando:
$ kubectl get service -n kube-system
Nell'output, conferma che il servizio Kubernetes ha lo stesso nome e lo stesso spazio dei nomi definiti in APIService.Spec.Service. Quindi, conferma che la porta sia impostata su 443/TCP. Considera il seguente esempio:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE metrics-server ClusterIP 172.20.172.133 <none> 443/TCP 65m
-
Per elencare gli endpoint, esegui il comando seguente:
$ kubectl get endpoints metrics-server -n kube-system
Nell'output, conferma di disporre di almeno un endpoint per il servizio metrics-server:
NAME ENDPOINTS AGE metrics-server 10.0.35.231:443 76m
-
Per confermare che la distribuzione è presente e che le etichette corrispondono a quelle del servizio metrics-server, esegui il seguente comando:
$ kubectl describe deploy metrics-server -n kube-system
Nell'output, conferma che l'implementazione abbia almeno una replica:
Name: metrics-server Namespace: kube-system CreationTimestamp: Wed, 08 Jan 2020 11:48:45 +0200 Labels: app=metrics-server release=metrics-server ... Selector: app=metrics-server,release=metrics-server Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable ... Pod Template: Labels: app=metrics-server release=metrics-server Service Account: metrics-server Containers: metrics-server: Image: gcr.io/google_containers/metrics-server-amd64:v0.3.6 ...
Se ancora non riesci a raccogliere le metriche con Metrics Server, consulta la sezione Verifica se APIService è disponibile e può gestire le richieste.
Verifica se APIService è disponibile e può gestire le richieste
Per estrarre i log dai tuoi pod Metrics Server, esegui il seguente comando:
$ kubectl logs -n <namespace> -l app=metrics-server
Ad esempio, i log degli errori in metrics-server iniziano con una E:
E0610 23:13:28.247604 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-nv8sz: no metrics known for pod "default/php-apache-b5f58cc5f-nv8sz" E0610 23:13:43.260069 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-nv8sz: no metrics known for pod "default/php-apache-b5f58cc5f-nv8sz" E0610 23:16:13.346070 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-cj67b: no metrics known for pod "default/php-apache-b5f58cc5f-cj67b" E0610 23:16:13.346087 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-sqc6l: no metrics known for pod "default/php-apache-b5f58cc5f-sqc6l" E0610 23:16:13.346091 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-4cpwk: no metrics known for pod "default/php-apache-b5f58cc5f-4cpwk"
I log degli errori di Metrics Server indicano un problema di configurazione nel Metrics Server Deployment Command o un bug nel container Metrics Server. Se il messaggio di errore non è ovvio o sospetti che si tratti di un bug, completa i passaggi nella sezione Verifica la presenza di problemi comuni su GitHub.
Verifica la presenza di problemi comuni su GitHub
Se ancora non riesci a raccogliere metriche da container, pod o nodi, verifica su GitHub la presenza dei problemi più comuni con Metrics Server.
Controlla le tue richieste di risorse HPA e applicative per verificare la presenza di metriche sconosciute
-
Per verificare la configurazione HPA, esegui il seguente comando:
$ kubectl get hpa -n namespace 2048-deployment
Nota: sostituisci il namespace e l'2048-deployment con i valori di configurazione HPA per la tua applicazione. Potresti vedere **<unknown>**nella colonna Target dell'output. Considera il seguente esempio:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE 2048-deployment Deployment/2048-deployment <unknown>/80% 1 2 2 10s
-
Attendi alcuni minuti, quindi ripeti il comando del passaggio 1.
Se ricevi ancora l’ <unknown> errore, esegui il seguente comando:
$ kubectl describe hpa -n <namespace> 2048-deployment
Quindi, controlla la sezione Eventi dell'output per ulteriori informazioni:
Name: 2048-deployment Namespace: 2048-game ... Metrics: ( current / target ) resource cpu on pods (as a percentage of request): <unknown> / 80% Min replicas: 1 Max replicas: 2 Deployment pods: 2 current / 2 desired Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale ScalingActive False FailedGetResourceMetric the HPA was unable to compute the replica count: missing request for cpu Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedGetResourceMetric 3m29s (x4333 over 19h) horizontal-pod-autoscaler missing request for cpu
Se la colonna Message mostra una richiesta mancante per [x], è probabile che Deployments o ReplicaSet non dichiarino le richieste di risorse nelle sue specifiche. Verifica che tutte le richieste siano state dichiarate in tutti i container del pod. L'omissione di una richiesta potrebbe far sì che la metrica in HPA restituisca la <unknown> risposta.
Per ulteriori informazioni, consulta Resource management for pods and containers sul sito web di Kubernetes.
Contenuto pertinente
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 9 mesi fa