Salta al contenuto

Come posso installare NodeLocalDNS nel mio cluster EKS e risolvere i problemi?

9 minuti di lettura
0

Desidero installare NodeLocalDNS nel mio cluster Amazon Elastic Kubernetes Service (Amazon EKS) e risolvere i problemi.

Risoluzione

Prerequisiti:

Installa NodeLocalDNS

NodeLocalDNS utilizza un indirizzo IP link-local per il caching DNS in ciascun nodo. Gli indirizzi link-local sono indirizzi IP compresi nell'intervallo 169.254.0.0/16 validi solo all'interno del segmento di rete.

Nota: l'indirizzo IP link-local standard per NodeLocalDNS è 169.254.20.10. Non modificare questo valore a meno che non vi sia un conflitto specifico nel tuo ambiente.

Per installare NodeLocalDNS nel cluster Amazon EKS, completa i seguenti passaggi:

  1. Esegui questo comando curl per scaricare il manifesto di NodeLocalDNS dal repository Kubernetes:

    curl -Lo nodelocaldns.yaml.template https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
  2. Per recuperare l'indirizzo IP del servizio kube-dns del cluster, esegui questo comando:

    kubectl get svc kube-dns -n kube-system -o jsonpath='{.spec.clusterIP}'

    Nota: prendi nota dell'indirizzo IP riportato nell'output.

  3. Per recuperare il dominio del cluster, esegui questo comando:

    kubectl get configmap coredns -n kube-system -o yaml | grep 'kubernetes'

    L'output mostra il dominio del cluster.

  4. Per determinare la modalità di kube-proxy, esegui questo comando:

    kubectl get configmap kube-proxy-config -n kube-system -o yaml | grep mode

    L'output mostra iptables o ipvs come valore della modalità.

  5. Modifica il manifesto di NodeLocalDNS in base alla modalità di kube-proxy.

    Per la modalità iptables, modifica il manifesto con questi comandi:

    # Set environment variables for node-local-dns
    kubedns=$(kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP})
    domain=cluster.local
    localdns=`169.254.20.10`
    
    # Update the manifest with your cluster's specific values:
    sed "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/__PILLAR__DNS__SERVER__/$kubedns/g" nodelocaldns.yaml.template > nodelocaldns.yaml

    Nota: sostituisci cluster.local con il dominio del tuo cluster annotato nel passaggio 3, se il cluster utilizza un dominio diverso. Sostituisci 169.254.20.10 con l'indirizzo IP link-local del cluster, se diverso.

    Per la modalità IPVS, modifica il manifesto con questi comandi:

    # Set environment variables for node-local-dns
    kubedns=$(kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP})
    domain=cluster.local
    localdns=169.254.20.10
    
    # Update the manifest with your cluster's specific values:
    sed "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/,__PILLAR__DNS__SERVER__//g; s/__PILLAR__CLUSTER__DNS__/$kubedns/g" nodelocaldns.yaml.template > nodelocaldns.yaml

    Nota: sostituisci cluster.local con il dominio del tuo cluster annotato nel passaggio 3, se il cluster utilizza un dominio diverso. Sostituisci 169.254.20.10 con l'indirizzo IP link-local del cluster, se diverso. In modalità IPVS, devi configurare i pod per utilizzare NodeLocalDNS. Consulta la sezione "Configurare i pod per utilizzare NodeLocalDNS (solo modalità IPVS)".

  6. Per applicare il manifesto di NodeLocalDNS, esegui questo comando:

    kubectl apply -f nodelocaldns.yaml
  7. Per verificare che i pod NodeLocalDNS siano nello stato In esecuzione, esegui questo comando:

    kubectl get pods -n kube-system -l k8s-app=node-local-dns

Configura i pod per utilizzare NodeLocalDNS (solo modalità IPVS)

Importante: questa sezione si applica solo se il cluster utilizza la modalità IPVS per kube-proxy. Se il cluster utilizza la modalità iptables, il traffico DNS viene reindirizzato automaticamente a NodeLocalDNS.

Per i cluster in modalità IPVS, devi configurare manualmente i pod per utilizzare NodeLocalDNS. Per indirizzare i pod a NodeLocalDNS, puoi configurare singoli pod o configurare i cluster con kubelet.

Configura i singoli pod

Per configurare i singoli pod, aggiungi la seguente configurazione alle specifiche del pod:

spec:
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - [169.254.20.10]
    searches:
      - default.svc.cluster.local
      - svc.cluster.local
      - cluster.local
    options:
      - name: ndots
        value: "5"

Nota: sostituisci 169.254.20.10 con l'indirizzo IP link-local del cluster. Sostituisci cluster.local con il dominio del tuo cluster, se il cluster utilizza un dominio diverso.

Configura i cluster con kubelet

In modalità IPVS, NodeLocalDNS è in ascolto solo sull'indirizzo link-local 169.254.20.10. Devi modificare la configurazione di kubelet in modo che punti verso questo indirizzo link-local.

Per configurare tutti i pod del cluster in modo che utilizzino NodeLocalDNS e modificare la configurazione di kubelet in ciascun nodo, completa i seguenti passaggi:

  1. Modifica il file di configurazione di kubelet. Utilizza la seguente configurazione:

    {  "clusterDNS": ["169.254.20.10"],
      "clusterDomain": "cluster.local"
    }

    Nota: sostituisci 169.254.20.10 con l'indirizzo IP link-local del cluster. Sostituisci cluster.local con il dominio del tuo cluster, se il cluster utilizza un dominio diverso.

  2. Per riavviare il servizio kubelet in ogni nodo, esegui questo comando sudo:

    sudo systemctl restart kubelet
  3. Per verificare la configurazione di kubelet, esegui questo comando:

    cat /etc/kubernetes/kubelet/config.json | grep clusterDNS

    Nota: l'output mostra 169.254.20.10 come indirizzo IP link-local di NodeLocalDNS.

Nota: per la distribuzione automatica, puoi modificare la configurazione di kubelet nella sezione userdata del modello di avvio. Per ulteriori informazioni, consulta Come posso utilizzare dati utente personalizzati con nodi AL2023 in Amazon EKS?

Verifica di aver installato correttamente NodeLocalDNS

Per verificare che NodeLocalDNS funzioni correttamente, completa i seguenti passaggi:

  1. Per creare un pod di prova, esegui questo comando:

    kubectl run test-dns --image=busybox:1.28 --restart=Never --rm -it -- nslookup kubernetes.default
  2. Se i pod NodeLocalDNS sono nello stato CrashLoopBackOff con errori che indicano che la porta 53 è già in uso, analizza l'output per verificare se la query DNS è stata risolta correttamente.

  3. Per verificare che le query DNS utilizzino NodeLocalDNS, esegui questo comando:

    kubectl logs -n kube-system -l k8s-app=node-local-dns --tail=50

    I log mostrano le query DNS elaborate da NodeLocalDNS.

    Nota: per impostazione predefinita, la registrazione non è attivata in NodeLocalDNS. Per visualizzare il log, attiva la registrazione nella ConfigMap node-local-dns.

    # kubectl edit configmaps -n kube-system node-local-dns
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns
      namespace: kube-system
    data:
      Corefile: |
        cluster.local:53 {
           log  # Enable logging
           errors
           cache 30
           ...
        }

Risolvi i problemi relativi a NodeLocalDNS

Nota: se ricevi degli errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori relativi ad AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Risolvi gli errori CrashLoopBackOff causati da conflitti tra porte

I pod NodeLocalDNS entrano nello stato CrashLoopBackOff con errori relativi alla porta 53 perché i nodi Amazon EKS in modalità automatica riservano la porta 53. Scegli uno dei seguenti metodi per risolvere il problema:

Metodo 1: aggiungi regole di affinità dei nodi per escludere i nodi in modalità automatica

Completa i seguenti passaggi:

  1. Modifica il daemonset NodeLocalDNS:

    kubectl edit daemonset node-local-dns -n kube-system
  2. Aggiungi la seguente configurazione di affinità a spec.template.spec:

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: eks.amazonaws.com/compute-type
              operator: NotIn
              values:
              - auto
  3. Salva le modifiche, quindi verifica che i pod si riavviino correttamente.

Metodo 2: modifica la ConfigMap di NodeLocalDNS per cambiare la porta del controllo dell'integrità

Completa i seguenti passaggi:

  1. Per visualizzare la ConfigMap corrente di NodeLocalDNS, esegui questo comando:

    kubectl get configmap node-local-dns -n kube-system -o yaml
  2. Per cambiare la porta del controllo dell'integrità modificando la ConfigMap, esegui questo comando:

    kubectl edit configmap node-local-dns -n kube-system
  3. Nella ConfigMap, individua la configurazione del plugin relativo all'integrità e modifica la porta. La struttura della ConfigMap ha il seguente aspetto:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns
      namespace: kube-system
    data:
      Corefile: |
        cluster.local:53 {
           errors
           cache {
              success 9984 30
              denial 9984 5
           }
           reload
           loop
           bind IP_ADDRESS
           forward. __PILLAR__CLUSTER__DNS__ {
              force_tcp
           }
           prometheus :9253
           health 169.254.20.10:8081
        }

    Nota: sostituisci la porta 8081 nella riga health con la porta desiderata. Sostituisci 169.254.20.10 con l'indirizzo IP link-local del cluster, se diverso.

  4. Salva le modifiche.

  5. Per riavviare i pod NodeLocalDNS, esegui questo comando:

    kubectl rollout restart daemonset node-local-dns -n kube-system
  6. Per aggiornare la configurazione del controllo dell'integrità del daemonset in modo che corrisponda alla nuova porta, esegui questo comando:

    kubectl edit daemonset node-local-dns -n kube-system
  7. Individua le sezioni livenessProbe e readinessProbe e aggiorna la porta in modo che corrisponda alla nuova porta del controllo dell'integrità.

Risolvi gli errori di timeout delle query DNS

Se i pod ricevono timeout per le query DNS, verifica che i gruppi di sicurezza e l'ACL consentano il traffico TCP e UDP sulla porta 53. Questo traffico è necessario per la comunicazione tra pod.

Completa i seguenti passaggi:

  1. Per identificare i gruppi di sicurezza collegati ai nodi, esegui questo comando AWS CLI describe-instances:

    aws ec2 describe-instances --filters "Name=tag:eks:cluster-name,Values=YOUR-CLUSTER-NAME" --query "Reservations[*].Instances[*].SecurityGroups[*].[GroupId,GroupName]" --output table

    Nota: sostituisci YOUR-CLUSTER-NAME con il nome del tuo cluster Amazon EKS.

  2. Apri la console Amazon EC2.

  3. Nel pannello di navigazione, scegli Gruppi di sicurezza.

  4. Seleziona il gruppo di sicurezza identificato nel passaggio 1 di questa sezione.

  5. Scegli la scheda Regole in entrata.

  6. Verifica che esistano regole per consentire il traffico TCP e UDP sulla porta 53 dall'intervallo CIDR del pod.
    Nota: se le regole non esistono, scegli Modifica regole in entrata. Quindi aggiungi le regole per TCP e UDP sulla porta 53 con l'origine impostata nell'intervallo CIDR del pod.

Risolvi i messaggi di errore "Connection refused"

Se ricevi messaggi di errore "Connection refused" quando i pod tentano di utilizzare NodeLocalDNS, verifica che almeno un pod CoreDNS sia in esecuzione.

Per controllare lo stato del pod CoreDNS, esegui questo comando:

kubectl get pods -n kube-system -l k8s-app=kube-dns

Se nessun pod CoreDNS è in esecuzione o se i pod sono in uno stato di errore, riavvia la distribuzione di CoreDNS. Per riavviare la distribuzione, esegui questo comando:

kubectl rollout restart deployment coredns -n kube-system

Per verificare che i pod CoreDNS siano in esecuzione, esegui questo comando:

kubectl get pods -n kube-system -l k8s-app=kube-dns -w

Dopo l'esecuzione dei pod CoreDNS, per riavviare il daemonset NodeLocalDNS, esegui questo comando:

kubectl rollout restart daemonset node-local-dns -n kube-system

Informazioni correlate

Using CoreDNS for Service Discovery (Utilizzo di CoreDNS per il rilevamento servizi) sul sito web Kubernetes

Run kube-proxy in IPVS Mode (Esecuzione di kube-proxy in modalità IPVSI sul sito web Kubernetes

Automate cluster infrastructure with EKS Auto Mode (Come automatizzare l'infrastruttura dei cluster con la modalità automatica di EKS)

Gestione di componenti aggiuntivi di rete per i cluster Amazon EKS

AWS UFFICIALEAggiornata 4 mesi fa