K8s em Exemplos: DNS e Descoberta de Serviços

Kubernetes executa CoreDNS para resolução de nomes interna. Todo Service ganha um registro DNS A automaticamente. Pods resolvem nomes de Service para ClusterIPs sem hardcodar endereços.

service.yaml

Services automaticamente ganham registros DNS. Este Service recebe DNS: my-app.production.svc.cluster.local com um registro A apontando para o ClusterIP.

apiVersion: v1
kind: Service
metadata:
  name: my-app
  namespace: production
spec:
  ports:
    - port: 80
  selector:
    app: my-app
terminal

Resolução DNS do mais curto ao FQDN. Mesmo namespace: apenas nome do service. Cross-namespace: service.namespace. Com sufixo svc: service.namespace.svc. FQDN completo (raramente necessário): service.namespace.svc.cluster.local.

$ curl http://my-app
Hello from my-app!

$ curl http://my-app.other-namespace
Hello from my-app!

$ curl http://my-app.other-namespace.svc

$ curl http://my-app.other-namespace.svc.cluster.local
terminal

Services também ganham registros SRV para portas nomeadas. Registros SRV contêm informação de porta, útil para descoberta dinâmica de portas.

$ nslookup my-app.default.svc.cluster.local
Server:    10.96.0.10
Address:   10.96.0.10#53

Name:      my-app.default.svc.cluster.local
Address:   10.96.0.100

$ nslookup -type=SRV _http._tcp.my-app.default.svc.cluster.local
_http._tcp.my-app.default.svc.cluster.local   SRV 0 100 80 my-app.default.svc.cluster.local
headless-service.yaml

Headless Services (clusterIP: None) retornam IPs de Pods diretamente ao invés de um ClusterIP. DNS retorna todos os IPs de Pods correspondentes. Essencial para StatefulSets e load balancing do lado cliente.

apiVersion: v1
kind: Service
metadata:
  name: my-db
spec:
  clusterIP: None
  ports:
    - port: 5432
  selector:
    app: postgres
terminal

Pods de StatefulSet ganham nomes DNS estáveis e previsíveis via headless Services. Cada Pod ganha seu próprio registro A: pod-name.service.namespace.svc.cluster.local.

$ nslookup my-db-0.my-db.default.svc.cluster.local
Address: 10.244.1.5

$ nslookup my-db-1.my-db.default.svc.cluster.local
Address: 10.244.2.8

$ nslookup my-db-2.my-db.default.svc.cluster.local
Address: 10.244.3.12

$ psql -h my-db-0.my-db.default.svc.cluster.local
pod-dns-config.yaml

DNS policy do Pod controla como Pods resolvem nomes. ClusterFirst é o padrão. Use None com dnsConfig customizado para casos especiais. Opções: Default, ClusterFirst, ClusterFirstWithHostNet, None.

spec:
  dnsPolicy: ClusterFirst
  dnsConfig:
    nameservers:
      - 8.8.8.8
    searches:
      - my-namespace.svc.cluster.local
    options:
      - name: ndots
        value: "5"
terminal

Configuração do CoreDNS está em um ConfigMap no kube-system. Customize para forwarding de DNS externo, domínios customizados ou caching. Pods recebem /etc/resolv.conf configurado pelo kubelet.

$ kubectl get configmap coredns -n kube-system -o yaml
apiVersion: v1
kind: ConfigMap
data:
  Corefile: |
    .:53 {
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        forward . /etc/resolv.conf
        cache 30
    }

$ kubectl exec my-pod -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
terminal

Debug problemas de DNS verificando pods do CoreDNS, testando resolução de dentro do cluster e verificando se endpoints de Service existem. Problema comum: configuração ndots causa falha em lookups externos.

$ kubectl run dns-test --rm -it --image=busybox:1.28 -- sh
/ # nslookup my-app
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      my-app
Address 1: 10.96.0.100

/ # nslookup kubernetes.default
Name:      kubernetes.default
Address 1: 10.96.0.1

$ kubectl logs -n kube-system -l k8s-app=kube-dns
[INFO] 10.244.0.5:53842 - 12345 "A IN my-app.default.svc.cluster.local."

$ kubectl get pods -n kube-system -l k8s-app=kube-dns
NAME                       READY   STATUS    AGE
coredns-5644d7b6d9-abc12   1/1     Running   10d
coredns-5644d7b6d9-def34   1/1     Running   10d

Índice | GitHub | Use as setas do teclado para navegar |