Perché non posso raccogliere metriche da container, pod o nodi utilizzando Metrics Server in Amazon EKS?

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).

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.

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

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

  1. 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
  2. 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
  3. 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

  1. 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
  2. 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.

AWS UFFICIALE
AWS UFFICIALEAggiornata 9 mesi fa