Perché non riesco a utilizzare Metrics Server in Amazon EKS per raccogliere metriche da container, pod o nodi?
Non riesco a raccogliere metriche da container, pod o nodi con Metrics Server nel mio cluster Amazon Elastic Kubernetes Service (Amazon EKS).
Risoluzione
Amazon EKS non installa automaticamente Metrics Server. Se hai creato il cluster di recente e non riesci a utilizzare Metrics Server per raccogliere le metriche, verifica di aver distribuito l'applicazione Metrics Server nel cluster.
Se ancora non riesci a raccogliere le metriche con Metrics Server, completa i passaggi nelle seguenti sezioni.
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 (Gestione delle risorse per pod e container) sul sito web Kubernetes. La community Kubernetes gestisce Metrics Server e segnala i problemi sulla sua pagina GitHub. Per ulteriori informazioni, consulta Issues (Problemi) nella pagina GitHub di Metrics Server.
Verifica se riesci a recuperare le metriche dai nodi e dai pod del cluster
Per verificare se riesci a recuperare le metriche dai nodi e dai pod del cluster, esegui questi comandi:
kubectl top nodes kubectl top pods
Nota: se non ricevi errori da nessuno dei due comandi, consulta la sezione Verifica se APIService è disponibile e può gestire le richieste.
Se invece da uno dei comandi precedenti ricevi un errore, completa i passaggi descritti in una delle seguenti sezioni a seconda dell'errore che ricevi.
Messaggio di errore "Error from server (Forbidden)"
In caso di problemi con l'autorizzazione RBAC (Role Based Access Control), ricevi il messaggio di errore "Error from server (Forbidden)".
Per risolverlo, intraprendi le seguenti azioni:
- Verifica che ServiceAccount sia collegato correttamente alla distribuzione.
- Verifica che ClusterRole/Role e ClusterRoleBinding/RoleBindings utilizzino le autorizzazioni RBAC corrette per Metrics Server. Per ulteriori informazioni, consulta Using RBAC authorization (Utilizzo dell'autorizzazione RBAC) sul sito web Kubernetes.
Se accedi al cluster tramite un ruolo definito nella ConfigMap aws-auth, verifica di aver impostato il campo del nome utente e la mappatura.
Completa i seguenti passaggi:
-
Per descrivere la ConfigMap aws-auth, esegui questo comando:
kubectl describe -n kube-system configmap aws-auth -
Analizza l'output del comando precedente per verificare che il campo del nome utente sia impostato per il ruolo che accede al cluster.
Esempio di output:Name: aws-auth Namespace: kube-system Labels: Annotations: <none> Data === mapRoles: ---- ... - groups: - system:masters rolearn: arn:aws:iam::123456789123:role/kubernetes-devops username: devops:`SessionName`Assicurati che nell'output sia specificato il nome utente.
Messaggio di errore "Error from server (ServiceUnavailable)"
Se Metrics Server non è configurato correttamente, ricevi il messaggio di errore "Error from server (ServiceUnavailable)".
Per verificare la presenza di un problema con la configurazione dell'applicazione di servizio Metrics Server nel cluster, esegui questo comando:
kubectl describe apiservices v1beta1.metrics.k8s.io
Esempio di output:
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.
Nota: 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 nell'output il relativo codice Reason e il messaggio leggibile dall'uomo (Message) relativo alle condizioni (Conditions).
Esempio di APIService non riuscito:
... 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
Nota: se Reason non è FailedDiscoveryCheck, fai riferimento alla sezione Altre cause di errore della condizione APIServer. Se il messaggio relativo alle condizioni di APIServer contiene Client.Timeout exceeded while awaiting headers, consulta la sezione Risolvi l’errore "Client.Timeout exceeded while awaiting headers". Se il messaggio relativo alle condizioni di APIServer contiene Connection refused, consulta la sezione Risolvi l’errore "Connection refused".
Risolvi l’errore "Client.Timeout exceeded while awaiting headers"
Se non hai configurato correttamente un gruppo di sicurezza o una lista di controllo degli accessi alla rete (ACL), ricevi il messaggio di errore "Client.Timeout exceeded will awaiting headers" in APIService. In tal caso, non puoi accedere ai pod metrics-server.
Per risolvere il problema, verifica che i gruppi di sicurezza soddisfino i requisiti minimi di traffico per Amazon EKS.
Risolvi l’errore "Connection refused"
Se un container è in ascolto sulla porta sbagliata, ricevi il messaggio di errore "Connection refused".
Per risolvere il problema, verifica nella distribuzione di metrics-server che i valori Port, Image e Command siano corretti eseguendo questo comando:
kubectl describe deployment metrics-server -n kube-system
Esempio di output:
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 Command e Image variano a seconda della modalità di distribuzione di Metrics Server e della posizione in cui vengono archiviate le immagini. Se Command contiene il parametro --secure-port, la porta esposta dal pod deve corrispondere a questo parametro. Se Command 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, intervieni in base al relativo messaggio di errore: ServiceNotFound, ServiceAccessError, ServicePortError, EndpointsNotFound, EndpointsAccessError o MissingEndpoints.
Per risolvere questi errori, completa i seguenti passaggi:
-
Per ottenere informazioni sul servizio con l'errore, esegui questo comando:
kubectl get service -n kube-systemNell'output, verifica che il servizio Kubernetes abbia lo stesso nome e lo stesso namespace definiti in APIService.Spec.Service. Quindi verifica che la porta sia impostata su 443/TCP.
Esempio di output:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE metrics-server ClusterIP 172.20.172.133 <none> 443/TCP 65m -
Esegui questo comando per elencare tutti gli endpoint:
kubectl get endpoints metrics-server -n kube-systemNell'output, verifica di disporre di almeno un endpoint per il servizio metrics-server.
Esempio di output:NAME ENDPOINTS AGE metrics-server 10.0.35.231:443 76m -
Per verificare che la distribuzione sia presente e che le etichette corrispondano a quelle del servizio metrics-server, esegui questo comando:
kubectl describe deploy metrics-server -n kube-systemNell'output, verifica che la distribuzione abbia almeno una replica.
Esempio di output: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 pod Metrics Server, esegui questo comando:
kubectl logs -n namespace -l app=metrics-server
Nota: sostituisci namespace con il tuo namespace.
Esempi di log degli errori:
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"
Nota: i log degli errori di Metrics Server indicano se è presente un problema di configurazione nel comando di distribuzione di Metrics Server o un bug nel container Metrics Server. Se il messaggio di errore non è evidente o se 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. Per ulteriori informazioni, consulta Issues (Problemi) nella pagina GitHub di Metrics Server.
Per verificare se le richieste di risorse di HorizontalPodAutoscaler (HPA) e dell'applicazione contengono metriche sconosciute, completa i seguenti passaggi:
-
Per verificare la configurazione di HPA, esegui questo comando:
kubectl get hpa -n namespace 2048-deploymentNota: sostituisci namespace and 2048-deployment con i valori di configurazione di HPA della tua applicazione.
Potresti vedere <unknown> nella colonna Targets dell'output.
Esempio di output: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’errore "<unknown>", esegui questo comando:kubectl describe hpa -n namespace 2048-deploymentNota: sostituisci namespace con il tuo namespace.
Quindi controlla la sezione Events dell'output per ulteriori informazioni.
Esempio di output: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 cpuNota: se la colonna Message mostra missing request for [x], è possibile che le richieste di risorse non siano dichiarate nelle relative specifiche di distribuzioni o ReplicaSet. Verifica che tutte le richieste siano state dichiarate in tutti i container del pod. Se ometti una richiesta, la metrica per HPA restituisce la risposta <unknown>.
Per ulteriori informazioni, consulta Resource management for pods and containers (Gestione delle risorse per pod e container), Deployments (Distribuzioni) e ReplicaSet sul sito web Kubernetes.
- Argomenti
- Containers
- Lingua
- Italiano
