Resolver problemas do Cloud DNS no GKE


Nesta página, mostramos como resolver problemas com o Cloud DNS no Google Kubernetes Engine (GKE).

Identificar a origem dos problemas de DNS no Cloud DNS

Erros como dial tcp: i/o timeout, no such host ou Could not resolve host geralmente indicam problemas com a capacidade do Cloud DNS de resolver consultas.

Se você já encontrou um desses erros, mas não sabe a causa, use as seções a seguir para ajudar a encontrá-lo. As seções são organizadas para começar com as etapas que provavelmente vão ajudar você. Portanto, tente cada seção na ordem.

Verificar as configurações básicas

Se o pod não conseguir resolver pesquisas DNS, verifique se o Cloud DNS está configurado da maneira que você quer. Esta seção ajuda a verificar se você está usando o Cloud DNS, confirmar a existência de uma zona de DNS particular para o cluster do GKE e garantir a precisão dos registros de DNS para o serviço de destino.

Para verificar essas configurações, execute os seguintes comandos:

  1. Verifique qual servidor DNS o pod está usando:

    kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
    

    Substitua POD_NAME pelo nome do pod com problemas de resolução de DNS.

    Se você estiver usando o Cloud DNS, a saída será a seguinte:

    nameserver 169.254.169.254
    

    Se você encontrar qualquer outro valor, não estará usando o Cloud DNS. Verifique se o Cloud DNS foi ativado corretamente.

  2. Verifique se as zonas gerenciadas existem:

    gcloud dns managed-zones list --format list
    

    O resultado será assim:

    - creationTime: 2021-02-12T19:24:37.045Z
      description: Private zone for GKE cluster "" with cluster suffix "CLUSTER_DOMAIN" in project "PROJECT_ID"
      dnsName: CLUSTER_DOMAIN.
      id: 5887499284756055830
      kind: dns#managedZone
      name: gke-CLUSTER_NAME-aa94c1f9-dns
      nameServers: ['ns-gcp-private.googledomains.com.']
      privateVisibilityConfig: {'kind': 'dns#managedZonePrivateVisibilityConfig'}
      visibility: private
    

    Esta saída inclui os seguintes valores:

    • CLUSTER_DOMAIN: o sufixo de domínio DNS que foi atribuído automaticamente ao cluster.
    • PROJECT_ID: o ID do projeto.
    • CLUSTER_NAME: o nome do cluster com a zona particular.

    Nesta saída, o valor no campo name mostra que oGoogle Cloud criou uma zona chamada gke-CLUSTER_NAME-aa94c1f9-dns.

    Se você não encontrar uma zona gerenciada, significa que uma zona particular não foi criada para o cluster ou que você não fez a autenticação corretamente. Para resolver problemas, consulte Zonas particulares na documentação do Cloud DNS.

  3. Verifique os registros DNS do seu serviço:

    gcloud dns record-sets list --zone ZONE_NAME | grep SERVICE_NAME
    

    Substitua:

    • ZONE_NAME: o nome da zona particular.
    • SERVICE_NAME: o nome do serviço.

    A saída é semelhante a esta:

    dns-test.default.svc.cluster.local.                A     30     10.47.255.11
    

    Essa saída mostra que o Cloud DNS contém um registro A para o domínio dns-test.default.svc.cluster.local. e o endereço IP do cluster é 10.47.255.11.

    Se os registros parecerem incorretos, consulte Correção de um conjunto de registros de recurso na documentação do Cloud DNS para atualizá-los.

Verificar as políticas de resposta

Verifique se as políticas de resposta existem e têm o nome correto:

  1. Confira uma lista de todas as suas políticas de resposta:

    gcloud dns response-policies list --format="table(responsePolicyName, description)"
    

    O resultado será assim:

    RESPONSE_POLICY_NAME          DESCRIPTION
    gke-CLUSTER_NAME-52c8f518-rp  Response Policy for GKE cluster "CLUSTER_NAME" with cluster suffix "cluster.local." in project "gke-dev" with scope "CLUSTER_SCOPE".
    

    Nesta saída, gke-CLUSTER_NAME-52c8f518-rp mostra que o Google Cloud criou uma zona particular chamada gke-CLUSTER_NAME-aa94c1f9-rp. As políticas de resposta que o Google Cloud cria têm o prefixo gke-.

  2. Acesse as políticas de resposta em uma zona particular específica:

    gcloud dns response-policies rules list ZONE_NAME \
        --format="table(localData.localDatas[0].name, localData.localDatas[0].rrdatas[0])"
    

    Substitua ZONE_NAME pelo nome da zona particular com problemas.

    O resultado será assim:

    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.
    

    A primeira coluna mostra o endereço IP ou o padrão de nome de domínio que a regra corresponde. A segunda coluna é o nome do host associado ao endereço IP.

Se você notar algum problema na saída desses comandos, consulte Atualizar uma regra de política de resposta na documentação do Cloud DNS.

Investigar com registros, painéis e métricas

O Cloud DNS inclui várias opções de geração de registros e monitoramento para ajudar a investigar melhor os problemas de DNS:

Verificar se há novos registros

Revise os registros para saber se algum registro novo foi criado na zona particular gerenciada do Cloud DNS. Isso pode ser útil se você tiver problemas repentinos com resoluções de DNS no cluster.

Para verificar se há novos registros, siga estas etapas:

  1. No console do Google Cloud , acesse a página Análise de registros.

    Acessar o Explorador de registros

  2. No painel de consulta, digite a seguinte consulta:

    resource.type="dns_managed_zone"
    protoPayload.request.change.additions.name="headless-svc-stateful.default.svc.cluster.local."
    protoPayload.methodName="dns.changes.create"
    
  3. Clique em Executar consulta.

  4. Verifique a saída. Se você encontrar mudanças que correspondem ao momento em que percebeu os erros, considere revertê-las.

Verificar domínios de stub e servidores de nomes personalizados

Se você estiver usando um cluster do GKE Standard com um domínio stub personalizado ou um servidor de nomes upstream, revise o ConfigMap e verifique se os valores estão corretos.

O Cloud DNS converte os valores stubDomains e upstreamNameservers em zonas de encaminhamento do Cloud DNS. O Google gerencia esses recursos. Portanto, se você notar algum erro, entre em contato com o atendimento ao cliente do Cloud para receber ajuda.

Entrar em contato com o atendimento ao cliente do Cloud

Se você já trabalhou nas seções anteriores, mas ainda não conseguiu diagnosticar a causa do problema, entre em contato com o atendimento ao cliente do Cloud.

Resolver erros específicos

Se você tiver um erro ou problema específico, use os conselhos nas seções a seguir.

Problema: não é possível resolver o serviço de cluster do GKE em uma VM do Compute Engine

Se você não conseguir resolver um serviço de cluster do GKE em uma VM do Compute Engine, verifique o escopo do Cloud DNS do cluster.

O escopo usado com o Cloud DNS determina quais recursos podem ser resolvidos:

  • Escopo do cluster: a resolução de DNS é restrita a recursos dentro do cluster do Kubernetes (pods e serviços). Essa é a configuração padrão e é adequada quando você não precisa resolver recursos externos fora do cluster do Kubernetes ou da nuvem privada virtual (VPC) do GKE.

  • Escopo da VPC: a resolução de DNS se estende a toda a VPC, incluindo recursos como VMs do Compute Engine. Isso permite que o cluster resolva registros DNS internos para recursos fora do cluster do GKE, mas dentro da mesma VPC, como Google Cloud VMs.

Para verificar o escopo do Cloud DNS do cluster, siga estas etapas:

  1. No console do Google Cloud , acesse a página Clusters do Kubernetes.

    Acessar clusters do Kubernetes

  2. Clique no nome do cluster que está com problemas de DNS.

  3. Na seção Rede do cluster da página de detalhes do cluster, revise as informações na linha Provedor de DNS.

  4. Se você encontrar Cloud DNS (escopo do cluster), significa que está usando o escopo do cluster. Para mudar o escopo do DNS, recrie o cluster com o escopo do DNS apropriado.

Problema: os pods ainda usam o kube-dns depois que o Cloud DNS é ativado

Se os pods usarem o kube-dns mesmo após a ativação do Cloud DNS em um cluster atual, verifique se você fez upgrade ou recriou os pools de nós depois de ativar o Cloud DNS no cluster. Até que esta etapa seja concluída, os pods vão continuar usando o kube-dns.

Problema: não foi possível atualizar o cluster atual ou criar um com o Cloud DNS ativado

Verifique se você está usando a versão correta. O Cloud DNS para GKE requer a versão 1.19 ou mais recente do GKE para clusters que usam o escopo da VPC ou a versão 1.24.7-gke.800, 1.25.3-gke.700 ou mais recente do GKE para clusters que usam o escopo do cluster.

Problema: as pesquisas DNS nos nós falham após a ativação do Cloud DNS em um cluster

Se você ativar o Cloud DNS no escopo de um cluster do GKE que tem domínios de stub personalizados ou servidores de nomes upstream, a configuração personalizada será aplicada a nós e pods no cluster porque o Cloud DNS não conseguirá distinguir entre solicitações de DNS de pods e nós. As buscas DNS nos nós podem falhar se o servidor upstream personalizado não resolver as consultas.

Problema: não é possível atualizar ou criar um cluster com o escopo aditivo da VPC do Cloud DNS ativado

Verifique se você está usando a versão correta. O escopo aditivo da VPC do Cloud DNS requer a versão 1.28 ou mais recente do GKE.

Erro: Cloud DNS desativado

O evento a seguir ocorre quando a API Cloud DNS está desativada:

Warning   FailedPrecondition        service/default-http-backend
Failed to send requests to Cloud DNS: Cloud DNS API Disabled. Please enable the Cloud DNS API in your project PROJECT_NAME: Cloud DNS API has not been used in project PROJECT_NUMBER before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dns.googleapis.com/overview?project=PROJECT_NUMBER then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

Esse erro ocorre porque a API Cloud DNS não está ativada por padrão. Ative a API Cloud DNS manualmente.

Para resolver o problema, ative a API Cloud DNS.

Erro: falha ao enviar solicitações para o Cloud DNS: limite de taxa da API excedido.

O evento a seguir ocorre quando um projeto excede uma cota ou limite do Cloud DNS:

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.

Para resolver esse problema, consulte as cotas do Cloud DNS e as cotas e limites do Compute Engine. É possível aumentar a cota usando o console Google Cloud .

Erro: falha ao enviar para solicitações para o Cloud DNS devido a um erro anterior

O evento a seguir ocorre quando os erros causam falhas em cascata:

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.
kube-system   27s         Warning   FailedPrecondition               service/default-http-backend                         Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

Para resolver esse problema, verifique os eventos do cluster para encontrar a origem do erro original e siga as instruções para resolver esse problema raiz.

No exemplo anterior, o erro InsufficientQuota da zona gerenciada acionou falhas em cascata. O segundo erro para FailedPrecondition indica que ocorreu um erro anterior, que era o problema inicial de cota insuficiente. Para resolver esse problema de exemplo, siga as orientações relacionadas ao erro de cota do Cloud DNS.

Erro: falha ao vincular a política de resposta

O evento a seguir ocorre quando uma política de resposta está vinculada à rede do cluster e o Cloud DNS para GKE tenta vincular uma política de resposta à rede:

kube-system   9s          Warning   FailedPrecondition               responsepolicy/gke-2949673445-rp
Failed to bind response policy gke-2949673445-rp to test. Please verify that another Response Policy is not already associated with the network: Network 'https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/NETWORK_NAME' cannot be bound to this response policy because it is already bound to another response policy.
kube-system   9s          Warning   FailedPrecondition               service/kube-dns
Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

Para resolver o problema, siga estas etapas:

  1. Receba a política de resposta vinculada à rede:

    gcloud dns response-policies list --filter='networks.networkUrl: NETWORK_URL'
    

    Substitua NETWORK_URL pelo URL da rede do erro, como https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME.

    Se a saída estiver vazia, a política de resposta pode não estar no mesmo projeto. Vá para a próxima etapa para pesquisar a política de resposta.

    Se a saída for semelhante a esta, pule para a etapa 4 para excluir a política de resposta.

    [
       {
          "description": "Response Policy for GKE cluster \"CLUSTER_NAME\" with cluster suffix \"cluster.local.\" in project \"PROJECT_ID\" with scope \"CLUSTER_SCOPE\".",
          ...
          "kind": "dns#responsePolicy",
          "responsePolicyName": "gke-CLUSTER_NAME-POLICY_ID-rp"
       }
    ]
    
  2. Receba uma lista de projetos com a permissão dns.networks.bindDNSResponsePolicy usando o IAM Policy Analyzer.

  3. Verifique se cada projeto tem a política de resposta vinculada à rede:

    gcloud dns response-policies list --filter='networks.networkUrl:NETWORK_URL' \
        --project=PROJECT_NAME
    
  4. Exclua a política de resposta.

Erro: configuração inválida especificada no kube-dns

O evento a seguir ocorre quando você aplica um kube-dns ConfigMap inválido para o Cloud DNS para o GKE:

kube-system   49s         Warning   FailedValidation                 configmap/kube-dns
Invalid configuration specified in kube-dns: error parsing stubDomains for ConfigMap kube-dns: dnsServer [8.8.8.256] validation: IP address "8.8.8.256" invalid

Para resolver esse problema, revise os detalhes no erro sobre a parte inválida do ConfigMap. No exemplo anterior, 8.8.8.256 não é um endereço IP válido.

A seguir