IBM Cloud Docs
Configurazione del provider DNS del cluster

Configurazione del provider DNS del cluster

A ogni servizio nel tuo cluster IBM Cloud® Kubernetes Service viene assegnato un nome DNS (Domain Name System) che il provider DNS del cluster registra per risolvere le richieste DNS. Per ulteriori informazioni sul DNS per servizi e pod, consultare la documentazione di Kubernetes.

Il provider DNS del cluster è CoreDNS, che è un server DNS autoritario di uso generale che fornisce un'integrazione retrocompatibile, ma estensibile, con Kubernetes. Poiché CoreDNS è un singolo eseguibile e un singolo processo, ha meno dipendenze e parti mobili che potrebbero presentare problemi rispetto ad altri provider DNS del cluster. Il progetto è scritto con lo stesso linguaggio del progetto Kubernetes, Go, che aiuta a proteggere la memoria. Infine, CoreDNS supporta casi d'uso più flessibili rispetto ad altri fornitori di DNS per cluster, perché è possibile creare voci DNS personalizzate, come le configurazioni comuni riportate nei documenti di CoreDNS.

Ridimensionamento automatico del provider DNS del cluster

Per impostazione predefinita, CoreDNS include una distribuzione per ridimensionare automaticamente i pod CoreDNS in risposta al numero di nodi di lavoro e core all'interno del cluster. Puoi ottimizzare i parametri dell'autoscaler CoreDNS modificando la mappa di configurazione del ridimensionamento automatico CoreDNS. Ad esempio, se le tue applicazioni fanno un uso elevato del provider DNS del cluster, potresti dover aumentare il numero minimo di pod CoreDNS per supportare l'applicazione. Per ulteriori informazioni, consultare la documentazione di Kubernetes.

Prima di iniziare: Accedere al proprio account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

  1. Verifica che la distribuzione dell'autoscaler CoreDNS sia disponibile. Nel tuo output della CLI, verifica che una distribuzione sia disponibile (AVAILABLE).

    kubectl get deployment -n kube-system coredns-autoscaler
    

    Output di esempio

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    coredns-autoscaler   1/1     1            1           69d
    
  2. Modifica le impostazioni predefinite per l'autoscaler CoreDNS. Cerca il campo data.linear, che per impostazione predefinita utilizza un pod CoreDNS per 16 nodi di lavoro o 256 core, con un minimo di due pod CoreDNS indipendentemente dalla dimensione del cluster (preventSinglePointFailure: true). Per ulteriori informazioni, vedi la documentazione di Kubernetes.

    kubectl edit configmap -n kube-system coredns-autoscaler
    

    Output di esempio

    apiVersion: v1
    data:
      linear: '{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}'
    kind: ConfigMap
    metadata:
    ...
    

Personalizzazione del provider DNS del cluster

Puoi personalizzare CoreDNS modificando la relativa mappa di configurazione. Ad esempio, potresti voler configurare dei domini stub e dei server DNS upstream per risolvere i servizi che puntano ad host esterni. Inoltre, è possibile configurare più Corefile all'interno del sito CoreDNS ConfigMap. Per ulteriori informazioni, consultare la documentazione di Kubernetes.

NodeLocal La memorizzazione nella cache DNS si basa su CoreDNS per gestire la cache delle risoluzioni DNS. Mantenere invariate le configurazioni NodeLocal DNS cache e CoreDNS applicabili, come i domini stub, per mantenere la congruenza della risoluzione DNS.

Prima di iniziare: Accedere al proprio account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

  1. Verifica che la distribuzione CoreDNS sia disponibile. Nel tuo output della CLI, verifica che una distribuzione sia disponibile (AVAILABLE).

    kubectl get deployment -n kube-system coredns
    

    Output di esempio

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    coredns   3/3     3            3           69d
    
  2. Modifica le impostazioni predefinite per la mappa di configurazione di CoreDNS. Utilizza un Corefile nella sezione data della mappa di configurazione per personalizzare i domini stub e i server DNS upstream. Per ulteriori informazioni, consultare la documentazione di Kubernetes.

    Il plug-in CoreDNS proxy è obsoleto e viene sostituito con il plug-in forward. Se aggiorni la mappa di configurazione CoreDNS, assicurati di sostituire tutte le istanze proxy con forward.

    kubectl edit configmap -n kube-system coredns
    

    CoreDNS esempio di uscita

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: coredns
    namespace: kube-system
      data:
        Corefile: |
          import <MyCorefile>
          .:53 {
              errors
              health {
                lameduck 10s
              }
              ready
              kubernetes cluster.local in-addr.arpa ip6.arpa {
                 pods insecure
                 fallthrough in-addr.arpa ip6.arpa
                 ttl 30
              }
              prometheus :9153
              forward . /etc/resolv.conf {
                  max_concurrent 1000
              }
              cache 30 {
                  disable success cluster.local
                  disable denial cluster.local
              }
              loop
              reload
              loadbalance
          }
        <MyCorefile>: |
          abc.com:53 {
            errors
            cache 30
            loop
            forward . 1.2.3.4
            }
    
  3. Facoltativo: aggiungi i Corefile personalizzati alla mappa di configurazione di CoreDNS. Nell'esempio seguente, includere import <MyCoreFile> nella sezione data.Corefile e completare la sezione data.<MyCorefile> con le informazioni personalizzate del Corefile. Per ulteriori informazioni, consultare la documentazione sull'importazione di Corefile.

    Il plug-in CoreDNS proxy è obsoleto e viene sostituito con il plug-in forward. Se aggiorni la mappa di configurazione CoreDNS, assicurati di sostituire tutte le istanze proxy con forward.

    kubectl edit configmap -n kube-system coredns
    

    Output dell'esempio Corefile personalizzato

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns
      namespace: kube-system
    data:
      Corefile: |
        import <MyCorefile>
        .:53 {
            errors
            health
            kubernetes cluster.local in-addr.arpa ip6.arpa {
               pods insecure
               upstream 172.16.0.1
               fallthrough in-addr.arpa ip6.arpa
            }
            prometheus :9153
            forward . /etc/resolv.conf {
                max_concurrent 1000
            }
            cache 30 {
                disable success cluster.local
                disable denial cluster.local
            }
            loop
            reload
            loadbalance
        }
      <MyCorefile>: |
        abc.com:53 {
          errors
          cache 30
          loop
          forward . 1.2.3.4
        }
    
  4. Dopo qualche minuto, i pod CoreDNS rilevano le modifiche della mappa di configurazione.

Configurazione della cache DNS NodeLocal

Configura l'agent di memorizzazione nella cache DNS NodeLocal su determinati nodi di lavoro per migliorare le prestazioni e la disponibilità del DNS nel tuo cluster IBM Cloud Kubernetes Service. Per ulteriori informazioni, consultare i documenti di Kubernetes.

Per impostazione predefinita, le richieste DNS del cluster per i pod che utilizzano un criterio DNS ClusterFirst vengono inviate al servizio DNS del cluster. Se abiliti la memorizzazione nella cache DNS NodeLocal su un nodo di lavoro, le richieste DNS del cluster per questi pod che si trovano sul nodo di lavoro vengono inviate invece alla cache DNS locale, che è in ascolto sull'indirizzo IP locale di collegamento 169.254.20.10. La cache DNS ascolta anche l'IP cluster del servizio kube-dns nello spazio dei nomi kube-system.

Non aggiungere l'etichetta della cache DNS se si utilizza già il DNS zone-aware nel cluster. Inoltre, NodeLocal la memorizzazione nella cache DNS si basa su CoreDNS per mantenere la cache delle risoluzioni DNS. Mantenere invariate le configurazioni NodeLocal DNS cache e CoreDNS applicabili, come i domini stub, per mantenere la congruenza della risoluzione DNS.

La cache DNS NodeLocal è generalmente disponibile nei cluster che eseguono Kubernetes 1.18 o versioni successive, ma è ancora disabilitata per impostazione predefinita.

Abilita la cache DNS NodeLocal

Abilita la cache DNS NodeLocal per uno o più nodi di lavoro nel tuo cluster Kubernetes.

La seguente procedura aggiorna i pod DNS che vengono eseguiti su specifici nodi di lavoro. Puoi anche etichettare il pool di nodi di lavoro in modo che i nodi futuri ereditino l'etichetta.

Prima di iniziare, aggiornare tutti i criteri di rete per l'uscita DNS che sono influenzati da questa funzione, come ad esempio i criteri che si basano su pod o selettori di spazio dei nomi per l'uscita DNS.

kubectl get networkpolicy --all-namespaces -o yaml
  1. Accedi al tuo account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

  2. Se hai personalizzato dei domini stub e dei server DNS upstream per CoreDNS, devi anche personalizzare la cache DNS NodeLocal con questi domini stub e server DNS upstream.

  3. Elenca i nodi nel tuo cluster. I pod dell'agent di memorizzazione in cache DNS NodeLocal fanno parte di un insieme di daemon che viene eseguito su ciascun nodo.

    kubectl get nodes
    
  4. Aggiungi l'etichetta ibm-cloud.kubernetes.io/node-local-dns-enabled=true al nodo di lavoro. L'etichetta avvia il pod dell'agent di memorizzazione in cache DNS sul nodo di lavoro.

    1. Aggiungere l'etichetta a uno o più nodi di lavoro.

    2. Verifica che il nodo abbia l'etichetta controllando che il campo NODE-LOCAL-DNS-ENABLED sia impostato su true.

      kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
      

      Output di esempio

      NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
      10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.32+IKS   true
      
    3. Verifica che il pod dell'agent di memorizzazione in cache DNS sia in esecuzione sul nodo di lavoro.

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

      Output di esempio

      NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
      node-local-dns-pvnjn   1/1     Running   0          1m    10.xxx.xx.xxx   10.xxx.xx.xxx  <none>           <none>
      
  5. Ripeti i passi precedenti per ciascun nodo di lavoro per abilitare la memorizzazione in cache DNS.

Disabilita la cache DNS NodeLocal

Puoi disabilitare la cache DNS NodeLocal per uno o più nodi di lavoro.

  1. Accedi al tuo account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

  2. Rimuovi l'etichetta ibm-cloud.kubernetes.io/node-local-dns-enabled dal nodo di lavoro. Questa azione termina il pod dell'agent di memorizzazione in cache DNS sul nodo di lavoro.

    Esegui il seguente comando per rimuovere l'etichetta da tutti i nodi di lavoro nel cluster.

    kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
    

    Immetti questo comando per rimuovere l'etichetta da un singolo nodo di lavoro.

    kubectl label node <node_name> "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
    
    1. Verifica che l'etichetta sia stata rimossa controllando che il campo NODE-LOCAL-DNS-ENABLED sia vuoto.

      kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
      

      Output di esempio

      NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
      10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.32+IKS   
      
    2. Verifica che il pod non sia più in esecuzione sul nodo dove la cache DNS è disabilitata. L'output non mostra alcun pod.

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

      Output di esempio

      No resources found.
      
  3. Ripeti i passi precedenti per ogni nodo di lavoro per disabilitare la memorizzazione in cache DNS.

Personalizzazione della cache DNS NodeLocal

È possibile personalizzare la cache DNS NodeLocal modificando una delle due mappe di configurazione.

NodeLocal La memorizzazione nella cache DNS si basa su CoreDNS per gestire la cache delle risoluzioni DNS. Mantenere invariate le configurazioni NodeLocal DNS cache e CoreDNS applicabili, come i domini stub, per mantenere la congruenza della risoluzione DNS.

Modifica di node-local-dns ConfigMap per aggiornamenti di configurazione generali

Modificare node-local-dns ConfigMap per personalizzare la configurazione della cache DNS NodeLocal.

Prima di iniziare: Accedere al proprio account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

  1. Verifica che la serie di daemon della cache DNS NodeLocal sia disponibile.

    kubectl get ds -n kube-system node-local-dns
    

    Output di esempio

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                         AGE
    node-local-dns   4         4         4       4            4           ibm-cloud.kubernetes.io/node-local-dns-enabled=true   82d
    
  2. Modificare le impostazioni predefinite o aggiungere i Corefile personalizzati alla NodeLocal cache DNS ConfigMap. Ogni Corefile che importi deve utilizzare il percorso coredns. Per ulteriori informazioni, consultare la documentazione Kubernetes.

    Solo una serie limitata di plug-in è supportata per la cache DNS NodeLocal.

    kubectl edit configmap -n kube-system node-local-dns
    

    Output di esempio

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns
      namespace: kube-system
    data:
      Corefile: |
        # Add your NodeLocal DNS customizations as import files under ./coredns directory.
        # Refer to /docs/containers?topic=containers-cluster_dns for details.
        import ./coredns/<MyCorefile>
        cluster.local:53 abc.com:53 {
            errors
            cache {
                    success 9984 30
                    denial 9984 5
            }
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            health 169.254.20.10:8080
            }
        in-addr.arpa:53 {
            errors
            cache 30
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            }
        ip6.arpa:53 {
            errors
            cache 30
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            }
        .:53 {
            errors
            cache 30 {
                  disable success cluster.local
                  disable denial cluster.local
            }
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__UPSTREAM__SERVERS__ {
                    force_tcp
            }
            prometheus :9253
            }
      <MyCorefile>: |
        # Add custom corefile content ...
    
  3. Dopo pochi minuti, i pod della cache DNS NodeLocal rilevano le modifiche della mappa di configurazione.

Modifica di node-local-dns-config ConfigMap per l'estensione con domini stub o server upstream

Modificare la node-local-dns-config ConfigMap per estendere la configurazione della cache DNS NodeLocal, ad esempio personalizzando i domini stub o i server DNS upstream. Per ulteriori informazioni, consultare la documentazione Kubernetes.

Prima di iniziare: Accedere al proprio account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

  1. Verifica che la serie di daemon della cache DNS NodeLocal sia disponibile.

    kubectl get ds -n kube-system node-local-dns
    

    Output di esempio

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                         AGE
    node-local-dns   4         4         4       4            4           ibm-cloud.kubernetes.io/node-local-dns-enabled=true   82d
    
  2. Conferma che la cache DNS NodeLocal abbia una mappa di configurazione.

    1. Determina se la mappa di configurazione della cache DNS NodeLocal DNS esiste.

      kubectl get cm -n kube-system node-local-dns-config
      

      Esempio di output se non esiste ConfigMap

      Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
      
    2. Se la mappa di configurazione non esiste, crea una mappa di configurazione della cache DNS NodeLocal.

      kubectl create cm -n kube-system node-local-dns-config
      

      Output di esempio

      configmap/node-local-dns-config created
      
  3. Modifica la mappa di configurazione della cache DNS NodeLocal. La mappa di configurazione utilizza la sintassi KubeDNS per personalizzare i domini stub e i server DNS upstream. Per ulteriori informazioni, consultare la documentazione Kubernetes.

    kubectl edit cm -n kube-system node-local-dns-config
    

    Output di esempio

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns-config
      namespace: kube-system
    data:
      stubDomains: |
          {"abc.com" : ["1.2.3.4"]}
    
  4. Dopo pochi minuti, i pod della cache DNS NodeLocal rilevano le modifiche della mappa di configurazione.

Configurazione di DNS con zone

Configura il DNS con riconoscimento della zona per migliorare le prestazioni e la disponibilità del DNS del cluster nel tuo cluster IBM Cloud Kubernetes Service multizona. Questa configurazione estende la cache DNS NodeLocal per preferire il traffico DNS del cluster all'interno della stessa zona.

Per impostazione predefinita, il tuo cluster è configurato con risorse DNS a livello di cluster e non con risorse DNS con riconoscimento della zona. Anche dopo aver configurato il DNS con riconoscimento della zona, le risorse DNS a livello di cluster rimangono in esecuzione come DNS di backup. Le tue risorse DNS con riconoscimento della zona sono separate dal DNS a livello di cluster e la modifica del DNS con riconoscimento della zona non influisce sul DNS a livello di cluster.

Non utilizzare l'etichetta della cache DNS quando si utilizza il DNS zone-aware nel cluster.

Configurazione di DNS con zone

Completa il seguente passo per configurare il DNS consapevole della zona nel tuo cluster multizona.

  1. Aggiornare tutti i criteri di rete per l'uscita DNS che sono influenzati dal DNS zone-aware, ad esempio i criteri che si basano sui selettori di pod o di spazio dei nomi per l'uscita DNS. Eseguire il seguente comando per ottenere un elenco dei criteri di rete.

    kubectl get networkpolicy --all-namespaces -o yaml
    
  2. Etichettare coredns ConfigMap nello spazio dei nomi kube-system con ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true.

    kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true"
    
  3. Aggiorna il master cluster per distribuire le risorse DNS sensibili alla zona.

    ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
    
  4. Controlla il completamento dell'operazione di aggiornamento esaminando il campo Master Health nei dettagli del cluster.

    ibmcloud ks cluster get -c <cluster_name_or_ID>
    
  5. Se hai personalizzato dei domini stub e dei server DNS upstream per CoreDNS, devi anche personalizzare la cache DNS NodeLocal con questi domini stub e server DNS upstream.

  6. Imposta una variabile di ambiente per le zone del cluster.

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  7. Avvia i pod CoreDNS e dell'autoscaler CoreDNS in tutte le zone.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1
    done
    
  8. Verifica che i pod CoreDNS e dell'autoscaler CoreDNS siano in esecuzione in tutte le zone.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" -o wide
        kubectl get pods -n kube-system -l "k8s-app=coredns-${ZONE}" -o wide
    done
    
  9. Avvia i pod della cache DNS NodeLocal su tutti i nodi di lavoro.

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
    
  10. Verifica che i pod della cache DNS NodeLocal siano in esecuzione su tutti i nodi di lavoro.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide
    done
    
  11. Etichetta i tuoi pool di nodi di lavoro in modo che i futuri nodi di lavoro ereditino l'etichetta ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true.

Disabilitazione ed eliminazione del DNS con riconoscimento della zona

Per rimuovere il DNS con riconoscimento della zona, devi prima disabilitarlo in ogni zona del tuo cluster multizona. Quindi, elimina le risorse DNS con riconoscimento della zona.

  1. Rimuovi l'etichetta ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true dal tuo pool di nodi di lavoro.

  2. Imposta una variabile di ambiente per le zone nel cluster.

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  3. Arresta i pod della cache DNS NodeLocal su tutti i nodi di lavoro.

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
    
  4. Arresta i pod dell'autoscaler CoreDNS in tutte le zone.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0
    done
    
  5. Verifica che i pod dell'autoscaler CoreDNS non siano più in esecuzione in tutte le zone.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}"
    done
    
  6. Arresta i pod CoreDNS in tutte le zone.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0
    done
    
  7. Rimuovi l'etichetta ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true dalla mappa di configurazione coredns nello spazio dei nomi kube-system.

    kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns-"
    
  8. Aggiorna il master cluster per eliminare le risorse DNS con riconoscimento della zona.

    ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
    
  9. Controlla il completamento dell'operazione di aggiornamento esaminando il campo Master Health nei dettagli del cluster.

    ibmcloud ks cluster get -c <cluster_name_or_ID>