Solucionar problemas de falhas de resolução de 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 AKS (Serviço de Kubernetes do Microsoft Azure).
Pré-requisitos
A ferramenta kubectl do Kubernetes 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 de DNS.
Tela de fundo
Para resolução de 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á sendo executado. O arquivo resolv.conf ( /run/systemd/resolve/resolv.conf) é atualizado com base nas configurações de 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 etapas a seguir:
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 são usados 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 são usados 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 dos pods CoreDNS:
kubectl logs -l k8s-app=kube-dns -n kube-system
Observação
Para ver mais informações de depuração, habilite logs detalhados no CoreDNS. Para habilitar o log detalhado no CoreDNS, consulte Solução de problemas de personalizações do CoreDNS no AKS.
Etapa 2: Criar um pod de teste para executar comandos
Se a resolução do 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 roteadas 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 no pod para determinar se a resolução DNS esteja 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 de DNS funcionam quando o servidor DNS upstream é especificado explicitamente
Se as solicitações de 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 o Serviço de Kubernetes do Azure.
Verifique se uma política de rede está bloqueando o tráfego na porta UDP (User Datagram Protocol) 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, verifique 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, verifique 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 de 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. (Os novos nós terão a configuração atualizada.)
Reinicie o serviço de rede nos nós e, em seguida, reinicie os pods CoreDNS. Siga estas etapas:
Faça uma conexão Secure Shell (SSH) com os nós. Para obter mais informações, consulte Conecte os nós de cluster do AKS (Azure Kubernetes Service) 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 da rede virtual.
Se vários servidores DNS forem especificados na rede virtual do AKS, ocorrerá uma das seguintes sequências:
O nó do AKS envia uma solicitação para o servidor DNS upstream como parte de uma série. Nessa 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 para esse resolvedor pode ser encontrado em /run/systemd/resolve/resolv.conf nos nós do AKS.
Existem vários servidores? Nesse caso, a biblioteca do resolvedor os consulta na ordem listada. (A estratégia usada é tentar um servidor de nomes primeiro. Se a consulta atingir o tempo limite, tente o próximo servidor de nomes e continue até que a lista de servidores de nomes seja esgotada. Em seguida, a consulta continua tentando se conectar aos servidores de nomes até que o número máximo de tentativas seja feito.)
O CoreDNS usa o plug-in de encaminhamento para enviar solicitações para servidores DNS upstream. Esse plug-in usa um algoritmo aleatório para selecionar o servidor DNS upstream. Nessa 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
forward
do CoreDNS,policy
especifica a política a ser usada para selecionar servidores upstream. As políticas são definidas na tabela a seguir.Nome de política Descrição random
Uma política que implementa a seleção de upstream aleatória. Essa é a política padrão. round_robin
Uma política que seleciona hosts com base na ordenação round robin. sequential
Uma política que seleciona hosts com base na ordenação sequencial. Se a rede virtual do AKS contiver vários servidores DNS, as solicitações do nó do 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 de 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 ele estiver em execução e acessível. Nessa configuração, o nó pode resolver o domínio personalizado. No entanto, algumas das solicitações de 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, confira Resolução de nome usando 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.