Este documento explica como configurar e usar o Cloud DNS como provedor de DNS para seus clusters do Google Kubernetes Engine (GKE).
O Cloud DNS gerencia automaticamente os registros DNS dos seus serviços do Kubernetes. Por padrão, esses registros só podem ser acessados de dentro do cluster (escopo do cluster).
Se você precisar resolver serviços headless de fora do cluster, como de VMs do Compute Engine, ative o escopo da VPC ou o escopo aditivo da VPC.
Este documento é destinado a usuários do GKE, incluindo desenvolvedores, administradores e arquitetos. Para saber mais sobre papéis comuns e tarefas de exemplo no Google Cloud, consulte Funções e tarefas de usuário comuns do GKE Enterprise.
Para aproveitar ao máximo este documento, você precisa conhecer os seguintes tópicos:
- Serviço do Kubernetes.
- Serviços de vários clusters.
- Sobre a descoberta de serviços.
- Sobre o Cloud DNS.
Para tornar os serviços ClusterIP ou NodePort acessíveis de fora do cluster,
é necessário expor o serviço usando um LoadBalancer ou outro método e registrar
o endereço IP externo dele no Cloud DNS.
Para mais informações sobre como usar kube-dns como um provedor de DNS, consulte Descoberta de serviços e DNS.
Para saber como usar uma versão personalizada do kube-dns ou um provedor de DNS personalizado, consulte
Como configurar uma implantação personalizada do kube-dns.
Preços
Quando o Cloud DNS é o provedor de DNS para clusters do GKE Standard, as consultas DNS de pods dentro do cluster do GKE são faturadas de acordo com os preços do Cloud DNS.
As consultas a uma zona de DNS com escopo da VPC gerenciada pelo GKE são faturadas usando o preço padrão do Cloud DNS.
Restrições e limitações
Considere as seguintes limitações:
- O escopo da VPC não é compatível com clusters do Autopilot. Apenas o escopo do cluster é aceito. Se você precisar resolver nomes de serviços headless em execução nos clusters do GKE Autopilot, use o escopo aditivo da VPC.
- É possível ativar o escopo aditivo da VPC nos clusters do GKE Autopilot apenas na criação do cluster. Não é possível ativar ou desativar o escopo aditivo da VPC em clusters do Autopilot do GKE.
- Não é possível criar clusters de domínio aditivo de VPC em projetos de serviço de redes VPC compartilhadas.
- O Cloud DNS para GKE não está disponível para o Assured
Workload com um regime de compliance
IL4.
kube-dnsé forçado nesses ambientes regulamentados. - As alterações manuais nas zonas DNS particulares gerenciadas não são compatíveis e são substituídas pelo controlador do Cloud DNS. As modificações nos registros DNS nessas zonas não são mantidas quando o controlador é reiniciado.
- Depois de ativar o Cloud DNS para GKE em um cluster, o
kube-dnscontinua sendo executado no cluster. Para desativar okube-dns, escalone a implantação dokube-dnse o escalonador automático para zero. - Não é possível mudar o escopo do DNS em um cluster depois de defini-lo com a flag
--cluster-dns-scope. Se você precisar mudar o escopo do DNS, recrie o cluster com um escopo de DNS diferente. - As limitações dos recursos do Cloud DNS são aplicáveis. Em particular, no máximo uma zona de política de resposta pode ser vinculada a uma rede VPC por vez. Para escopos de VPC e VPC aditiva, a criação do cluster falha se já houver uma zona de política de resposta que não siga a convenção de nomenclatura vinculada à rede VPC do cluster.
- Os domínios de stub personalizados e as configurações do servidor DNS upstream se aplicam às configurações de DNS de pods e nós. Os pods que usam a rede de host ou processos executados diretamente no host também usam o domínio de stub e as configurações de servidor de nomes upstream. Esse comportamento é compatível apenas com o Standard.
- Os domínios de stub personalizados e os servidores de nomes upstream configurados pelo
kube-dnsConfigMap são aplicados automaticamente ao Cloud DNS para DNS de escopo do cluster. O DNS do escopo da VPC ignora o ConfigMapkube-dnse você precisa aplicar essas configurações diretamente no Cloud DNS. Esse comportamento é compatível apenas com o Standard. - Migrar de
kube-dnspara o escopo da VPC é uma operação disruptiva. Recrie o cluster ao alternar dekube-dnspara o escopo da VPC ou vice-versa. - Para o escopo da VPC, o intervalo de endereços IP secundário para serviços não pode ser compartilhado com nenhum outro cluster nessa sub-rede.
- No escopo da VPC, a política de resposta associada a um registro PTR é anexada à rede VPC. Se houver outras políticas de resposta vinculadas à rede do cluster, a resolução de registro do PTR para os endereços IP do serviço do Kubernetes vai falhar.
- Se você tentar criar um serviço headless com um número de pods que exceda a cota permitida, o Cloud DNS não criará conjuntos de registros ou registros para o serviço.
- Os nomes de serviço e porta são limitados a 62 caracteres, embora os rótulos de DNS tenham um limite máximo de 63 caracteres. Esse comportamento ocorre porque o GKE adiciona um prefixo de sublinhado aos registros DNS.
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ativar a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a CLI do Google Cloud para essa tarefa,
instale e inicialize a
gcloud CLI. Se você instalou a gcloud CLI anteriormente, instale a versão
mais recente executando o comando
gcloud components update. Talvez as versões anteriores da gcloud CLI não sejam compatíveis com a execução dos comandos neste documento.
Ative a API do Cloud DNS no projeto:
Para usar o Cloud DNS no escopo do cluster, você precisa de uma das seguintes versões:
- Para o Standard: GKE versões 1.24.7-gke.800 ou 1.25.3-gke.700, ou posterior.
- Para o Autopilot: GKE versões 1.25.9-gke.400 ou 1.26.4-gke.500, ou mais recentes.
- Google Cloud CLI versão 407.0.0 ou mais recente.
Para usar o Cloud DNS no escopo aditivo da VPC, você precisa de uma das seguintes versões:
- GKE versão 1.28.3-gke.1430000 ou mais recente.
- Google Cloud CLI versão 503.0.0 ou mais recente.
Ativar o DNS do escopo do cluster
No DNS do escopo do cluster, apenas os nós em execução no cluster do GKE podem resolver nomes de serviço, e os nomes de serviço não entram em conflito entre os clusters. Esse
comportamento é igual ao do kube-dns nos clusters do GKE. Isso significa
que é possível migrar os clusters do kube-dns para o escopo do cluster do Cloud DNS
sem inatividade ou alterações nos seus aplicativos.
O diagrama a seguir mostra como o Cloud DNS cria uma zona de DNS particular para um cluster do GKE. Somente processos e pods em execução nos nós do cluster podem resolver os registros DNS do cluster, porque apenas os nós estão no escopo do DNS.
Ativar o escopo do cluster em um novo cluster
Os novos clusters do Autopilot nas versões 1.25.9-gke.400, 1.26.4-gke.500 ou posterior têm como padrão o escopo de cluster do Cloud DNS. A seção a seguir mostra como ativar o escopo do cluster em um novo cluster Standard.
Criar um cluster padrão com o escopo do cluster ativado
É possível criar um cluster do GKE Standard com o escopo de cluster do Cloud DNS ativado usando a CLI gcloud ou o console Google Cloud :
gcloud
Crie um cluster usando a sinalização --cluster-dns:
gcloud container clusters create CLUSTER_NAME \
--cluster-dns=clouddns \
--cluster-dns-scope=cluster \
--location=COMPUTE_LOCATION
Substitua:
CLUSTER_NAME: o nome do cluster.COMPUTE_LOCATION: a região do Compute Engine para o cluster.
A sinalização --cluster-dns-scope=cluster é opcional no comando porque cluster é o valor padrão.
Console
No console do Google Cloud , acesse a página Criar um cluster do Kubernetes.
No painel de navegação, em Cluster, clique em Rede.
Na seção Provedor de DNS, clique em Cloud DNS.
Selecione Escopo do cluster.
Configure o cluster conforme necessário.
Clique em Criar.
Ativar o escopo do cluster em um cluster atual
Não é possível migrar um cluster do Autopilot de kube-dns para o escopo de cluster do Cloud DNS. Para ativar o escopo de cluster
do Cloud DNS, recrie os clusters do Autopilot nas versões
1.25.9-gke.400, 1.26.4-gke.500 ou mais recentes do GKE.
É possível migrar um cluster Standard atual de kube-dns para o escopo do cluster do Cloud DNS usando a CLI gcloud ou o consoleGoogle Cloud .
Ao migrar um cluster existente de kube-dns para o Cloud DNS, é necessário recriar os nós para que a mudança entre em vigor. Migre clusters que
estão executando aplicativos sem interromper a comunicação do cluster ativando
o Cloud DNS como um provedor de DNS em cada pool de nós separadamente. Um subconjunto dos nós está operacional o tempo todo porque alguns pools de nós usam kube-dns e outros usam o Cloud DNS.
gcloud
Atualize o cluster atual:
gcloud container clusters update CLUSTER_NAME \ --cluster-dns=clouddns \ --cluster-dns-scope=cluster \ --location=COMPUTE_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.COMPUTE_LOCATION: a região do Compute Engine para o cluster.
A sinalização
--cluster-dns-scope=clusteré opcional no comando porqueclusteré o valor padrão.O resultado parecido com este:
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)?Depois de confirmar, o controlador do Cloud DNS será executado no plano de controle do GKE. No entanto, seus pods não usam o Cloud DNS para resolução de DNS até que você faça upgrade do pool de nós ou adicione novos pools de nós ao cluster.
Faça upgrade dos pools de nós no cluster para usar o Cloud DNS:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=POOL_NAME \ --location=COMPUTE_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.POOL_NAME: o nome do pool de nós a ser atualizado.
Se o pool de nós e o plano de controle estiverem executando a mesma versão, primeiro atualize o plano de controle, conforme descrito em Como fazer upgrade manual do plano de controle. Em seguida, faça o upgrade do pool de nós.
Confirme a resposta e repita esse comando para cada pool de nós no cluster. Se o cluster tiver um pool de nós, omita a sinalização
--node-pool.
Console
Acesse a página do Google Kubernetes Engine no console do Google Cloud .
Clique no nome do cluster que você quer modificar.
Em Rede, no campo Provedor de DNS, clique em edit Editar provedor de DNS.
Clique em Cloud DNS.
Clique em Escopo do cluster.
Clique em Salvar alterações.
Ativar o escopo aditivo da VPC
Nesta seção, descrevemos as etapas para ativar ou desativar o escopo aditivo da VPC, como um complemento para o escopo do cluster do Cloud DNS.
Ativar o escopo aditivo da VPC em um novo cluster
É possível ativar o DNS do escopo aditivo da VPC em um novo cluster do GKE usando a CLI gcloud ou o console Google Cloud .
Criar um cluster do Autopilot com escopo aditivo da VPC
gcloud container clusters create-auto CLUSTER_NAME \
--additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN
Substitua:
CLUSTER_NAME: o nome do cluster.UNIQUE_CLUSTER_DOMAIN: o nome de um domínio. É preciso garantir que esse nome seja exclusivo na VPC porque o GKE não confirma esse valor. Não é possível mudar esse valor depois de defini-lo. Você não pode usar um domínio que termine em.localou pode ter falhas de resolução de DNS.
Criar um cluster Standard com escopo aditivo da VPC
gcloud container clusters create CLUSTER_NAME \
--cluster-dns=clouddns \
--cluster-dns-scope=cluster \
--additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN
A flag --cluster-dns-scope=cluster é opcional porque cluster é o valor padrão.
Substitua:
CLUSTER_NAME: o nome do cluster.UNIQUE_CLUSTER_DOMAIN: o nome de um domínio. É preciso garantir que esse nome seja exclusivo na VPC porque o GKE não confirma esse valor. Não é possível mudar esse valor depois de defini-lo. Você não pode usar um domínio que termine em.localou pode ter falhas de resolução de DNS.
Ativar o escopo aditivo da VPC em um cluster Standard
Não é possível ativar o escopo aditivo da VPC em um cluster do Autopilot já existente.
Para ativar o escopo aditivo da VPC em um cluster padrão, execute o seguinte comando:
gcloud container clusters update CLUSTER_NAME \
--additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN \
--location=COMPUTE_LOCATION
Substitua:
CLUSTER_NAME: o nome do cluster.UNIQUE_CLUSTER_DOMAIN: o nome de um domínio. É preciso garantir que esse nome seja exclusivo na VPC porque o GKE não confirma esse valor. Não é possível mudar esse valor depois de defini-lo. Você não pode usar um domínio que termine em.localou pode ter falhas de resolução de DNS.COMPUTE_LOCATION: a região do Compute Engine para o cluster.
Ativar DNS do escopo da VPC
No DNS de escopo da VPC, os nomes DNS de um cluster são resolvíveis em toda a VPC. Qualquer cliente na VPC pode resolver registros DNS de cluster.
O DNS de escopo da VPC ativa os seguintes casos de uso:
- Descoberta de serviço sem comando para clientes que não são do GKE na mesma VPC.
- Resolução de serviço do GKE a partir de clientes na nuvem locais ou de terceiros. Para mais informações, consulte Política do servidor de entrada.
- Resolução de serviço em que um cliente pode decidir com qual cluster quer se comunicar usando o domínio DNS de cluster personalizado.
No diagrama a seguir, dois clusters do GKE usam DNS de escopo da VPC na mesma VPC. Os dois clusters têm um domínio DNS personalizado, .cluster1 e .cluster2, em vez do domínio .cluster.local padrão. Uma VM se comunica com o serviço de back-end headless ao resolver backend.default.svc.cluster1. O Cloud DNS resolve o serviço headless para os endereços IP de pod individuais no serviço, e a VM se comunica diretamente com os endereços IP de pod.
Também é possível executar esse tipo de resolução de outras redes quando conectadas à VPC por meio do Cloud Interconnect ou do Cloud VPN. As políticas de servidor DNS permitem que os clientes das redes conectadas à VPC resolvam nomes no Cloud DNS, incluindo o GKE Services, se o cluster usar o DNS do escopo da VPC.
Ativar o escopo da VPC em um cluster atual
A migração para o escopo da VPC é compatível apenas com o Standard, e não com o Autopilot.
É possível migrar um cluster Standard atual de kube-dns para o escopo da VPC do Cloud DNS usando a CLI gcloud ou o console Google Cloud .
Ao migrar para o escopo da VPC, é necessário recriar os nós para que a mudança entre em vigor.
gcloud
Atualize o cluster atual:
gcloud container clusters update CLUSTER_NAME \ --cluster-dns=clouddns \ --cluster-dns-scope=vpc \ --cluster-dns-domain=CUSTOM_DOMAIN \ --location=COMPUTE_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.COMPUTE_LOCATION: a região do Compute Engine para o cluster.CUSTOM_DOMAIN: o nome de um domínio. É preciso garantir que esse nome seja exclusivo na VPC porque o GKE não confirma esse valor. Não é possível mudar esse valor depois de defini-lo. Você não pode usar um domínio que termine em.localou pode ter falhas de resolução de DNS.
O resultado parecido com este:
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)?Depois de confirmar, o controlador do Cloud DNS será executado no plano de controle do GKE. Os pods não usarão o Cloud DNS para resolução de DNS até que você faça upgrade do pool de nós ou adicione novos pools ao cluster.
Faça upgrade dos pools de nós no cluster para usar o Cloud DNS:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=POOL_NAMESubstitua:
CLUSTER_NAME: o nome do cluster.POOL_NAME: o nome do pool de nós a ser atualizado.
Se o pool de nós e o plano de controle estiverem executando a mesma versão, primeiro atualize o plano de controle, conforme descrito em Como fazer upgrade manual do plano de controle. Em seguida, faça o upgrade do pool de nós.
Confirme a resposta e repita esse comando para cada pool de nós no cluster. Se o cluster tiver um pool de nós, omita a sinalização
--node-pool.
Console
Acesse a página do Google Kubernetes Engine no console do Google Cloud .
Clique no nome do cluster que você quer modificar.
Em Rede, no campo Provedor de DNS, clique em edit Editar provedor de DNS.
Clique em Cloud DNS.
Clique em Escopo da VPC.
Clique em Salvar alterações.
Verificar o Cloud DNS
Verifique se o Cloud DNS para GKE está funcionando corretamente no cluster:
Verifique se os nós usam o Cloud DNS conectando-se a um pod em um nó e executando o comando
cat /etc/resolv.conf:kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserverSubstitua
POD_NAMEpelo nome do pod.Com base no modo de cluster, a saída é semelhante a esta:
Cluster do Autopilot do GKE
nameserver 169.254.20.10Como o NodeLocal DNSCache é ativado por padrão no GKE Autopilot, o pod usa o NodeLocal DNSCache.
Se o cache local não tiver uma entrada para o nome que está sendo pesquisado, o NodeLocal DNSCache encaminhará a solicitação para o Cloud DNS.
Cluster do GKE Standard
nameserver 169.254.169.254Este pod de exemplo usa
169.254.169.254comonameserver, que é o endereço IP do servidor de metadados em que o plano de dados do Cloud DNS detecta solicitações na porta53. Os nós não usam mais o endereço de serviço dokube-dnspara a resolução de DNS, e toda resolução de DNS ocorre no nó local.Se a saída for um endereço IP semelhante a
10.x.y.10, o pod usakube-dns. Para entender por que seu pod ainda usakube-dns, consulte a seção Solução de problemas .Se a saída for
169.254.20.10, você ativou o NodeLocal DNSCache no cluster, e o pod usa o NodeLocal DNSCache.Implante um aplicativo de amostra no cluster:
kubectl run dns-test --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0Exponha o aplicativo de amostra com um serviço:
kubectl expose pod dns-test --name dns-test-svc --port 8080Verifique se o serviço foi implantado com sucesso:
kubectl get svc dns-test-svcO resultado será o seguinte:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dns-test-svc ClusterIP 10.47.255.11 <none> 8080/TCP 6m10sO valor da coluna
CLUSTER-IPé o endereço IP virtual do cluster. Neste exemplo, o endereço IP virtual é10.47.255.11.Verifique se o nome do Serviço foi criado como um registro na zona de DNS particular do seu cluster:
gcloud dns record-sets list \ --zone=PRIVATE_DNS_ZONE \ --name=dns-test-svc.default.svc.DOMAIN_NAME.Substitua:
PRIVATE_DNS_ZONE: o nome da zona DNS gerenciada criada pelo GKE. É possível encontrar os nomes das zonas na página de zonas do Cloud DNS no console do Google Cloud ou consultando a convenção de nomenclatura.DOMAIN_NAME:cluster.localse você usar o escopo do cluster sem o escopo aditivo da VPC ou o domínio personalizado que você configurou ao ativar o escopo da VPC ou o escopo aditivo da VPC.
O resultado será o seguinte:
NAME: dns-test-svc.default.svc.cluster.local. TYPE: A TTL: 30 DATA: 10.47.255.11
Desativar o Cloud DNS em clusters Standard
Não é possível desativar o Cloud DNS em clusters do Autopilot criados com o Cloud DNS ativado por padrão.
Não é possível desativar o escopo da VPC no Standard. Recrie o cluster com kube-dns como o provedor de DNS.
É possível desativar o escopo do cluster e reverter para kube-dns em um
cluster do Standard usando a CLI gcloud ou o
console doGoogle Cloud .
gcloud
Atualize o cluster para usar kube-dns:
gcloud container clusters update CLUSTER_NAME \
--cluster-dns=kube-dns \
--location=COMPUTE_LOCATION
Substitua:
CLUSTER_NAME: o nome do cluster.COMPUTE_LOCATION: a região do Compute Engine para o cluster.
Console
Acesse a página do Google Kubernetes Engine no console do Google Cloud .
Clique no nome do cluster que você quer modificar.
Em Rede, no campo Provedor de DNS, clique em edit Editar provedor de DNS.
Clique em Kube-dns.
Clique em Salvar alterações.
Depois de desativar o Cloud DNS, é necessário recriar os pools de nós para que os nós
possam usar kube-dns para resolução. Se você já escalonou kube-dns para zero nós, é necessário escalonar kube-dns antes que os nós possam usá-lo para resolução de DNS. Se você não recriar os pools de nós, os pods nos nós atuais vão continuar usando o Cloud DNS para resolução de DNS porque o arquivo /etc/resolv.conf não será atualizado até que o nó seja recriado.
Desativar o escopo aditivo da VPC
Quando você desativa o escopo aditivo da VPC para o cluster, apenas os registros DNS nas zonas particulares anexadas à rede VPC são excluídos. Os registros nas zonas de DNS particulares do cluster do GKE vão permanecer e serão gerenciados pelo Cloud DNS para GKE até que o serviço headless seja excluído do cluster.
Para desativar o escopo aditivo da VPC, execute o seguinte comando:
gcloud container clusters update CLUSTER_NAME \
--disable-additive-vpc-scope
Substitua CLUSTER_NAME pelo nome do cluster.
Essa configuração mantém o cluster com o escopo do cluster do Cloud DNS ativado, o que fornece resolução de DNS pelo cluster.
Limpar
Depois de concluir os exercícios neste documento, siga estas etapas para remover os recursos e evitar cobranças indesejadas na conta:
Exclua o serviço:
kubectl delete service dns-test-svcExclua o pod:
kubectl delete Pod dns-testTambém é possível excluir o cluster.
Solução de problemas
Para informações sobre como solucionar problemas do Cloud DNS, consulte as seguintes páginas:
- Para receber orientações sobre o Cloud DNS no GKE, consulte Solucionar problemas do Cloud DNS no GKE.
- Para conselhos específicos sobre o Cloud DNS, consulte Solução de problemas do Cloud DNS.
- Para orientações gerais sobre como diagnosticar problemas de DNS do Kubernetes, consulte Como depurar a resolução de DNS.
A seguir
- Leia uma visão geral de como o GKE fornece DNS gerenciado.
- Leia DNS para serviços e pods para uma visão geral de como o DNS é usado nos clusters do Kubernetes.
- Saiba mais sobre escopos e hierarquias no Cloud DNS.
- Saiba como ativar e desativar a geração de registros para zonas gerenciadas particulares.