Solucionar problemas de falhas de resolução DNS de dentro do pod, mas não do nó de trabalho
Este artigo discute como solucionar problemas de falhas de resolução do DNS (Sistema de Nomes de Domínio) que ocorrem de dentro do pod, mas não do nó de trabalho, quando você tenta estabelecer uma conexão de saída de um cluster do MICROSOFT Serviço de Kubernetes do Azure (AKS).
Pré-requisitos
A ferramenta kubernetes kubectl ou uma ferramenta semelhante para se conectar ao cluster. Para instalar o kubectl usando a CLI do Azure, execute o comando az aks install-cli .
A ferramenta de linha de comando apt-get para lidar com pacotes.
A ferramenta de linha de comando do host para pesquisas DNS.
A ferramenta de linha de comando systemctl .
Histórico
Para resolução DNS, os pods enviam solicitações para os pods CoreDNS no kube-system
namespace.
Se a consulta DNS for para um componente interno, como um nome de serviço, o pod CoreDNS responderá sozinho. No entanto, se a solicitação for para um domínio externo, o pod CoreDNS enviará a solicitação para o servidor DNS upstream.
Os servidores DNS upstream são obtidos com base no arquivo resolv.conf do nó de trabalho no qual o pod está em execução. O arquivo resolv.conf (/run/systemd/resolve/resolv.conf) é atualizado com base nas configurações DNS da rede virtual na qual o nó de trabalho está em execução.
Lista de verificação de solução de problemas
Para solucionar problemas de DNS de dentro do pod, use as instruções nas seções a seguir.
Etapa 1: solucionar problemas de DNS de dentro do pod
Você pode usar comandos kubectl para solucionar problemas de DNS de dentro do pod, conforme mostrado nas seguintes etapas:
Verifique se os pods CoreDNS estão em execução:
kubectl get pods -l k8s-app=kube-dns -n kube-system
Verifique se os pods CoreDNS estão em excesso:
$ kubectl top pods -n kube-system -l k8s-app=kube-dns NAME CPU(cores) MEMORY(bytes) coredns-dc97c5f55-424f7 3m 23Mi coredns-dc97c5f55-wbh4q 3m 25Mi
Verifique se os nós que hospedam os pods CoreDNS não estão em excesso. Além disso, obtenha os nós que estão hospedando os pods CoreDNS:
kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].spec.nodeName}'
Verifique o uso desses nós:
kubectl top nodes
Verifique os logs para os pods CoreDNS:
kubectl logs -l k8s-app=kube-dns -n kube-system
Observação
Para ver mais informações de depuração, habilite logs verbosos no CoreDNS. Para habilitar o log verboso no CoreDNS, confira Solução de problemas de personalizações CoreDNS no AKS.
Etapa 2: criar um pod de teste para executar comandos
Se a resolução DNS estiver falhando, siga estas etapas:
Execute um pod de teste no mesmo namespace que o pod problemático.
Inicie um pod de teste no cluster:
kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
Quando o pod de teste estiver em execução, você terá acesso ao pod.
Execute os seguintes comandos para instalar os pacotes necessários:
apt-get update -y apt-get install dnsutils -y
Verifique se o arquivo resolv.conf tem as entradas corretas:
cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local 00idcnmrrm4edot5s2or1onxsc.bx.internal.cloudapp.net nameserver 10.0.0.10 options ndots:5
Use o
host
comando para determinar se as solicitações DNS estão sendo roteada para o servidor upstream:$ host -a microsoft.com Trying "microsoft.com.default.svc.cluster.local" Trying "microsoft.com.svc.cluster.local" Trying "microsoft.com.cluster.local" Trying "microsoft.com.00idcnmrrm4edot5s2or1onxsc.bx.internal.cloudapp.net" Trying "microsoft.com" Trying "microsoft.com" ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62884 ;; flags: qr rd ra; QUERY: 1, ANSWER: 27, AUTHORITY: 0, ADDITIONAL: 5 ;; QUESTION SECTION: ;microsoft.com. IN ANY ;; ANSWER SECTION: microsoft.com. 30 IN NS ns1-39.azure-dns.com. ... ... ns4-39.azure-dns.info. 30 IN A 13.107.206.39 Received 2121 bytes from 10.0.0.10#53 in 232 ms
Verifique o servidor DNS upstream do pod para determinar se a resolução DNS está funcionando corretamente. Por exemplo, para o DNS do Azure, execute o seguinte comando nslookup :
$ nslookup microsoft.com 168.63.129.16 Server: 168.63.129.16 Address: 168.63.129.16#53 ... ... Address: 20.81.111.85
Etapa 3: verificar se as solicitações DNS funcionam quando o servidor DNS upstream for especificado explicitamente
Se as solicitações DNS dos pods estiverem funcionando quando você especificar o servidor DNS upstream explicitamente, verifique as seguintes condições:
Verifique se há um ConfigMap personalizado para CoreDNS:
kubectl describe cm coredns-custom -n kube-system
Se um ConfigMap personalizado estiver presente, verifique se a configuração está correta. Para obter mais informações, consulte Personalizar o CoreDNS com Serviço de Kubernetes do Azure.
Verifique se uma política de rede está bloqueando o tráfego na porta UDP (Protocolo de Datagrama do Usuário) 53 para os pods CoreDNS no
kube-system
namespace.Verifique se os pods CoreDNS estão em um pool de nós diferente (pool de nós do sistema). Se estiverem, marcar se um NSG (grupo de segurança de rede) está associado ao pool de nós do Sistema que está bloqueando o tráfego na porta UDP 53.
Verifique se a rede virtual foi atualizada recentemente para adicionar os novos servidores DNS.
Se ocorreu uma atualização de rede virtual, marcar se um dos seguintes eventos também ocorreu:
- Os nós foram reiniciados.
- O serviço de rede no nó foi reiniciado.
Para que a atualização nas configurações DNS entre em vigor, o serviço de rede no nó e os pods CoreDNS devem ser reiniciados. Para reiniciar o serviço de rede ou os pods, use um dos seguintes métodos:
Reinicie o nó.
Dimensione novos nós. (Novos nós terão a configuração atualizada.)
Reinicie o serviço de rede nos nós e reinicie os pods CoreDNS. Siga estas etapas:
Faça uma conexão SSH (Secure Shell) com os nós. Para obter mais informações, consulte Conectar-se aos nós de cluster do AKS (Serviço de Kubernetes do Azure) para manutenção ou solução de problemas.
De dentro do nó, reinicie o serviço de rede:
systemctl restart systemd-networkd
Verifique se as configurações estão atualizadas:
cat /run/systemd/resolve/resolv.conf
Depois que o serviço de rede for reiniciado, use kubectl para reiniciar os pods CoreDNS:
kubectl delete pods -l k8s-app=kube-dns -n kube-system
Verifique se mais de um servidor DNS está especificado nas configurações de DNS de rede virtual.
Se vários servidores DNS forem especificados na rede virtual do AKS, uma das seguintes sequências ocorrerá:
O nó AKS envia uma solicitação para o servidor DNS upstream como parte de uma série. Nesta sequência, a solicitação é enviada para o primeiro servidor DNS configurado na rede virtual (se os servidores DNS estiverem acessíveis e em execução). Se o primeiro servidor DNS não estiver acessível e não estiver respondendo, a solicitação será enviada para o próximo servidor DNS.
Os nós do AKS usam o comando resolver para enviar solicitações aos servidores DNS. O arquivo de configuração desse resolvedor pode ser encontrado em /run/systemd/resolve/resolv.conf nos nós do AKS.
Há vários servidores? Nesse caso, a biblioteca de resolvedores as consulta na ordem listada. (A estratégia usada é tentar um servidor de nome primeiro. Se a consulta acabar, experimente o servidor de próximo nome e continue até que a lista de servidores de nome esteja esgotada. Em seguida, a consulta continua tentando se conectar aos servidores de nome até que o número máximo de tentativas seja feito.)
O CoreDNS usa o plug-in de encaminhamento para enviar solicitações para upstream servidores DNS. Esse plug-in usa um algoritmo aleatório para selecionar o servidor DNS upstream. Nesta sequência, a solicitação pode ir para qualquer um dos servidores DNS mencionados na rede virtual. Por exemplo, você pode receber a seguinte saída:
$ kubectl describe cm coredns -n kube-system Name: coredns Namespace: kube-system Labels: addonmanager.kubernetes.io/mode=Reconcile k8s-app=kube-dns kubernetes.io/cluster-service=true Annotations: <none> Data ==== Corefile: ---- .:53 { errors ready health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf # Here! cache 30 loop reload loadbalance import custom/*.override } import custom/*.server BinaryData ==== Events: <none>
No plug-in CoreDNS
forward
,policy
especifica a política a ser usada para selecionar servidores upstream. As políticas são definidas na tabela a seguir.Nome da política Descrição random
Uma política que implementa seleção de upstream aleatória. Essa política é a política padrão. round_robin
Uma política que seleciona hosts com base na ordenação de round robin. sequential
Uma política que seleciona hosts com base em ordenação sequencial. Se a rede virtual AKS contiver vários servidores DNS, as solicitações do nó AKS poderão ir para o primeiro servidor DNS. No entanto, as solicitações do pod podem ir para o segundo servidor DNS.
Causa: vários destinos para solicitações DNS
Se dois servidores DNS personalizados forem especificados e o terceiro servidor DNS for especificado como DNS do Azure (168.63.129.16), o nó enviará solicitações para o primeiro servidor DNS personalizado se estiver em execução e acessível. Nesta configuração, o nó pode resolve o domínio personalizado. No entanto, algumas das solicitações DNS do pod podem ser direcionadas para o DNS do Azure. Isso ocorre porque o CoreDNS pode selecionar o servidor upstream aleatoriamente. Nesse cenário, o domínio personalizado não pode ser resolvido. Portanto, a solicitação DNS falha.
Solução: remover o DNS do Azure das configurações de rede virtual
Recomendamos que você não combine o DNS do Azure com servidores DNS personalizados nas configurações de rede virtual. Se você quiser usar os servidores DNS personalizados, adicione apenas os servidores DNS personalizados nas configurações de rede virtual. Em seguida, configure o DNS do Azure nas configurações do encaminhador de seus servidores DNS personalizados.
Para obter mais informações, consulte Resolução de nomes que usa seu próprio servidor DNS.
Aviso de isenção de responsabilidade para contatos de terceiros
A Microsoft fornece informações de contato de terceiros para ajudá-lo a encontrar informações adicionais sobre esse tópico. Essas informações de contato podem ser alteradas sem aviso prévio. A Microsoft não garante a precisão das informações de contato de terceiros.
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.