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:
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.
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 chamadagke-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.
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:
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 chamadagke-CLUSTER_NAME-aa94c1f9-rp
. As políticas de resposta que o Google Cloud cria têm o prefixogke-
.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:
Para conferir os registros de recursos como zonas e registros, ative o Cloud Logging para o Cloud DNS.
Para conferir gráficos de consultas DNS e dados de taxa de erros, QPS e latência do 99º percentil das suas zonas particulares, use o painel de monitoramento do Cloud DNS.
Para visualizar a latência e as taxas de sucesso das consultas DNS, use as métricas
query/latencies
equery/response_count
no Metrics Explorer.
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:
No console do Google Cloud , acesse a página Análise de registros.
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"
Clique em Executar consulta.
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:
No console do Google Cloud , acesse a página Clusters do Kubernetes.
Clique no nome do cluster que está com problemas de DNS.
Na seção Rede do cluster da página de detalhes do cluster, revise as informações na linha Provedor de DNS.
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:
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, comohttps://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" } ]
Receba uma lista de projetos com a permissão
dns.networks.bindDNSResponsePolicy
usando o IAM Policy Analyzer.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
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
Veja informações gerais sobre como diagnosticar problemas de DNS do Kubernetes em Como depurar a resolução de DNS.
Consulte Solução de problemas do Cloud DNS.
- Se precisar de mais ajuda, entre em contato com o Cloud Customer Care.