Устранение проблем с разрешением DNS-имен в Managed Service for Kubernetes
Описание проблемы
Кластер Managed Service for Kubernetes не разрешает FQDN-имена как изнутри самого кластера, так и имена внешних по отношению к кластеру ресурсов.
Решение
Проверьте используемую версию Kubernetes на мастер-узлах и рабочих узлах. Для этого выполните команды:
yc managed-kubernetes cluster get $CLUSTER_ID | grep vers
yc managed-kubernetes node-group get $NODE_GROUP_ID | grep vers
Внимание
Eсли версия кластера или группы узлов устарела и не входит в список актуальных версий yc managed-kubernetes list-versions
, следует выполнить обновление кластера и группы узлов, перед тем как продолжать диагностику.
Если кластер и группа узлов используют актуальную версию Kubernetes, проверьте, корректно ли работает CoreDNS в кластере.
Для диагностики CoreDNS понадобится проанализировать состояние системных DNS-подов кластера командой kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
.
Примерный вывод команды kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-85fd96f799-2zzvw 1/1 Running 5 21d 10.96.138.252 cl1XXXXXXXXXXXXXXXXX-yxeg <none> <none>
coredns-85fd96f799-9lz6b 1/1 Running 3 20d 10.96.140.90 cl1XXXXXXXXXXXXXXXXX-icos <none> <none>
Обратите внимание на состояние подов в кластере. Если состояние отличается от RUNNING
, системные журналы всех DNS-подов в кластере командой kubectl logs -l k8s-app=kube-dns -n kube-system --all-containers=true
и найти причину проблем в этих журналах.
Если проблему с корректностью работы CoreDNS не удалось решить, воспользуйтесь одним из следующих методов:
Обычно в кластере два пода CoreDNS или один, если кластер одноузловый. Вы можете увеличить число реплик CoreDNS, изменив конфигурацию автомасштабирования деплоймента CoreDNS и задав значение для параметра linear
:
Пример деплоймента kube-dns-autoscaler (kubectl -n kube-system edit cm kube-dns-autoscaler
)
apiVersion: v1
data:
linear: '{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}' # < это настройки масштабирования
kind: ConfigMap
metadata:
name: kube-dns-autoscaler
namespace: kube-system
selfLink: /api/v1/namespaces/kube-system/configmaps/kube-dns-autoscaler
Подробнее про конфигурацию масштабирования можно узнать из материалов разработчиков Kubernetes на GitHub по этой ссылке
Чтобы снизить нагрузку по DNS-запросам в кластере Managed Service for Kubernetes, включите NodeLocal DNS Cache. Если кластер Managed Service for Kubernetes содержит более 50 узлов, используйте автоматическое масштабирование DNS.
При включении NodeLocal DNS Cache в кластере Managed Service for Kubernetes разворачивается DaemonSetnode-local-dns
. Поды пользователя теперь отправляют запросы к агенту на своем узле Managed Service for Kubernetes.
Если запрос в кеше агента, то он возвращает прямой ответ. В ином случае создается TCP-соединение с kube-dns
ClusterIP
. По умолчанию кеширующий агент делает cache-miss запросы к kube-dns
для DNS-зоны кластера Managed Service for Kubernetes cluster.local
.
Установите NodeLocal DNS с помощью Cloud Marketplace, как описано в инструкции или вручную.
Совет
Гарантированный результат при решении проблем с DNS в кластере также даст установка NodeLocal DNS Cache из Yandex Cloud Marketplace по следующим инструкциям:
Если проблема осталась
Если вышеописанные действия не помогли решить проблему, создайте запрос в техническую поддержку
- Идентификатор кластера Managed Service for Kubernetes.
- Журнал событий кластера Managed Service for Kubernetes: вывод
kubectl get events
. - Журнал DNS-сервисов кластера: вывод
kubectl logs -l k8s-app=kube-dns -n kube-system --all-containers=true
. - Примеры ошибок при работе DNS-разрешения в кластере с фиксацией даты и времени проявления проблемы.