Questa pagina spiega come utilizzare Cloud DNS come provider DNS di Kubernetes per Google Kubernetes Engine (GKE).
L'utilizzo di Cloud DNS come provider DNS non consente ai client esterni a un cluster di risolvere e raggiungere direttamente i servizi Kubernetes. Devi comunque esporre i servizi esternamente utilizzando un bilanciatore del carico e registrare gli indirizzi IP esterni del cluster nell'infrastruttura DNS.
Per maggiori informazioni sull'utilizzo di kube-dns come provider DNS, consulta Service Discovery e DNS. Per scoprire come utilizzare una versione personalizzata di kube-dns o un provider DNS personalizzato, consulta Configurare un deployment kube-dns personalizzato.
Come funziona Cloud DNS per GKE
Cloud DNS può essere utilizzato come provider DNS per GKE, fornendo la risoluzione DNS di pod e servizi con un DNS gestito che non richiede un provider DNS ospitato nel cluster. Viene eseguito automaticamente il provisioning dei record DNS per pod e servizi in Cloud DNS per gli indirizzi IP del cluster, i servizi di nomi headless e esterni.
Cloud DNS supporta la specifica DNS di Kubernetes completa e fornisce risoluzione per i record A, AAAA, SRV e PTR per i servizi all'interno di un cluster GKE. I record PTR vengono implementati utilizzando le regole dei criteri di risposta.
L'utilizzo di Cloud DNS come provider DNS per GKE offre molti vantaggi rispetto al DNS con hosting nel cluster:
- Elimina l'overhead associato alla gestione del server DNS ospitato nel cluster. Cloud DNS non richiede scalabilità, monitoraggio o gestione delle istanze DNS perché è un servizio completamente gestito ospitato nell'infrastruttura Google a scalabilità elevata.
- Risoluzione locale delle query DNS su ciascun nodo GKE. Analogamente a NodeLocal DNSCache, Cloud DNS memorizza nella cache le risposte DNS localmente, offrendo una risoluzione DNS a bassa latenza e ad alta scalabilità.
- Integrazione con l'osservabilità di Google Cloud per il monitoraggio e il logging del DNS. Per maggiori informazioni, consulta Abilitazione e disabilitazione del logging per le zone gestite private.
Architettura
Quando Cloud DNS è il provider DNS per GKE, un controller viene eseguito come pod gestito da GKE. Questo pod viene eseguito sui nodi del piano di controllo del cluster e sincronizza i record DNS del cluster in una zona DNS privata gestita.
Il seguente diagramma mostra in che modo il piano di controllo e il piano dati di Cloud DNS risolvono i nomi dei cluster:
Nel diagramma, il servizio backend
seleziona i pod backend
in esecuzione.
L'oggetto clouddns-controller
crea un record DNS per il servizio backend
.
Il pod frontend
invia una richiesta DNS per risolvere l'indirizzo IP del servizio denominato backend
al server di metadati locale di Compute Engine all'indirizzo 169.254.169.254
. Il server dei metadati viene eseguito localmente sul nodo, inviando le mancate corrispondenze della cache a Cloud DNS.
Il piano dati Cloud DNS viene eseguito localmente all'interno di ogni nodo GKE o istanza di macchina virtuale (VM) Compute Engine. A seconda del tipo di servizio Kubernetes, Cloud DNS risolve il nome del servizio nel proprio indirizzo IP virtuale per i servizi IP del cluster o nell'elenco di indirizzi IP degli endpoint per i servizi headless.
Dopo che il pod frontend
ha risolto l'indirizzo IP, può inviare traffico al servizio backend
e a qualsiasi pod dietro al servizio.
Ambiti DNS
Cloud DNS offre due tipi di ambiti DNS: l'ambito cluster GKE e l'ambito Virtual Private Cloud (VPC). Un cluster non può funzionare contemporaneamente in entrambe le modalità.
Ambito del cluster GKE: i record DNS sono risolvibili solo all'interno del cluster, con lo stesso comportamento di kube-dns. Solo i nodi in esecuzione nel cluster GKE possono risolvere i nomi dei servizi. Per impostazione predefinita, i nomi dei cluster hanno i nomi DNS che terminano con
*.cluster.local
. Questi nomi DNS sono visibili solo all'interno del cluster e non si sovrappongono o sono in conflitto con i nomi DNS*.cluster.local
per altri cluster GKE nello stesso progetto. Questa è la modalità predefinita.Ambito VPC aggiuntivo di Cloud DNS:
L'ambito VPC aggiuntivo di Cloud DNS è una funzionalità facoltativa che estende l'ambito del cluster GKE per rendere i servizi headless risolvibili da altre risorse nel VPC, come VM di Compute Engine o client on-premise connessi tramite Cloud VPN o Cloud Interconnect. L'ambito VPC aggiuntivo è una modalità aggiuntiva abilitata insieme all'ambito del cluster, che puoi enable o disabilitare nel cluster senza influire sull'uptime o sulla funzionalità del DNS (ambito del cluster).
Ambito VPC: i record DNS sono risolvibili all'interno dell'intero VPC. Le VM e i client on-premise di Compute Engine possono connettersi tramite Cloud Interconnect o Cloud VPN e risolvere direttamente i nomi dei servizi GKE. Devi impostare un dominio personalizzato univoco per ogni cluster, il che significa che tutti i record DNS dei pod e dei servizi sono univoci all'interno del VPC. Questa modalità riduce gli attriti nella comunicazione tra le risorse GKE e non GKE.
La seguente tabella elenca le differenze tra l'ambito del cluster GKE, l'ambito VPC additivo di Cloud DNS e l'ambito VPC:
Selezione delle | Ambito del cluster GKE | Ambito VPC aggiuntivo di Cloud DNS | Ambito VPC |
---|---|---|---|
Ambito della visibilità DNS | Solo all'interno del cluster GKE | Si estende all'intera rete VPC | Intera rete VPC |
Risoluzione servizio headless | Risolubile all'interno del cluster | Risolvibile all'interno del cluster utilizzando "cluster.local" e nel VPC tramite il suffisso del cluster | Risolubile all'interno del cluster e nel VPC utilizzando il suffisso del cluster |
Requisito per il dominio univoco | No. Usa il valore predefinito "*.cluster.local" | Sì, devi impostare un dominio personalizzato univoco | Sì, devi impostare un dominio personalizzato univoco |
Configurazione | Predefinita, nessun passaggio aggiuntivo | Facoltativo al momento della creazione del cluster Può essere abilitato/disabilitato in qualsiasi momento |
Deve essere configurato durante la creazione del cluster |
Risorse Cloud DNS
Quando utilizzi Cloud DNS come provider DNS per il cluster GKE, il controller Cloud DNS crea risorse in Cloud DNS per il tuo progetto. Le risorse create da GKE dipendono dall'ambito di Cloud DNS.
Ambito | Zona di ricerca diretta | Zona di ricerca inversa |
---|---|---|
Ambito cluster | 1 zona privata per cluster per zona di Compute Engine (nella regione) | 1 zona dei criteri di risposta per cluster per zona di Compute Engine (nella regione) |
Ambito VPC aggiuntivo di Cloud DNS | 1 zona privata per cluster per zona di Compute Engine (nella regione) per cluster (zona globale)
1 zona privata con ambito VPC per cluster (zona globale) |
1 zona dei criteri di risposta
per cluster per zona di Compute Engine (nella regione) per cluster
(zona globale)
1 zona dei criteri di risposta con ambito VPC per cluster (zona globale) |
Ambito VPC | 1 zona privata per cluster (zona globale) | 1 zona dei criteri di risposta per cluster (zona globale) |
La convenzione di denominazione utilizzata per queste risorse Cloud DNS è la seguente:
Ambito | Zona di ricerca diretta | Zona di ricerca inversa |
---|---|---|
Ambito cluster | gke-CLUSTER_NAME-CLUSTER_HASH-dns |
gke-CLUSTER_NAME-CLUSTER_HASH-rp |
Ambito VPC aggiuntivo di Cloud DNS | gke-CLUSTER_NAME-CLUSTER_HASH-dns per zone con ambito cluster
gke-CLUSTER_NAME-CLUSTER_HASH-dns-vpc per zone con ambito VPC
|
gke-CLUSTER_NAME-CLUSTER_HASH-rp per zone con ambito cluster
gke-NETWORK_NAME_HASH-rp per zone con ambito cluster |
Ambito VPC | gke-CLUSTER_NAME-CLUSTER_HASH-dns |
gke-NETWORK_NAME_HASH-rp |
Oltre alle zone menzionate nella tabella precedente, il controller Cloud DNS crea le seguenti zone nel progetto, a seconda della configurazione:
Configurazione DNS personalizzata | Tipo di zona | Convenzione di denominazione delle zone |
---|---|---|
Dominio Stub | Inoltro (zona globale) | gke-CLUSTER_NAME-CLUSTER_HASH-DOMAIN_NAME_HASH |
Server dei nomi upstream personalizzati | Inoltro (zona globale) | gke-CLUSTER_NAME-CLUSTER_HASH-upstream |
Per scoprire di più su come creare domini stub personalizzati o server dei nomi upstream personalizzati, consulta Aggiungere resolver personalizzati per domini stub.
Zone gestite e zone di inoltro
Per gestire il traffico DNS interno, il controller Cloud DNS crea una zona DNS gestita in ogni zona di Compute Engine della regione a cui appartiene il cluster. Ad esempio, se esegui il deployment di un cluster nella zona us-central1-c
, il controller Cloud DNS crea una zona gestita in us-central1-a
, us-central1-b
, us-central1-c
e us-central1-f
.
Per ogni stubDomain
DNS, il controller Cloud DNS crea una zona di forwarding.
Cloud DNS elabora ogni upstream DNS utilizzando una zona gestita con il nome DNS .
.
Prezzi
Quando Cloud DNS è il provider DNS per i cluster GKE Standard, le query DNS dai pod all'interno del cluster GKE vengono fatturate in base ai prezzi di Cloud DNS.
Le query a una zona DNS con ambito VPC gestita da GKE vengono fatturate utilizzando i prezzi standard di Cloud DNS.
Requisiti
L'API Cloud DNS deve essere abilitata nel tuo progetto.
Cloud DNS per GKE ha i seguenti requisiti per l'ambito del cluster:
- Per Standard, GKE versione 1.24.7-gke.800, 1.25.3-gke.700 o successive.
- Per Autopilot, GKE versione 1.25.9-gke.400, 1.26.4-gke.500 o successive.
- Google Cloud CLI versione 411.0.0 o successive.
Cloud DNS per GKE prevede i seguenti requisiti per l'ambito VPC aggiuntivo:
- Per Standard, GKE versione 1.24.7-gke.800, 1.25.3-gke.700 o successive.
- Per Autopilot, GKE versione 1.28 o successive.
- Google Cloud CLI versione 471.0.0.
- Il cluster GKE deve utilizzare l'ambito del cluster Cloud DNS come provider DNS predefinito.
Cloud DNS per GKE ha i seguenti requisiti per l'ambito VPC:
- Per Standard, GKE versione 1.19 o successive.
- Google Cloud CLI versione 364.0.0 o successive.
- L'API Cloud DNS deve essere abilitata nel tuo progetto.
Limitazioni e limitazioni
Si applicano le seguenti limitazioni:
- L'ambito VPC non è supportato sui cluster Autopilot, è supportato solo l'ambito del cluster. Se hai bisogno di risolvere i nomi di servizio headless in esecuzione nei cluster GKE Autopilot, devi utilizzare l'ambito VPC aggiuntivo.
- Cloud DNS non è conforme a un regime di conformità Impact Level 4 (IL4). Cloud DNS per GKE non può essere utilizzato in un Assured Workload con un regime di conformità IL4. In questo ambiente regolamentato, devi utilizzare kube-dns. Per i cluster GKE Autopilot, la selezione di kube-dns o Cloud DNS viene eseguita automaticamente in base al tuo regime di conformità.
- Le modifiche manuali alle zone DNS private gestite non sono supportate e vengono sovrascritte dal controller Cloud DNS. Le modifiche ai record DNS in queste zone non vengono mantenute al riavvio del controller.
- Dopo aver abilitato Cloud DNS per GKE in un cluster, kube-dns continua a essere eseguito nel cluster. Puoi disabilitare kube-dns ridimensionando il deployment e il gestore della scalabilità automatica di kube-dns fino a zero.
- Non puoi modificare l'ambito DNS in un cluster dopo aver impostato
l'ambito con il flag
--cluster-dns-scope
. Se devi modificare l'ambito DNS, ricrea il cluster con un ambito DNS diverso. - Alle configurazioni DNS di pod e nodi si applicano domini stub personalizzati e configurazioni di server DNS upstream. I pod che utilizzano il networking host o i processi che vengono eseguiti direttamente sull'host utilizzano anch'essi il dominio stub e le configurazioni upstream del server dei nomi. Questa opzione è supportata solo in Standard.
- I domini stub personalizzati e i nameserver upstream configurati tramite la mappa kube-dns ConfigMap vengono applicati automaticamente a Cloud DNS per il DNS nell'ambito del cluster. Il DNS in ambito VPC ignora il ConfigMap kube-dns e devi applicare queste configurazioni direttamente su Cloud DNS. Questa opzione è supportata solo in Standard.
- Non esiste un percorso di migrazione da kube-dns all'ambito VPC e l'operazione è invasiva. Ricrea il cluster quando passi da kube-dns all'ambito VPC o viceversa.
- Per l'ambito VPC, l'intervallo di indirizzi IP secondari per i servizi non deve essere condiviso con altri cluster nella subnet.
- Per l'ambito VPC, il criterio di risposta associato a un record PTR è collegato alla rete VPC. Se esistono altri criteri di risposta associati alla rete del cluster, la risoluzione del record PTR non va a buon fine per gli indirizzi IP del servizio Kubernetes.
- Se provi a creare un servizio headless con un numero di pod che supera la quota consentita, Cloud DNS non crea set di record o record per il servizio.
Quote
Cloud DNS utilizza le quote per limitare il numero di risorse che GKE può creare per le voci DNS. Le quote e i limiti per Cloud DNS potrebbero essere diversi dai limiti di kube-dns per il tuo progetto.
Le seguenti quote predefinite vengono applicate a ogni zona gestita nel tuo progetto quando utilizzi Cloud DNS per GKE:
Risorsa DNS di Kubernetes | Risorsa Cloud DNS corrispondente | Quota |
---|---|---|
Numero di record DNS | Byte massimi per zona gestita | 2.000.000 (massimo 50 MB per una zona gestita) |
Numero di pod per servizio headless (IPv4/IPv6) | Numero di record per set di record di risorse | GKE da 1.24 a 1.25: 1000 (IPv4/IPv6) GKE 1.26 e versioni successive: 3500/2000 (IPv4/IPv6) |
Numero di cluster GKE in un progetto | Numero di criteri di risposta per progetto | 100 |
Numero di record PTR per cluster | Numero di regole per criterio di risposta | 100.000 |
Limiti delle risorse
Le risorse Kubernetes create per cluster contribuiscono ai limiti delle risorse di Cloud DNS, come descritto nella tabella seguente:
Limite | Contributo per limitare |
---|---|
Set di record di risorse per zona gestita | Numero di servizi più numero di endpoint di servizio headless con nomi host validi, per cluster. |
Record per set di record di risorse | Numero di endpoint per servizio headless. Non influisce su altri tipi di servizi. |
Numero di regole per criterio di risposta | Per l'ambito del cluster, il numero di servizi più il numero di endpoint di servizio headless con nomi host validi per cluster. Per l'ambito VPC, numero di servizi più numero di endpoint headless con nomi host di tutti i cluster nel VPC. |
Per saperne di più su come vengono creati i record DNS per Kubernetes, consulta Kubernetes DNS-Based Service Discovery.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività, installa e initialize gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo
gcloud components update
.
Abilita l'API Cloud DNS nel tuo progetto:
Abilita DNS nell'ambito del cluster
Nel DNS dell'ambito del cluster, solo i nodi in esecuzione nel cluster GKE possono risolvere i nomi dei servizi e questi non sono in conflitto tra i cluster. Questo comportamento è uguale a kube-dns nei cluster GKE, il che significa che puoi eseguire la migrazione dei cluster da kube-dns all'ambito del cluster Cloud DNS senza tempi di inattività o modifiche alle applicazioni.
Il seguente diagramma mostra in che modo Cloud DNS crea una zona DNS privata per un cluster GKE. Solo i processi e i pod in esecuzione sui nodi nel cluster possono risolvere i record DNS del cluster, perché solo i nodi sono nell'ambito DNS.
Abilita il DNS dell'ambito del cluster in un nuovo cluster
Cluster GKE Autopilot
I nuovi cluster Autopilot nella versione 1.25.9-gke.400, 1.26.4-gke.500 o successiva vengono impostati come predefiniti nell'ambito del cluster Cloud DNS.
Cluster GKE Standard
Puoi creare un cluster GKE Standard con l'ambito del cluster Cloud DNS abilitato utilizzando gcloud CLI o la console Google Cloud:
gcloud
Crea un cluster utilizzando il flag --cluster-dns
:
gcloud container clusters create CLUSTER_NAME \
--cluster-dns=clouddns \
--cluster-dns-scope=cluster \
--location=COMPUTE_LOCATION
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.COMPUTE_LOCATION
: la località di Compute Engine per il cluster.
Il flag --cluster-dns-scope=cluster
è facoltativo nel comando perché
cluster
è il valore predefinito.
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic su add_box Crea.
Nel riquadro di navigazione, in Cluster, fai clic su Networking.
Nella sezione Provider DNS, fai clic su Cloud DNS.
Seleziona Ambito del cluster.
Configura il cluster in base alle tue esigenze.
Fai clic su Crea.
Abilita il DNS dell'ambito del cluster in un cluster esistente
Cluster GKE Autopilot
Non puoi eseguire la migrazione di un cluster GKE Autopilot esistente da kube-dns a un ambito del cluster Cloud DNS. Per abilitare l'ambito dei cluster Cloud DNS, ricrea i cluster Autopilot nelle versioni 1.25.9-gke.400, 1.26.4-gke.500 o successive.
Cluster GKE Standard
Puoi eseguire la migrazione di un cluster GKE Standard esistente da kube-dns a un ambito del cluster Cloud DNS utilizzando gcloud CLI o la console Google Cloud in un cluster GKE Standard.
Quando esegui la migrazione di un cluster esistente, i nodi nel cluster non utilizzano Cloud DNS come provider DNS finché non li ricrea.
Dopo aver abilitato Cloud DNS per un cluster, le impostazioni si applicano solo se esegui l'upgrade dei pool di nodi esistenti o se aggiungi nuovi pool di nodi al cluster. Quando esegui l'upgrade di un pool di nodi, i nodi vengono ricreati.
Puoi anche eseguire la migrazione dei cluster che hanno applicazioni in esecuzione senza interrompere la comunicazione dei cluster, abilitando Cloud DNS come provider DNS in ogni pool di nodi separatamente. Un sottoinsieme dei nodi è sempre operativo, perché alcuni pool di nodi utilizzano kube-dns, mentre altri utilizzano Cloud DNS.
Nei passaggi seguenti, abiliti Cloud DNS per un cluster, quindi esegui l'upgrade dei pool di nodi. L'upgrade dei pool di nodi ricrea i nodi. I nodi utilizzano quindi Cloud DNS per la risoluzione DNS anziché kube-dns.
gcloud
Aggiorna il cluster esistente:
gcloud container clusters update CLUSTER_NAME \ --cluster-dns=clouddns \ --cluster-dns-scope=cluster \ --location=COMPUTE_LOCATION
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.COMPUTE_LOCATION
: la località di Compute Engine per il tuo cluster.
La risposta è simile alla seguente:
All the node-pools in the cluster need to be re-created by the user to start using Cloud DNS for DNS lookups. It is highly recommended to complete this step shortly after enabling Cloud DNS. Do you want to continue (Y/n)?
Dopo la conferma, il controller Cloud DNS viene eseguito sul piano di controllo GKE, ma i tuoi pod non utilizzano Cloud DNS per la risoluzione DNS finché non esegui l'upgrade del pool di nodi o non aggiungi nuovi pool di nodi al cluster.
Esegui l'upgrade dei pool di nodi nel cluster per utilizzare Cloud DNS:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=POOL_NAME \ --location=COMPUTE_LOCATION
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.POOL_NAME
: il nome del pool di nodi di cui eseguire l'upgrade.
Se il pool di nodi e il piano di controllo utilizzano la stessa versione, esegui prima l'upgrade del piano di controllo, come descritto in Upgrade manuale del piano di controllo, quindi esegui l'upgrade del pool di nodi.
Conferma la risposta e ripeti questo comando per ogni pool di nodi nel cluster. Se il cluster ha un pool di nodi, ometti il flag
--node-pool
.
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic sul nome del cluster da modificare.
In Networking, nel campo Provider DNS, fai clic su edit Modifica provider DNS.
Fai clic su Cloud DNS.
Fai clic su Ambito del cluster.
Fai clic su Salva modifiche.
Abilita l'ambito VPC aggiuntivo di Cloud DNS
Questa sezione descrive i passaggi per abilitare o disabilitare l'ambito VPC aggiuntivo di Cloud DNS, come componente aggiuntivo dell'ambito del cluster Cloud DNS.
Abilita l'ambito VPC aggiuntivo di Cloud DNS in un nuovo cluster
Puoi abilitare il DNS di ambito VPC in un nuovo cluster GKE utilizzando gcloud CLI o la console Google Cloud.
Per Autopilot
gcloud container clusters create-auto CLUSTER_NAME \
--additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.UNIQUE_CLUSTER_DOMAIN
: il nome di un dominio. Devi assicurarti che questo nome sia univoco all'interno del VPC perché GKE non conferma questo valore. Non puoi modificare questo valore dopo averlo impostato. Non devi utilizzare un dominio che termina con ".local", altrimenti potrebbero verificarsi errori di risoluzione DNS.
Per standard
gcloud container clusters create CLUSTER_NAME \
--cluster-dns-scope=cluster \
--additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.UNIQUE_CLUSTER_DOMAIN
: il nome di un dominio. Devi assicurarti che questo nome sia univoco all'interno del VPC perché GKE non conferma questo valore. Non puoi modificare questo valore dopo averlo impostato. Non devi utilizzare un dominio che termina con ".local", altrimenti potrebbero verificarsi errori di risoluzione DNS.
Abilita l'ambito VPC aggiuntivo di Cloud DNS in un cluster esistente
Per abilitare l'ambito VPC aggiuntivo di Cloud DNS in un cluster esistente, devi prima abilitare Cloud DNS per un cluster, quindi eseguire l'upgrade dei pool di nodi. L'upgrade dei pool di nodi ricrea i nodi. I nodi utilizzano quindi Cloud DNS per la risoluzione DNS anziché kube-dns.
Per abilitare l'ambito VPC aggiuntivo di Cloud DNS in un cluster esistente:
gcloud container clusters update CLUSTER_NAME \
--enable-additive-vpc-scope \
--additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.UNIQUE_CLUSTER_DOMAIN
: il nome di un dominio. Devi assicurarti che questo nome sia univoco all'interno del VPC perché GKE non conferma questo valore. Non puoi modificare questo valore dopo averlo impostato. Non devi utilizzare un dominio che termina con ".local", altrimenti potrebbero verificarsi errori di risoluzione DNS.
Abilita DNS ambito VPC
Nel DNS di ambito VPC, i nomi DNS di un cluster sono risolvibili all'interno dell'intero VPC. Qualsiasi client nel VPC può risolvere i record DNS del cluster.
Il DNS in ambito VPC consente i seguenti casi d'uso:
- Service Discovery headless per client non GKE all'interno dello stesso VPC.
- Risoluzione del servizio GKE da client cloud on-premise o di terze parti. Per maggiori informazioni, consulta la pagina relativa ai criteri del server in entrata.
- Risoluzione del servizio in cui un client può decidere con quale cluster vuole comunicare utilizzando il dominio DNS del cluster personalizzato.
Nel diagramma seguente, due cluster GKE utilizzano il DNS con ambito VPC nello stesso VPC. Entrambi i cluster hanno un dominio DNS personalizzato,
.cluster1
e .cluster2
, anziché il dominio .cluster.local
predefinito. Una VM comunica con il servizio di backend headless risolvendo backend.default.svc.cluster1
. Cloud DNS risolve il servizio headless nei singoli IP dei pod nel servizio e la VM comunica direttamente con gli IP dei pod.
Puoi anche eseguire questo tipo di risoluzione da altre reti quando sei connesso al VPC tramite Cloud Interconnect o Cloud VPN. I criteri dei server DNS consentono ai client delle reti connesse al VPC di risolvere i nomi in Cloud DNS, che include i servizi GKE se il cluster utilizza il DNS di ambito VPC.
Abilita il DNS di ambito VPC in un cluster esistente
La migrazione è supportata solo in GKE Standard e non in GKE Autopilot.
Cluster GKE Autopilot
Non puoi eseguire la migrazione di un cluster GKE Autopilot da kube-dns all'ambito VPC di Cloud DNS.
Cluster GKE Standard
Puoi eseguire la migrazione di un cluster GKE esistente da kube-dns all'ambito VPC di Cloud DNS utilizzando gcloud CLI o la console Google Cloud.
Dopo aver abilitato Cloud DNS per un cluster, le impostazioni si applicano solo se esegui l'upgrade dei pool di nodi esistenti o se aggiungi nuovi pool di nodi al cluster. Quando esegui l'upgrade di un pool di nodi, i nodi vengono ricreati.
Nei passaggi seguenti, abiliti Cloud DNS per un cluster, quindi esegui l'upgrade dei pool di nodi. L'upgrade dei pool di nodi ricrea i nodi. I nodi utilizzano quindi Cloud DNS per la risoluzione DNS anziché kube-dns.
gcloud
Aggiorna il cluster esistente:
gcloud container clusters update CLUSTER_NAME \ --cluster-dns=clouddns \ --cluster-dns-scope=vpc \ --cluster-dns-domain=CUSTOM_DOMAIN \ --location=COMPUTE_LOCATION
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.COMPUTE_LOCATION
: la località di Compute Engine per il cluster.CUSTOM_DOMAIN
: il nome di un dominio. Devi assicurarti che questo nome sia univoco all'interno del VPC perché GKE non conferma questo valore. Non puoi modificare questo valore dopo averlo impostato. Non devi utilizzare un dominio che termina con ".local", altrimenti potrebbero verificarsi errori di risoluzione DNS.
La risposta è simile alla seguente:
All the node-pools in the cluster need to be re-created by the user to start using Cloud DNS for DNS lookups. It is highly recommended to complete this step shortly after enabling Cloud DNS. Do you want to continue (Y/n)?
Dopo la conferma, il controller Cloud DNS viene eseguito sul piano di controllo GKE. I tuoi pod non utilizzano Cloud DNS per la risoluzione DNS finché non esegui l'upgrade del pool di nodi o non aggiungi nuovi pool di nodi al cluster.
Esegui l'upgrade dei pool di nodi nel cluster per utilizzare Cloud DNS:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=POOL_NAME
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.POOL_NAME
: il nome del pool di nodi di cui eseguire l'upgrade.
Se il pool di nodi e il piano di controllo utilizzano la stessa versione, esegui prima l'upgrade del piano di controllo, come descritto in Upgrade manuale del piano di controllo, quindi esegui l'upgrade del pool di nodi.
Conferma la risposta e ripeti questo comando per ogni pool di nodi nel cluster. Se il cluster ha un pool di nodi, ometti il flag
--node-pool
.
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic sul nome del cluster da modificare.
In Networking, nel campo Provider DNS, fai clic su edit Modifica provider DNS.
Fai clic su Cloud DNS.
Fai clic su Ambito VPC.
Fai clic su Salva modifiche.
Verifica Cloud DNS
Verifica che Cloud DNS per GKE funzioni correttamente per il tuo cluster:
Verifica che i nodi utilizzino Cloud DNS connettendoti a un pod su un nodo ed eseguendo il comando
cat /etc/resolv.conf
:kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
Sostituisci
POD_NAME
con il nome del pod.In base alla modalità cluster, l'output è simile al seguente:
Cluster GKE Autopilot
nameserver 169.254.20.10
Poiché NodeLocal DNSCache è abilitato per impostazione predefinita in GKE Autopilot, il pod utilizza NodeLocal DNSCache.
Solo quando la cache locale non dispone di una voce per il nome che viene cercato, NodeLocal DNSCache inoltra la richiesta a Cloud DNS.
Cluster GKE Standard
nameserver 169.254.169.254
Il pod utilizza
169.254.169.254
comenameserver
, ovvero l'indirizzo IP del server metadati in cui il piano dati Cloud DNS ascolta le richieste sulla porta 53. I nodi non utilizzano più l'indirizzo di servizio kube-dns per la risoluzione DNS e tutta la risoluzione DNS avviene sul nodo locale.Se l'output è un indirizzo IP simile a
10.x.y.10
, il pod utilizza kube-dns. Consulta la sezione Risoluzione dei problemi per capire perché il tuo pod utilizza ancora kube-dns.Se l'output è
169.254.20.10
, significa che hai abilitato NodeLocal DNSCache nel cluster e il pod utilizza NodeLocal DNSCache.Esegui il deployment di un'applicazione di esempio nel cluster:
kubectl run dns-test --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
Esponi l'applicazione di esempio con un servizio:
kubectl expose pod dns-test --name dns-test-svc --port 8080
Verifica che il deployment del servizio sia andato a buon fine:
kubectl get svc dns-test-svc
L'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dns-test-svc ClusterIP 10.47.255.11 <none> 8080/TCP 6m10s
Il valore di
CLUSTER-IP
è l'indirizzo IP virtuale del cluster. In questo esempio, l'indirizzo IP virtuale è10.47.255.11
.Verifica che il nome del servizio sia stato creato come record nella zona DNS privata per il cluster:
gcloud dns record-sets list \ --zone=PRIVATE_DNS_ZONE \ --name=dns-test-svc.default.svc.cluster.local.
Sostituisci
PRIVATE_DNS_ZONE
con il nome della zona DNS gestita.L'output è simile al seguente:
NAME: dns-test-svc.default.svc.cluster.local. TYPE: A TTL: 30 DATA: 10.47.255.11
Disabilita Cloud DNS per GKE
Cluster GKE Autopilot
Non puoi disabilitare Cloud DNS in un cluster GKE Autopilot creato con Cloud DNS per impostazione predefinita. Consulta i requisiti per ulteriori informazioni sui cluster GKE Autopilot che utilizzano Cloud DNS per impostazione predefinita.
Cluster GKE Standard
Puoi disabilitare l'ambito del cluster Cloud DNS utilizzando gcloud CLI o la console Google Cloud in un cluster GKE Standard.
gcloud
Aggiorna il cluster per utilizzare kube-dns:
gcloud container clusters update CLUSTER_NAME \
--cluster-dns=default
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic sul nome del cluster da modificare.
In Networking, nel campo Provider DNS, fai clic su edit Modifica provider DNS.
Fai clic su Kube-dns.
Fai clic su Salva modifiche.
Disabilita l'ambito VPC aggiuntivo di Cloud DNS
Quando disabiliti l'ambito VPC aggiuntivo di Cloud DNS per il tuo cluster, verranno eliminati solo i record DNS nelle zone private collegate alla rete VPC. I record nelle zone DNS private del cluster GKE rimarranno gestiti da Cloud DNS per GKE, finché il servizio headless non verrà eliminato dal cluster.
Per disabilitare l'ambito VPC aggiuntivo di Cloud DNS, esegui questo comando:
gcloud container clusters update CLUSTER_NAME \
--disable-additive-vpc-scope
Sostituisci CLUSTER_NAME
con il nome del cluster.
In questo modo, il cluster rimarrà abilitato per il cluster Cloud DNS per fornire la risoluzione DNS dall'interno del cluster.
Esegui la pulizia
Dopo aver completato gli esercizi su questa pagina, segui questi passaggi per rimuovere le risorse ed evitare addebiti indesiderati sul tuo account:
Elimina il servizio:
kubectl delete service dns-test-svc
Elimina il pod:
kubectl delete Pod dns-test
Puoi anche eliminare il cluster.
Utilizza Cloud DNS con un VPC condiviso
Cloud DNS per GKE supporta il VPC condiviso sia per l'ambito VPC che per il cluster.
Il controller GKE crea una zona privata gestita nello stesso progetto del cluster GKE.
L'account di servizio GKE per il cluster GKE non richiede Identity and Access Management (IAM) per il DNS al di fuori del proprio progetto perché la zona gestita e il cluster GKE risiedono all'interno dello stesso progetto.
Più di un cluster per progetto di servizio
A partire dalle versioni di GKE 1.22.3-gke.700, 1.21.6-gke.1500, puoi creare cluster in più progetti di servizio che fanno riferimento a un VPC nello stesso progetto host. Se hai già cluster che utilizzano il VPC condiviso e l'ambito VPC di Cloud DNS, devi eseguirne manualmente la migrazione seguendo questi passaggi:
- Esegui l'upgrade dei cluster esistenti in cui è abilitato il VPC condiviso a GKE versione 1.22.3-gke.700+ o 1.21.6-gke.1500+.
- Eseguire la migrazione del criterio di risposta dal progetto di servizio al progetto host. Questa migrazione deve essere eseguita una sola volta per rete VPC condiviso.
Puoi eseguire la migrazione del criterio di risposta utilizzando la console Google Cloud.
Nel progetto di servizio, esegui i seguenti passaggi:
Vai alla pagina Zone Cloud DNS.
Fai clic sulla scheda Zone del criterio di risposta.
Fai clic sul criterio di risposta per la tua rete VPC. Puoi identificare il criterio di risposta dalla descrizione, che è simile a "Criterio di risposta per i cluster GKE sulla rete NETWORK_NAME".
Fai clic sulla scheda Utilizzato da.
Accanto al nome del progetto host, fai clic su delete per rimuovere l'associazione di rete.
Fai clic sulla scheda Regole delle norme di risposta.
Seleziona tutte le voci della tabella.
Fai clic su Rimuovi le regole del criterio di risposta.
Fai clic su delete Elimina criterio di risposta.
Dopo aver eliminato il criterio di risposta, il controller DNS crea automaticamente il criterio di risposta nel progetto host. I cluster di altri progetti di servizio condividono questo criterio di risposta.
Supporta domini stub personalizzati e server dei nomi upstream
Cloud DNS per GKE supporta domini stub personalizzati e server dei nomi upstream configurati utilizzando kube-dns ConfigMap. Questo supporto è disponibile solo per i cluster GKE Standard.
Cloud DNS converte i valori stubDomains
e upstreamNameservers
in zone di forwarding Cloud DNS.
Problemi noti
Terraform pianifica di ricreare il cluster Autopilot a causa di una modifica di dns_config
Se utilizzi terraform-provider-google
o terraform-provider-google-beta
, potresti
riscontrare un problema per cui Terraform tenta di ricreare un
cluster Autopilot. Questo errore si verifica perché i cluster Autopilot appena creati che eseguono le versioni 1.25.9-gke.400, 1.26.4-gke.500, 1.27.1-gke.400 o successive utilizzano Cloud DNS come provider DNS anziché kube-dns.
Questo problema è stato risolto nella versione 4.80.0 del provider Terraform di Google Cloud.
Se non riesci ad aggiornare la versione di terraform-provider-google
o
terraform-provider-google-beta
, puoi aggiungere lifecycle.ignore_changes
alla
risorsa per assicurarti che google_container_cluster
ignori le modifiche apportate a
dns_config
:
lifecycle {
ignore_changes = [
dns_config,
]
}
Risoluzione dei problemi
Per informazioni su come abilitare il logging DNS, consulta Abilitazione e disabilitazione del logging per le zone gestite private.
Per maggiori informazioni sulla risoluzione dei problemi DNS, consulta Risoluzione dei problemi relativi al DNS in GKE.
Impossibile aggiornare il cluster esistente o creare un cluster con Cloud DNS abilitato
Assicurati di utilizzare la versione corretta. Cloud DNS per GKE richiede GKE versione 1.19 o successiva per i cluster che utilizzano l'ambito VPC oppure GKE versione 1.24.7-gke.800, 1.25.3-gke.700 o successiva per i cluster che utilizzano l'ambito del cluster.
I pod utilizzano kube-dns anche dopo aver abilitato Cloud DNS su un cluster esistente
Assicurati di aver eseguito l'upgrade o ricreato i pool di nodi dopo aver abilitato Cloud DNS nel cluster. Finché questo passaggio non sarà completato, i pod continueranno a utilizzare kube-dns.
Il pod non è in grado di risolvere le ricerche DNS
Verifica che il pod utilizzi Cloud DNS collegandoti a un pod ed eseguendo il comando
cat /etc/resolv.conf
:kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
Sostituisci
POD_NAME
con il nome del pod.L'output è simile al seguente:
nameserver 169.254.169.254
Se l'output è un indirizzo IP simile a
10.x.y.10
o34.118.224.10
(solo nei cluster GKE Autopilot con versioni 1.27 e successive), il pod utilizza kube-dns. Se l'output è169.254.20.10
, il pod utilizza NodeLocal DNSCache.Verifica che la zona gestita esista e contenga la voce DNS necessaria:
gcloud dns managed-zones list --format list
L'output è simile al seguente:
- creationTime: 2021-02-12T19:24:37.045Z description: Private zone for GKE cluster "cluster1" with cluster suffix "cluster.local" in project "project-243723" dnsName: cluster.local. id: 5887499284756055830 kind: dns#managedZone name: gke-cluster1-aa94c1f9-dns nameServers: ['ns-gcp-private.googledomains.com.'] privateVisibilityConfig: {'kind': 'dns#managedZonePrivateVisibilityConfig'} visibility: private
Il valore
name
nella risposta indica che Google Cloud ha creato una zona privata denominatagke-cluster1-aa94c1f9-dns
.Verifica che Cloud DNS contenga voci per il tuo cluster:
gcloud dns record-sets list --zone ZONE_NAME | grep SERVICE_NAME
Sostituisci quanto segue:
ZONE_NAME
: il nome della zona privata.SERVICE_NAME
: il nome del servizio.
L'output mostra che Cloud DNS contiene un record A per il dominio
dns-test.default.svc.cluster.local.
e l'indirizzo IP del tuo cluster,10.47.255.11
:dns-test.default.svc.cluster.local. A 30 10.47.255.11
Attiva il logging di Cloud DNS per monitorare le query. Ogni voce di log contiene informazioni sulla query, inclusa la latenza DNS.
Le ricerche DNS sui nodi non riescono dopo aver abilitato Cloud DNS su un cluster
Se abiliti Cloud DNS nell'ambito del cluster in un cluster GKE che dispone di domini stub personalizzati o nameserver upstream, la configurazione personalizzata si applica sia ai nodi che ai pod nel cluster perché Cloud DNS non è in grado di distinguere tra richieste DNS dei pod e dei nodi. Le ricerche DNS sui nodi potrebbero non riuscire se il server upstream personalizzato non è in grado di risolvere le query.
Impossibile aggiornare il cluster esistente o creare un cluster con l'ambito VPC aggiuntivo di Cloud DNS abilitato
Assicurati di utilizzare la versione corretta. L'ambito VPC aggiuntivo di Cloud DNS richiede GKE versione 1.28 o successiva.
Il pod non è in grado di risolvere le ricerche DNS
Verifica che il pod utilizzi Cloud DNS collegandoti a un pod ed eseguendo il comando
cat /etc/resolv.conf
:kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
Sostituisci
POD_NAME
con il nome del pod.L'output è simile al seguente:
nameserver 169.254.169.254
Se l'output è un indirizzo IP simile a
10.x.y.10
o34.118.224.10
(solo nei cluster GKE Autopilot con versioni 1.27 e successive), il pod utilizza kube-dns. Se l'output è169.254.20.10
, il pod utilizza NodeLocal DNSCache.Verifica che la zona gestita esista e contenga la voce DNS necessaria:
gcloud dns managed-zones list --format list
L'output è simile al seguente:
gke-cluster-1-cbdc0678-dns cluster.local. Private zone for GKE cluster "cluster-1" with cluster suffix "cluster.local." in project "PROJECT_NAME" with scope "CLUSTER_SCOPE" private gke-cluster-1-cbdc-dns-vpc CLUSTER_DOMAIN. Private zone for GKE cluster "cluster-1" with cluster suffix "CLUSTER_DOMAIN." in project "PROJECT_NAME" with scope "VPC_SCOPE" private
Il valore
name
nella risposta indica che Google Cloud ha creato una zona privata denominatagke-cluster1-aa94c1f9-dns
.Verifica che Cloud DNS contenga le voci per il tuo cluster in entrambe le zone Managed:
gcloud dns record-sets list --zone ZONE_NAME | grep SERVICE_NAME
Sostituisci quanto segue:
ZONE_NAME
: il nome della zona privata.SERVICE_NAME
: il nome del servizio.
L'output è simile al seguente:
my-service.default.svc.cluster.local. A 30 10.47.255.11
Il valore
name
nella risposta indica che Google Cloud ha creato una zona privata denominatagke-cluster1-aa94c1f9-dns
.Per le ricerche DNS inverse, verifica che Cloud DNS contenga voci per il tuo cluster in ResponsePolicies:
gcloud dns response-policies list --format="table(responsePolicyName, description)"
L'output è simile al seguente:
gke-NETWORK_HASH-rp Response Policy for GKE clusters on network "VPC_NAME". gke-cluster-1-52c8f518-rp Response Policy for GKE cluster "cluster-1" with cluster suffix "cluster.local." in project "khamed-gke-dev" with scope "CLUSTER_SCOPE".
Il valore
name
nella risposta indica che Google Cloud ha creato una zona privata denominatagke-cluster1-aa94c1f9-rp
.Per le ricerche DNS inverse, verifica che Cloud DNS contenga voci per il tuo cluster in ResponsePolicies:
gcloud dns response-policies rules list ZONE_NAME --format="table(localData.localDatas[0].name, localData.localDatas[0].rrdatas[0])"
Sostituisci
ZONE_NAME
con il nome della zona privata.L'output è simile al seguente:
1.240.27.10.in-addr.arpa. kubernetes.default.svc.cluster.local. 52.252.27.10.in-addr.arpa. default-http-backend.kube-system.svc.cluster.local. 10.240.27.10.in-addr.arpa. kube-dns.kube-system.svc.cluster.local. 146.250.27.10.in-addr.arpa. metrics-server.kube-system.svc.cluster.local.
Passaggi successivi
- Leggi una panoramica di come GKE fornisce il DNS gestito.
- Leggi DNS per servizi e pod per una panoramica generale sull'utilizzo del DNS nei cluster Kubernetes.
- Scopri di più su ambiti e gerarchie in Cloud DNS.
- Scopri di più su abilitazione e disabilitazione del logging per le zone gestite private.