Atualmente capaz de resolver todos os serviços para endereços IP e telnet e fazer ping neles. Não foi possível resolver pods para endereços IP. Embora seja possível pesquisar endereços IP de pods com kubectl e telnet e fazer ping neles. Como preciso que o DNS seja configurado para resolver pods no Kubernetes 1.9.6, dns-controller:1.9.1.
Responder1
A resposta de @mk_sta é um pouco mais fácil de trabalhar, você pode executar este liner para testar seu DNS:
kubectl run busybox --image=busybox --rm --attach --command -- sh -c "cat /etc/resolv.conf; nslookup $POD.$NAMESPACE.pod.cluster.local"
Exemplo de saída:
If you don't see a command prompt, try pressing enter.
Server: 100.64.0.10
Address: 100.64.0.10:53
*** Can't find $POD.$NAMESPACE.pod.cluster.local: No answer
deployment.apps "busybox" deleted
O bônus é que ele exclui a implantação/pods após a execução.
Para mim, o problema é que meus pods estão em estado e, portanto, a resolução do DNS do pod é um pouco diferente. Você tem que usar (por exemplo):
web-{0..N-1}.nginx.default.svc.cluster.local
pod-N.$GOVERNING_STATEFULSET.$NAMESPACE.svc.cluster.local
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Isso é uma coisa que pode dar errado. Você pode fornecer mais informações sobre seu caso específico.
Responder2
Você pode criar um pod de teste busybox
para verificar a função de resolução de DNS e depurar o problema:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
Verifique /etc/resolv.conf
o arquivo no busybox
pod:
kubectl exec busybox cat /etc/resolv.conf
O conteúdo deve ser assim:
search default.svc.cluster.local svc.cluster.local cluster.local .....
nameserver 10.0.0.10
options ndots:5
Faça uma solicitação de pesquisa para o pod de destino no cluster:
kubectl exec -ti busybox -- nslookup XXX-XX-XX-XX.default.pod.cluster.local
Caso você não tenha resolvido o nome DNS dos pods, você pode verificar os logs dos componentes DNS com kubectl logs
o comando:
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c healthz
Responder3
A melhor maneira que encontrei para resolver isso é criando um Jump Pod.
Etapa 1. Crie o pod com um arquivo de especificação.
cat << ENDL >> jumpod.yml
apiVersion: v1
kind: Pod
metadata:
name: jumpod
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
ENDL
Etapa 2. Aplique Ether ou crie o pod no cluster e em um nó. Observe que ele estará localizado no namespace padrão.
kubectl apply -f jumpod.yml
Agora você pode usar este pod para obter o DNS de um pod ou serviço.
Por exemplo:
Pod nslookup Etapa 3. Obtenha o endereço IP do pod que você está procurando.
kubectl get pods -o wide
Etapa 4. Use o Jump Pod para fazer um nslookup
kubectl exec -it jumpod ping 10.244.0.149
Serviço nslookup Etapa 5. Pesquise o endereço IP dos serviços que você deseja usar.
kubectl get services --all-namespaces
Etapa 6. Agora use o jump pod para fazer um nslookup no endereço IP do serviço
kubectl exec -it jumpod nslookup 10.245.150.103
Abaixo está um exemplo de como o cluster principal usando nslookup não funcionará e como o busybox (também conhecido como jump pod) funcionará.
$ kubectl exec -it jumpod nslookup 10.245.150.103
Server: 10.245.0.10
Address 1: 10.245.0.10 kube-dns.kube-system.svc.cluster.local
Name: 10.245.150.103
Address 1: 10.245.150.103 hello.develop.svc.cluster.local
$ nslookup 10.245.150.103
Server: 8.8.8.8
Address: 8.8.8.8#53
** server can't find 103.150.245.10.in-addr.arpa: NXDOMAIN
Espero que isto ajude!
PS Se por acaso você precisar exportar o arquivo DNS que você criou no pod, você pode usar isso.
kubectl cp default/POD_NAME:bin/FILE_NAME /Users/username/FILE_NAME
ou apenas use > para exportá-lo para um arquivo.