Ответ
За внутреннее DNS-разрешение в кластере Kubernetes отвечает CoreDNS. Это гибкий, расширяемый DNS-сервер, работающий как Deployment в пространстве имен kube-system. Он заменил собой предыдущее решение kube-dns.
Как это работает:
- Service Discovery: Когда вы создаете Service с именем
my-serviceв namespacedefault, CoreDNS автоматически создает DNS-запись:my-service.default.svc.cluster.local→ ClusterIP этого сервиса.- При обращении из того же namespace можно использовать просто
my-service.
- 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 - Если есть проблемы, стоит проверить:
- Состояние Pod'ов CoreDNS:
kubectl get pods -n kube-system -l k8s-app=kube-dns. - Конфигурацию
resolv.confвнутри проблемного Pod'а:cat /etc/resolv.conf.
- Состояние Pod'ов CoreDNS: