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ê recebeu um desses erros, mas não sabe a causa, use as seções a seguir para encontrar a solução. As seções são organizadas para começar com as etapas que têm mais chances de ajudar você. Portanto, tente cada seção em 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 você a verificar se está usando o Cloud DNS, confirmar a existência de uma zona DNS particular para o cluster do GKE e garantir a precisão dos registros DNS para o serviço de destino.
Para verificar essas configurações, execute os seguintes comandos:
Verifique qual servidor DNS seu 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á esta:
nameserver 169.254.169.254
Se você vir outro valor, não está 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.
Nessa saída, o valor no campo
name
mostra que Google Cloud criou uma zona chamadagke-CLUSTER_NAME-aa94c1f9-dns
.Se você não encontrar uma zona gerenciada, isso significa que uma zona particular não foi criada para seu cluster ou que você não está autenticado 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 estiverem incorretos, consulte Adicionar um conjunto de registros de recursos na documentação do Cloud DNS para atualizá-los.
Verificar políticas de resposta
Verifique se as políticas de resposta existem e estão nomeadas corretamente:
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".
Nessa saída,
gke-CLUSTER_NAME-52c8f518-rp
mostra que Google Cloud criou uma zona particular chamadagke-CLUSTER_NAME-aa94c1f9-rp
. As políticas de resposta criadas pelo Google Cloud têm o prefixogke-
.Ver 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 você a investigar ainda mais os problemas de DNS:
Para ver registros de recursos como zonas e registros, ative o Cloud Logging para Cloud DNS.
Para ver 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 suas consultas de DNS, use as métricas
query/latencies
equery/response_count
no Metrics Explorer.
Verificar novos registros
Analise os registros para ver se novos registros foram criados na zona privada gerenciada do Cloud DNS. Isso pode ser útil se você tiver resoluções de DNS com falha repentina no cluster.
Para verificar novos registros, siga estas etapas:
No console Google Cloud , acesse a página Explorador 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 correspondam ao momento em que notou os erros pela primeira vez, considere revertê-las.
Verificar domínios de stub personalizados e servidores de nomes
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ê seguiu as seções anteriores, mas ainda não consegue diagnosticar a causa do problema, entre em contato com o Cloud Customer Care.
Resolver erros específicos
Se você tiver um erro ou problema específico, siga as orientações nas seções a seguir.
Problema: não é possível resolver o serviço do 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 não é necessário resolver recursos externos fora do cluster do Kubernetes ou da nuvem privada virtual (VPC) do GKE.
Escopo de 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 na mesma VPC, como VMs Google Cloud .
Para verificar o escopo do Cloud DNS do cluster, siga estas etapas:
No console Google Cloud , acesse a página Clusters do Kubernetes.
Clique no nome do cluster 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ê vir Cloud DNS (escopo do cluster), significa que você está usando o escopo do cluster. Para mudar o escopo do DNS, recrie o cluster com o escopo adequado.
Problema: os pods ainda usam o kube-dns após a ativação do Cloud DNS
Se os pods usarem o kube-dns mesmo depois que o Cloud DNS for ativado 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 continuam 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 posterior 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 posterior do GKE para clusters que usam o escopo do cluster.
Problema: as buscas 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 o GKE versão 1.28 ou mais recente.
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 de 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 do Google Cloud .
Erro: falha ao enviar 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: não foi possível 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 em 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.
Revise a solução de problemas do Cloud DNS.
Se você não encontrar uma solução para seu problema na documentação, consulte Receber suporte para mais ajuda, incluindo conselhos sobre os seguintes tópicos:
- Abrir um caso de suporte entrando em contato com o Cloud Customer Care.
- Receber suporte da comunidade fazendo perguntas no StackOverflow e usando a tag
google-kubernetes-engine
para pesquisar problemas semelhantes. Você também pode participar do canal do Slack#kubernetes-engine
para receber mais suporte da comunidade. - Abrir bugs ou solicitações de recursos usando o Issue Tracker público.