Salta al contenuto

Perché non riesco a utilizzare Metrics Server in Amazon EKS per raccogliere metriche da container, pod o nodi?

9 minuti di lettura
0

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:

  1. Per descrivere la ConfigMap aws-auth, esegui questo comando:

    kubectl describe -n kube-system configmap aws-auth
  2. 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:

  1. Per ottenere informazioni sul servizio con l'errore, esegui questo comando:

    kubectl get service -n kube-system

    Nell'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
  2. Esegui questo comando per elencare tutti gli endpoint:

    kubectl get endpoints metrics-server -n kube-system

    Nell'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
  3. 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-system

    Nell'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:

  1. Per verificare la configurazione di HPA, esegui questo comando:

    kubectl get hpa -n namespace 2048-deployment

    Nota: 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
  2. 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-deployment

    Nota: 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 cpu

    Nota: 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.

AWS UFFICIALEAggiornata 6 mesi fa