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.
-
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
-
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.
-
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
-
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-inforward
. Se aggiorni la mappa di configurazione CoreDNS, assicurati di sostituire tutte le istanzeproxy
conforward
.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 }
-
Facoltativo: aggiungi i Corefile personalizzati alla mappa di configurazione di CoreDNS. Nell'esempio seguente, includere
import <MyCoreFile>
nella sezionedata.Corefile
e completare la sezionedata.<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-inforward
. Se aggiorni la mappa di configurazione CoreDNS, assicurati di sostituire tutte le istanzeproxy
conforward
.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 }
-
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
-
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. -
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
-
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.-
Aggiungere l'etichetta a uno o più nodi di lavoro.
-
Per etichettare tutti i nodi di lavoro del cluster: Aggiungi l'etichetta a tutti i pool di nodi di lavoro esistenti.
-
Per etichettare un singolo nodo di lavoro:
kubectl label node <node_name> --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled=true"
-
-
Verifica che il nodo abbia l'etichetta controllando che il campo
NODE-LOCAL-DNS-ENABLED
sia impostato sutrue
.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
-
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>
-
-
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.
-
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-"
-
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
-
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.
-
-
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.
node-local-dns
ConfigMap: Personalizza la configurazione dellaNodeLocal
cache DNS.node-local-dns-config
ConfigMap: Estendere la configurazione della cache DNSNodeLocal
personalizzando domini stub o server DNS upstream per risolvere servizi che puntano a host esterni.
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.
-
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
-
Modificare le impostazioni predefinite o aggiungere i Corefile personalizzati alla
NodeLocal
cache DNS ConfigMap. Ogni Corefile che importi deve utilizzare il percorsocoredns
. 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 ...
-
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.
-
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
-
Conferma che la cache DNS
NodeLocal
abbia una mappa di configurazione.-
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
-
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
-
-
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"]}
-
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.
-
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
-
Etichettare
coredns
ConfigMap nello spazio dei nomikube-system
conibm-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"
-
Aggiorna il master cluster per distribuire le risorse DNS sensibili alla zona.
ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
-
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>
-
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. -
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)
-
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
-
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
-
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"
-
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
-
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.
-
Rimuovi l'etichetta
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
dal tuo pool di nodi di lavoro. -
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)
-
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-"
-
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
-
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
-
Arresta i pod CoreDNS in tutte le zone.
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0 done
-
Rimuovi l'etichetta
ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true
dalla mappa di configurazionecoredns
nello spazio dei nomikube-system
.kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns-"
-
Aggiorna il master cluster per eliminare le risorse DNS con riconoscimento della zona.
ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
-
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>