|
Este documento foi traduzido usando tecnologia de tradução automática de máquina. Sempre trabalhamos para apresentar traduções precisas, mas não oferecemos nenhuma garantia em relação à integridade, precisão ou confiabilidade do conteúdo traduzido. Em caso de qualquer discrepância, a versão original em inglês prevalecerá e constituirá o texto official. |
DNS
Os comandos/passos listados nesta página podem ser usados para verificar problemas de resolução de nomes em seu cluster.
Certifique-se de que você configurou o kubeconfig correto (por exemplo, export KUBECONFIG=$PWD/kube_config_cluster.yml para Rancher HA) ou está usando o kubectl embutido via a interface.
Antes de executar as verificações de DNS, certifique-se de que a rede overlay está funcionando corretamente para o seu provedor de DNS, pois isso também pode ser a razão pela qual a resolução de DNS falha (parcialmente).
Verifique se os pods de DNS estão em execução
kubectl -n kube-system get pods -l k8s-app=kube-dns
Exemplo de saída ao usar CoreDNS:
NAME READY STATUS RESTARTS AGE coredns-799dffd9c4-6jhlz 1/1 Running 0 76m
Exemplo de saída ao usar kube-dns:
NAME READY STATUS RESTARTS AGE kube-dns-5fd74c7488-h6f7n 3/3 Running 0 4m13s
Verifique se o serviço de DNS está presente com o cluster-ip correto
kubectl -n kube-system get svc -l k8s-app=kube-dns
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP 4m13s
Verifique se os nomes de domínio estão sendo resolvidos
Verifique se os nomes internos do cluster estão sendo resolvidos (neste exemplo, kubernetes.default), o IP mostrado após Server: deve ser o mesmo que o CLUSTER-IP do serviço kube-dns.
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup kubernetes.default
Saída de exemplo:
Server: 10.43.0.10 Address 1: 10.43.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes.default Address 1: 10.43.0.1 kubernetes.default.svc.cluster.local pod "busybox" deleted
Verifique se os nomes externos estão sendo resolvidos (neste exemplo, www.google.com)
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup www.google.com
Saída de exemplo:
Server: 10.43.0.10 Address 1: 10.43.0.10 kube-dns.kube-system.svc.cluster.local Name: www.google.com Address 1: 2a00:1450:4009:80b::2004 lhr35s04-in-x04.1e100.net Address 2: 216.58.211.100 ams15s32-in-f4.1e100.net pod "busybox" deleted
Se você quiser verificar a resolução de nomes de domínio em todos os hosts, execute os seguintes passos:
-
Salve o seguinte arquivo como
ds-dnstest.ymlapiVersion: apps/v1 kind: DaemonSet metadata: name: dnstest spec: selector: matchLabels: name: dnstest template: metadata: labels: name: dnstest spec: tolerations: - operator: Exists containers: - image: busybox:1.28 imagePullPolicy: Always name: alpine command: ["sleep", "infinity"] terminationMessagePath: /dev/termination-log -
Inicie-o usando
kubectl create -f ds-dnstest.yml -
Aguarde até que
kubectl rollout status ds/dnstest -wretorne:daemon set "dnstest" successfully rolled out. -
Configure a variável de ambiente
DOMAINpara um Nome de Domínio Completo e Qualificado (FQDN) que o host deve ser capaz de resolver (www.google.comé usado como exemplo) e execute o seguinte comando para permitir que cada contêiner em cada host resolva o nome de domínio configurado (é um comando de linha única).export DOMAIN=www.google.com; echo "=> Start DNS resolve test"; kubectl get pods -l name=dnstest --no-headers -o custom-columns=NAME:.metadata.name,HOSTIP:.status.hostIP | while read pod host; do kubectl exec $pod -- /bin/sh -c "nslookup $DOMAIN > /dev/null 2>&1"; RC=$?; if [ $RC -ne 0 ]; then echo $host cannot resolve $DOMAIN; fi; done; echo "=> End DNS resolve test"
-
Quando este comando terminar de ser executado, a saída indicando que tudo está correto é:
=> Start DNS resolve test => End DNS resolve test
Se você ver um erro na saída, isso significa que o(s) host(s) mencionado(s) não é/são capaz(eis) de resolver o FQDN fornecido.
Exemplo de saída de erro de uma situação onde o host com IP 209.97.182.150 teve as portas UDP bloqueadas.
=> Start DNS resolve test command terminated with exit code 1 209.97.182.150 cannot resolve www.google.com => End DNS resolve test
Limpe o DaemonSet alpine executando kubectl delete ds/dnstest.
Específico do CoreDNS
Verifique a configuração
A configuração do CoreDNS está armazenada no configmap coredns no namespace kube-system.
kubectl -n kube-system get configmap coredns -o go-template={{.data.Corefile}}
Verifique os servidores de nomes upstream no resolv.conf
Por padrão, os servidores de nomes configurados no host (em /etc/resolv.conf) serão usados como servidores de nomes upstream para o CoreDNS. Você pode verificar este arquivo no host ou executar o seguinte Pod com dnsPolicy definido como Default, que herdará o /etc/resolv.conf do host em que está sendo executado.
kubectl run -i --restart=Never --rm test-${RANDOM} --image=ubuntu --overrides='{"kind":"Pod", "apiVersion":"v1", "spec": {"dnsPolicy":"Default"}}' -- sh -c 'cat /etc/resolv.conf'
Habilitar registro de consultas
Habilitar o registro de consultas pode ser feito ativando o plugin de log na configuração do Corefile no configmap coredns. Você pode fazer isso usando kubectl -n kube-system edit configmap coredns ou usar o comando abaixo para substituir a configuração no local:
kubectl get configmap -n kube-system coredns -o json | sed -e 's_loadbalance_log\\n loadbalance_g' | kubectl apply -f -
Todas as consultas agora serão registradas e podem ser verificadas usando o comando em Verifique o registro do CoreDNS.
Específico do kube-dns
Verifique os servidores de nomes upstream no contêiner kubedns
Por padrão, os servidores de nomes configurados no host (em /etc/resolv.conf) serão usados como servidores de nomes upstream para o kube-dns. Às vezes, o host executará um servidor de nomes DNS local em cache, o que significa que o endereço em /etc/resolv.conf apontará para um endereço na faixa de loopback (127.0.0.0/8), que será inacessível pelo contêiner. No caso do Ubuntu 18.04, isso é feito por systemd-resolved. Detectamos se systemd-resolved está em execução e usaremos automaticamente o arquivo /etc/resolv.conf com os servidores de nomes upstream corretos (que está localizado em /run/systemd/resolve/resolv.conf).
Use o seguinte comando para verificar os servidores de nomes upstream utilizados pelo contêiner kubedns:
kubectl -n kube-system get pods -l k8s-app=kube-dns --no-headers -o custom-columns=NAME:.metadata.name,HOSTIP:.status.hostIP | while read pod host; do echo "Pod ${pod} on host ${host}"; kubectl -n kube-system exec $pod -c kubedns cat /etc/resolv.conf; done
Saída de exemplo:
Pod kube-dns-667c7cb9dd-z4dsf on host x.x.x.x nameserver 1.1.1.1 nameserver 8.8.4.4
Se a saída mostrar um endereço na faixa de loopback (127.0.0.0/8), você pode corrigir isso de duas maneiras:
-
Certifique-se de que os servidores de nomes corretos estão listados em
/etc/resolv.confnos seus nós no cluster, consulte a documentação do seu sistema operacional sobre como fazer isso. Certifique-se de executar isso antes de provisionar um cluster ou reinicie os nós após fazer a modificação. -
Configure o
kubeletpara usar um arquivo diferente para resolver nomes, utilizandoextra_argsconforme mostrado abaixo (onde/run/resolvconf/resolv.confé o arquivo com os servidores de nomes corretos):
services:
kubelet:
extra_args:
resolv-conf: "/run/resolvconf/resolv.conf"
|
Como o |
Consulte 'Editando o Cluster como YAML' para saber como aplicar essa alteração. Quando o provisionamento do cluster terminar, você deve remover o pod kube-dns para ativar a nova configuração no pod:
kubectl delete pods -n kube-system -l k8s-app=kube-dns pod "kube-dns-5fd74c7488-6pwsf" deleted
Tente resolver o nome novamente usando Verifique se os nomes de domínio estão sendo resolvidos.
Se você quiser verificar a configuração do kube-dns no seu cluster (por exemplo, para verificar se há diferentes servidores de nomes upstream configurados), você pode executar o seguinte comando para listar a configuração do kube-dns:
kubectl -n kube-system get configmap kube-dns -o go-template='{{range $key, $value := .data}}{{ $key }}{{":"}}{{ $value }}{{"\n"}}{{end}}'
Saída de exemplo:
upstreamNameservers:["1.1.1.1"]