Usar o Cloud DNS para o GKE

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:

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-dns continua sendo executado no cluster. Para desativar o kube-dns, escalone a implantação do kube-dns e 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-dns ConfigMap são aplicados automaticamente ao Cloud DNS para DNS de escopo do cluster. O DNS do escopo da VPC ignora o ConfigMap kube-dns e você precisa aplicar essas configurações diretamente no Cloud DNS. Esse comportamento é compatível apenas com o Standard.
  • Migrar de kube-dns para o escopo da VPC é uma operação disruptiva. Recrie o cluster ao alternar de kube-dns para 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:

    Ativar a API Cloud DNS.

  • 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.

Pods em nós diferentes que resolvem Serviços no cluster do GKE.
Diagrama: DNS do escopo do cluster

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:

A sinalização --cluster-dns-scope=cluster é opcional no comando porque cluster é o valor padrão.

Console

  1. No console do Google Cloud , acesse a página Criar um cluster do Kubernetes.

    Acessar "Criar um cluster do Kubernetes"

  2. No painel de navegação, em Cluster, clique em Rede.

  3. Na seção Provedor de DNS, clique em Cloud DNS.

  4. Selecione Escopo do cluster.

  5. Configure o cluster conforme necessário.

  6. 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

  1. Atualize o cluster atual:

    gcloud container clusters update CLUSTER_NAME \
        --cluster-dns=clouddns \
        --cluster-dns-scope=cluster \
        --location=COMPUTE_LOCATION
    

    Substitua:

    A sinalização --cluster-dns-scope=cluster é opcional no comando porque cluster é 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.

  2. 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_LOCATION
    

    Substitua:

    • 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

  1. Acesse a página do Google Kubernetes Engine no console do Google Cloud .

    Acessar o Google Kubernetes Engine

  2. Clique no nome do cluster que você quer modificar.

  3. Em Rede, no campo Provedor de DNS, clique em Editar provedor de DNS.

  4. Clique em Cloud DNS.

  5. Clique em Escopo do cluster.

  6. 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 .local ou 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 .local ou pode ter falhas de resolução de DNS.
No console do

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 .local ou 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.

Clientes que resolvem Serviços headless de fora do cluster do GKE.
Diagrama: DNS do escopo da VPC

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

  1. Atualize o cluster atual:

    gcloud container clusters update CLUSTER_NAME \
        --cluster-dns=clouddns \
        --cluster-dns-scope=vpc \
        --cluster-dns-domain=CUSTOM_DOMAIN \
        --location=COMPUTE_LOCATION
    

    Substitua:

    • 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 .local ou 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.

  2. 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
    

    Substitua:

    • 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

  1. Acesse a página do Google Kubernetes Engine no console do Google Cloud .

    Acessar o Google Kubernetes Engine

  2. Clique no nome do cluster que você quer modificar.

  3. Em Rede, no campo Provedor de DNS, clique em Editar provedor de DNS.

  4. Clique em Cloud DNS.

  5. Clique em Escopo da VPC.

  6. Clique em Salvar alterações.

Verificar o Cloud DNS

Verifique se o Cloud DNS para GKE está funcionando corretamente no cluster:

  1. 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 nameserver
    

    Substitua POD_NAME pelo nome do pod.

    Com base no modo de cluster, a saída é semelhante a esta:

    Cluster do Autopilot do GKE

    nameserver 169.254.20.10
    

    Como 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.254
    

    Este pod de exemplo usa 169.254.169.254 como nameserver, que é o endereço IP do servidor de metadados em que o plano de dados do Cloud DNS detecta solicitações na porta 53. Os nós não usam mais o endereço de serviço do kube-dns para 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 usa kube-dns. Para entender por que seu pod ainda usa kube-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.

  2. Implante um aplicativo de amostra no cluster:

    kubectl run dns-test --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
    
  3. Exponha o aplicativo de amostra com um serviço:

    kubectl expose pod dns-test --name dns-test-svc --port 8080
    
  4. Verifique se o serviço foi implantado com sucesso:

    kubectl get svc dns-test-svc
    

    O resultado será o seguinte:

    NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    dns-test-svc   ClusterIP   10.47.255.11    <none>        8080/TCP   6m10s
    

    O valor da coluna CLUSTER-IP é o endereço IP virtual do cluster. Neste exemplo, o endereço IP virtual é 10.47.255.11.

  5. 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.local se 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:

Console

  1. Acesse a página do Google Kubernetes Engine no console do Google Cloud .

    Acessar o Google Kubernetes Engine

  2. Clique no nome do cluster que você quer modificar.

  3. Em Rede, no campo Provedor de DNS, clique em Editar provedor de DNS.

  4. Clique em Kube-dns.

  5. 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:

  1. Exclua o serviço:

    kubectl delete service dns-test-svc
    
  2. Exclua o pod:

    kubectl delete Pod dns-test
    
  3. També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:

A seguir