Come posso risolvere gli errori DNS con Amazon EKS?

9 minuti di lettura
0

Le applicazioni o i pod che utilizzano CoreDNS nel mio cluster Amazon Elastic Kubernetes Service (Amazon EKS) non riescono a risolvere i nomi DNS interni o esterni.

Breve descrizione

I pod che vengono eseguiti all'interno del cluster Amazon EKS utilizzano l'indirizzo IP del cluster CoreDNS come name server per interrogare i record DNS interni ed esterni. In caso di problemi con i pod CoreDNS, la configurazione del servizio o la connettività, le applicazioni potrebbero non riuscire nelle risoluzioni DNS.

Un oggetto di servizio chiamato kube-dns astrae i pod CoreDNS. Per risolvere i problemi con i tuoi pod CoreDNS, verifica lo stato di funzionamento di tutti i componenti del servizio kube-dns, come le opzioni degli endpoint del servizio e le regole iptables.

Risoluzione

La seguente risoluzione si applica al CoreDNS ClusterIP 10.100.0.10.

Completa i passaggi seguenti:

  1. Ottieni il ClusterIP del tuo servizio CoreDNS:

    kubectl get service kube-dns -n kube-system
  2. Verifica che gli endpoint DNS siano esposti e puntino ai pod CoreDNS:

    kubectl -n kube-system get endpoints kube-dns

    Esempio di output:

    NAME       ENDPOINTS                                                        AGE
    kube-dns   192.168.2.218:53,192.168.3.117:53,192.168.2.218:53 + 1 more...   90d

    Nota: Se l'elenco degli endpoint è vuoto, controlla lo stato dei pod CoreDNS.

  3. Verifica che un gruppo di sicurezza o un elenco di controllo dell'accesso alla rete (ACL di rete) non blocchino i pod quando comunicano con CoreDNS.

    Per ulteriori informazioni, consulta Perché i miei pod non si connettono ad altri pod in Amazon EKS?

Verifica che il pod kube-proxy funzioni

Controlla i tuoi log per verificare la presenza di errori di timeout sul piano di controllo per verificare che il pod kube-proxy abbia accesso ai server API del tuo cluster. Inoltre, controlla la presenza di errori 403 non autorizzati.

Scarica i log di kube-proxy:

kubectl logs -n kube-system --selector 'k8s-app=kube-proxy'

Nota: Il kube-proxy ottiene gli endpoint dal piano di controllo e crea le regole iptables su ogni nodo.

Controlla l'utilizzo della CPU dei pod CoreDNS al momento del problema

L'add-on Amazon EKS CoreDNS aggiunge solo il limite di 170Mi alla memoria del pod CoreDNS. Il pod CoreDNS non definisce un limite di CPU, quindi il container può utilizzare tutte le risorse CPU disponibili sul nodo in cui viene eseguito. Se l'utilizzo della CPU del nodo raggiunge il 100%, potresti riscontrare errori di timeout DNS nei log delle applicazioni Amazon EKS. Questo perché il pod CoreDNS non dispone di risorse CPU sufficienti per gestire tutte le query DNS.

Connettiti al pod dell'applicazione per risolvere il problema DNS

Completa i passaggi seguenti:

  1. Per eseguire comandi all'interno dei contenitori dell'applicazione, esegui il seguente comando per accedere a una shell all'interno del pod in esecuzione:

    $ kubectl exec -it your-pod-name -- sh

    Se il pod dell'applicazione non dispone di una shell binaria disponibile, viene visualizzato un errore simile al seguente:

    "OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"sh\": executable file not found in $PATH": comando sconosciuto terminato con codice di uscita 126

    Per eseguire il debug, aggiorna l'immagine utilizzata nel file manifest per un'altra immagine, ad esempio l'immagine busybox (dal sito web di Docker).

  2. Verifica che l'indirizzo IP del cluster del servizio kube-dns sia nel file /etc/resolv.conf del tuo pod. Esegui il seguente comando nella shell che si trova all'interno del pod:

    cat /etc/resolv.conf

    L'esempio seguente resolv.conf mostra un pod configurato per puntare a 10.100.0.10 per le richieste DNS. L'IP deve corrispondere al ClusterIP del servizio kube-dns:

    nameserver 10.100.0.10
    search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal
    options ndots:5

    Nota: Puoi gestire la configurazione DNS del tuo pod con il campo dnsPolicy nelle specifiche del pod. Se questo campo non è compilato, per impostazione predefinita viene utilizzata la policy DNS ClusterFirst. Per ulteriori informazioni sulla policy DNS di ClusterFirst, consulta la Policy DNS del pod sul sito web di Kubernetes. 

  3. Per verificare che il tuo pod possa utilizzare il ClusterIP predefinito per risolvere un dominio interno, esegui il seguente comando nella shell all'interno del pod:

    nslookup kubernetes.default 10.100.0.10

    Esempio di output:

    Server:     10.100.0.10
    Address:    10.100.0.10#53
    Name:       kubernetes.default.svc.cluster.local
    Address:    10.100.0.1
  4. Per verificare che il tuo pod possa utilizzare il ClusterIP predefinito per risolvere un dominio esterno, esegui il seguente comando nella shell all'interno del pod:

    nslookup amazon.com 10.100.0.10

    Esempio di output:

    Server:     10.100.0.10
    Address:    10.100.0.10#53
    Non-authoritative answer:
    Name:   amazon.com
    Address: 176.32.98.166
    Name:    amazon.com
    Address: 205.251.242.103
    Name:    amazon.com
    Address: 176.32.103.205
  5. Verifica che il tuo pod possa utilizzare l'indirizzo IP del pod CoreDNS per risolvere direttamente. Esegui i seguenti comandi nella shell che si trova all'interno del pod:

    nslookup kubernetes COREDNS_POD_IP
    
    nslookup amazon.com COREDNS_POD_IP

    **Nota:**Sostituisci COREDNS_POD_IP con uno degli indirizzi IP degli endpoint kubectl get.

Ottieni log più dettagliati dai pod CoreDNS per il debug

Completa i passaggi seguenti:

  1. Attiva il registro di debug dei pod CoreDNS e aggiungi il plug-in di registro alla ConfigMap di CoreDNS:

    kubectl -n kube-system edit configmap coredns

    **Nota:**Per ulteriori informazioni, consulta il plug-in di registro sul sito web di CoreDNS.

  2. Nella schermata dell'editor che appare nell'output, aggiungi la stringa di registro:

    kind: ConfigMap
    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            log    # Enabling CoreDNS Logging
            errors
            health
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              upstream
              fallthrough in-addr.arpa ip6.arpa
            }
            ...
    ...

    Nota: Sono necessari alcuni minuti per ricaricare il CoreDNS di configurazione. Per applicare immediatamente le modifiche, riavvia i pod uno per uno.

  3. Controlla se i log di CoreDNS non vanno a buon fine o ottengono risultati dal pod dell'applicazione:

    kubectl logs --follow -n kube-system --selector 'k8s-app=kube-dns'

Aggiorna il valore ndots

Il valore ndots è il numero di punti che devono apparire in un nome per risolvere una query prima che venga effettuata una query assoluta iniziale.

Ad esempio, puoi impostare l'opzione ndots sul valore predefinito 5 in un nome di dominio non completamente qualificato. Quindi, tutti i domini esterni che non rientrano nel dominio interno cluster.local vengono aggiunti ai domini di ricerca prima che vengano eseguite le query.

Vedi il seguente esempio con l'impostazione /etc/resolv.conf del pod dell'applicazione:

nameserver 10.100.0.10
search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal
options ndots:5

CoreDNS cerca cinque punti nel dominio richiesto. Se il pod effettua una chiamata di risoluzione DNS per amazon.com, i tuoi log hanno un aspetto simile ai seguenti:

[INFO] 192.168.3.71:33238 - 36534 "A IN amazon.com.default.svc.cluster.local. udp 54 false 512" NXDOMAIN qr,aa,rd 147 0.000473434s
[INFO] 192.168.3.71:57098 - 43241 "A IN amazon.com.svc.cluster.local. udp 46 false 512" NXDOMAIN qr,aa,rd 139 0.000066171s
[INFO] 192.168.3.71:51937 - 15588 "A IN amazon.com.cluster.local. udp 42 false 512" NXDOMAIN qr,aa,rd 135 0.000137489s
[INFO] 192.168.3.71:52618 - 14916 "A IN amazon.com.ec2.internal. udp 41 false 512" NXDOMAIN qr,rd,ra 41 0.001248388s
[INFO] 192.168.3.71:51298 - 65181 "A IN amazon.com. udp 28 false 512" NOERROR qr,rd,ra 106 0.001711104s

Nota: NXDOMAIN indica che il record di dominio non è stato trovato e NOERROR significa che il record di dominio è stato trovato.

Ogni dominio di ricerca è preceduto da amazon.com prima che alla fine effettui l'ultima chiamata al dominio assoluto. Un nome di dominio finale a cui viene aggiunto un punto (.) alla fine c'è un nome di dominio completo. Ciò significa che per ogni query di nome di dominio esterno potrebbero esserci da quattro a cinque chiamate aggiuntive, il che può sovraccaricare il pod CoreDNS.

Per risolvere questo problema, modifica ndots in 1 per cercare solo un singolo punto. In alternativa, aggiungi un punto (.) alla fine del dominio che interroghi o utilizzi:

nslookup example.com.

Prendi in considerazione i limiti dei resolver VPC (AmazonProvidedDNS)

Il resolver Amazon Virtual Private Cloud (Amazon VPC) può accettare solo un limite rigido massimo di 1024 pacchetti al secondo per interfaccia di rete. Se più di un pod CoreDNS si trova sullo stesso nodo, le possibilità di raggiungere questo limite sono maggiori per le query di domini esterni.

Per utilizzare le regole di PodAntiAffinity (dal sito web di Kubernetes) per pianificare i pod CoreDNS su istanze separate, aggiungi le seguenti opzioni alla distribuzione di CoreDNS:

podAntiAffinity:
  preferredDuringSchedulingIgnoredDuringExecution:
  - podAffinityTerm:
      labelSelector:
        matchExpressions:
        - key: k8s-app
          operator: In
          values:
          - kube-dns
      topologyKey: kubernetes.io/hostname
    weight: 100

Nota: Per ulteriori informazioni su PodAntiAffinity, consulta Affinità e anti-affinità tra pod sul sito web di Kubernetes.

Usa tcpdump per acquisire pacchetti CoreDNS dai nodi di lavoro di Amazon EKS

Usa lo strumento tcpdump per eseguire un'acquisizione di pacchetti per diagnosticare problemi di risoluzione DNS:

  1. Individua un nodo di lavoro in cui è in esecuzione un pod CoreDNS:

    kubectl get pod -n kube-system -l k8s-app=kube-dns -o wide
  2. Usa SSH per connetterti al nodo di lavoro su cui è in esecuzione un pod CoreDNS e installare lo strumento tcpdump:

    sudo yum install tcpdump –y
  3. Individua l'ID del processo del pod CoreDNS sul nodo di lavoro:

    ps ax | grep coredns
  4. Dal nodo worker, esegui un'acquisizione di pacchetti sulla rete di pod CoreDNS per monitorare il traffico di rete sulla porta UDP 53:

    sudo nsenter -n -t PID tcpdump udp port 53
  5. Da un terminale separato, ottieni il servizio CoreDNS e gli IP dei pod:

    kubectl describe svc kube-dns -n kube-system

    Nota: Nota l'IP del servizio che si trova nel campo IP e gli IP del pod che si trovano nel campo Endpoint.

  6. Avvia un pod da cui testare il servizio DNS. L'esempio seguente utilizza un'immagine del contenitore Ubuntu:

    kubectl run ubuntu --image=ubuntu sleep 1d
    
    kubectl exec -it ubuntu sh
  7. Usa lo strumento nslookup per eseguire una query DNS su un dominio, come amazon.com:

    nslookup amazon.com

    Esegui esplicitamente la stessa query sull'indirizzo IP del servizio CoreDNS:

    nslookup amazon.com COREDNS_SERVICE_IP

    Esegui la query su ciascuno degli indirizzi IP del pod CoreDNS:

    nslookup amazon.com COREDNS\_POD\_IP

    Nota: Se hai più pod CoreDNS in esecuzione, esegui più query in modo che almeno una query venga inviata al pod da cui stai acquisendo il traffico.

  8. Esamina i risultati dell'acquisizione dei pacchetti.

    Se il pod CoreDNS monitorato presenta dei timeout delle query DNS e non visualizzi la query nell'acquisizione del pacchetto, controlla la connettività di rete. Assicurati di controllare la raggiungibilità della rete tra i nodi di lavoro.

    Se visualizzi un timeout della query DNS su un indirizzo IP del pod che non stai acquisendo, esegui un'altra acquisizione di pacchetti sul nodo di lavoro correlato.

    Per salvare i risultati di un'acquisizione di pacchetti per riferimenti successivi, aggiungi il flag -w FILE_NAME al comando tcpdump. L'esempio seguente scrive i risultati in un file denominato capture.pcap:

    tcpdump -w capture.pcap udp port 53

Informazioni correlate

CoreDNS GA per cluster Kubernetes DNS

sul sito web di Kubernetes

AWS UFFICIALE
AWS UFFICIALEAggiornata 5 mesi fa