Resolução de DNS do pod do Kubernetes

Resolução de DNS do pod do Kubernetes

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 busyboxpara 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.confo arquivo no busyboxpod:

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 logso 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.

informação relacionada