Какой компонент в Kubernetes отвечает за DNS?

«Какой компонент в Kubernetes отвечает за DNS?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

За внутреннее DNS-разрешение в кластере Kubernetes отвечает CoreDNS. Это гибкий, расширяемый DNS-сервер, работающий как Deployment в пространстве имен kube-system. Он заменил собой предыдущее решение kube-dns.

Как это работает:

  1. Service Discovery: Когда вы создаете Service с именем my-service в namespace default, CoreDNS автоматически создает DNS-запись:
    • my-service.default.svc.cluster.local → ClusterIP этого сервиса.
    • При обращении из того же namespace можно использовать просто my-service.
  2. Pod Discovery: Для Pod'ов можно настроить создание записей вида pod-ip-address.my-namespace.pod.cluster-domain.local (например, 172-17-0-3.default.pod.cluster.local).

Пример конфигурации CoreDNS (ConfigMap):

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 { # Порт прослушивания
        errors # Логирование ошибок
        health { # Health-check endpoint на порту 8080
          lameduck 5s
        }
        ready # Endpoint готовности
        # Плагин kubernetes - ключевой для service discovery
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods verified # Создавать записи для Pod'ов с проверкой существования
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
        }
        prometheus :9153 # Метрики для Prometheus
        # Резолвинг внешних имен через upstream DNS (например, из /etc/resolv.conf ноды)
        forward . /etc/resolv.conf {
          max_concurrent 1000
        }
        cache 30 # Кэширование ответов
        loop # Защита от DNS-петель
        reload # Автоматическая перезагрузка конфига при изменении
        loadbalance # Балансировка ответов для A/AAAA записей
    }

Диагностика:

  • Проверить работу DNS изнутри Pod'а можно с помощью nslookup или dig:
    kubectl run -it --rm --image=busybox:1.28 dns-test --restart=Never -- nslookup kubernetes.default
  • Если есть проблемы, стоит проверить:
    1. Состояние Pod'ов CoreDNS: kubectl get pods -n kube-system -l k8s-app=kube-dns.
    2. Конфигурацию resolv.conf внутри проблемного Pod'а: cat /etc/resolv.conf.