Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Настройка подключения к Managed Service for PostgreSQL из контейнера Serverless Containers
    • Создать ВМ с Container Optimized Image
    • Создать ВМ с Container Optimized Image и дополнительным томом для Docker-контейнера
    • Создать группу ВМ с Container Optimized Image и несколькими Docker-контейнерами
    • Создать группу ВМ с Container Optimized Image
    • Создать ВМ с Container Optimized Image и несколькими Docker-контейнерами
    • Изменить ВМ с Container Optimized Image
    • Настройка вывода информации из Docker-контейнера в серийный порт
      • Создание нового Kubernetes-проекта
      • Создание кластера Kubernetes без доступа в интернет
      • Запуск рабочих нагрузок с GPU
      • Использование групп узлов c GPU без предустановленных драйверов
      • Установка Time-Slicing GPUs
      • Миграция ресурсов в другую зону доступности
      • Шифрование секретов
        • Интеграция с корпоративной зоной DNS
        • Автоматическое масштабирование DNS по размеру кластера
        • Настройка NodeLocal DNS Cache
        • Проверка DNS Challenge для сертификатов Let's Encrypt®

В этой статье:

  • Необходимые платные ресурсы
  • Перед началом работы
  • Настройте kube-dns-autoscaler
  • Убедитесь, что приложение работает
  • Определите параметры масштабирования
  • Измените конфигурацию
  • Проверьте масштабирование
  • Измените размер кластера Managed Service for Kubernetes
  • Проверьте изменения в количестве реплик CoreDNS
  • Настройте уменьшение количества узлов Managed Service for Kubernetes
  • Отключите масштабирование
  • Удалите созданные ресурсы
  1. Контейнерная инфраструктура
  2. Managed Service for Kubernetes
  3. Работа с DNS
  4. Автоматическое масштабирование DNS по размеру кластера

Автоматическое масштабирование кластера Yandex Managed Service for Kubernetes DNS по размеру кластера

Статья создана
Yandex Cloud
Обновлена 3 апреля 2025 г.
  • Необходимые платные ресурсы
  • Перед началом работы
  • Настройте kube-dns-autoscaler
    • Убедитесь, что приложение работает
    • Определите параметры масштабирования
    • Измените конфигурацию
  • Проверьте масштабирование
    • Измените размер кластера Managed Service for Kubernetes
    • Проверьте изменения в количестве реплик CoreDNS
    • Настройте уменьшение количества узлов Managed Service for Kubernetes
  • Отключите масштабирование
  • Удалите созданные ресурсы

В Managed Service for Kubernetes поддерживается автоматическое масштабирование сервиса DNS. В кластере Managed Service for Kubernetes работает приложение kube-dns-autoscaler, которое регулирует количество реплик CoreDNS в зависимости от:

  • Количества узлов в кластере Managed Service for Kubernetes.
  • Количества ядер (vCPU) в кластере Managed Service for Kubernetes.

Количество реплик рассчитывается с помощью формул.

Чтобы автоматизировать масштабирование DNS:

  1. Настройте kube-dns-autoscaler.
  2. Проверьте масштабирование.

Если автоматическое масштабирование потеряло актуальность, отключите его.

Если созданные ресурсы вам больше не нужны, удалите их.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки описываемого решения входят:

  • Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
  • Плата за каждую ВМ (узлы кластера и ВМ для управления кластером без публичного доступа): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
  • Плата за публичный IP-адрес для узлов кластера (см. тарифы Virtual Private Cloud).

Перед началом работыПеред началом работы

  1. Создайте ресурсы Managed Service for Kubernetes:

    Вручную
    Terraform
    1. Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.

      Важно

      От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.

    2. Создайте кластер Managed Service for Kubernetes. При создании укажите группы безопасности, подготовленные ранее.

      Если вы планируете работать с кластером в пределах сети Yandex Cloud, выделять кластеру публичный IP-адрес не нужно. Для подключений извне предоставьте кластеру публичный адрес.

    3. Создайте группу узлов. Выделите ей публичный адрес, чтобы предоставить доступ в интернет и возможность скачивать Docker-образы и компоненты. Укажите группы безопасности, подготовленные ранее.

    1. Если у вас еще нет Terraform, установите его.

    2. Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.

    3. Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его.

    4. Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

    5. Скачайте в ту же рабочую директорию файл конфигурации кластера Managed Service for Kubernetes k8s-cluster.tf. В файле описаны:

      • Сеть.

      • Подсеть.

      • Кластер Managed Service for Kubernetes.

      • Группа узлов Managed Service for Kubernetes.

      • Сервисный аккаунт, необходимый для создания кластера и группы узлов Managed Service for Kubernetes.

      • Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.

        Важно

        От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.

    6. Укажите в файле конфигурации идентификатор каталога.

    7. Проверьте корректность файлов конфигурации Terraform с помощью команды:

      terraform validate
      

      Если в файлах конфигурации есть ошибки, Terraform на них укажет.

    8. Создайте необходимую инфраструктуру:

      1. Выполните команду для просмотра планируемых изменений:

        terraform plan
        

        Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.

      2. Если вас устраивают планируемые изменения, внесите их:

        1. Выполните команду:

          terraform apply
          
        2. Подтвердите изменение ресурсов.

        3. Дождитесь завершения операции.

      В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.

  2. Установите kubectl и настройте его на работу с созданным кластером.

    Если для кластера не предоставлен публичный адрес и kubectl настроен через внутренний адрес кластера, выполняйте команды kubectl на ВМ Yandex Cloud, находящейся в одной сети с кластером.

Настройте kube-dns-autoscalerНастройте kube-dns-autoscaler

Убедитесь, что приложение работаетУбедитесь, что приложение работает

Проверьте Deployment в пространстве имен kube-system:

kubectl get deployment --namespace=kube-system

Результат:

NAME                 READY  UP-TO-DATE  AVAILABLE  AGE
...
kube-dns-autoscaler  1/1    1           1          52m

Определите параметры масштабированияОпределите параметры масштабирования

Под kube-dns-autoscaler периодически запрашивает у сервера Kubernetes данные о количестве узлов и ядер в кластере Managed Service for Kubernetes. На основании этих данных выполняется расчет количества реплик CoreDNS.

Возможны два вида расчета:

  • Linear (линейный режим).
  • Ladder (ступенчатая функция).

Подробнее о расчетах см. в документации cluster-proportional-autoscaler.

В этом примере рассмотрен режим linear, в котором расчет выполняется по формуле:

replicas = max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) )

Где:

  • coresPerReplica — параметр конфигурации, количество реплик CoreDNS на каждое ядро (vCPU) кластера Managed Service for Kubernetes.
  • nodesPerReplica — параметр конфигурации, количество реплик CoreDNS на каждый узел (Node) кластера Managed Service for Kubernetes.
  • cores — фактическое количество ядер (vCPU) в кластере Managed Service for Kubernetes.
  • nodes — фактическое количество узлов (Node) в кластере Managed Service for Kubernetes.
  • ceil — функция округления дроби до целого.
  • max — функция определения максимума из двух значений.

Дополнительный параметр preventSinglePointFailure актуален, если в кластере Managed Service for Kubernetes больше одного узла. Когда параметр установлен в true, минимальное количество реплик DNS равно двум.

Также можно определить параметры конфигурации min и max, которые задают минимальное и максимальное количество реплик CoreDNS в кластере Managed Service for Kubernetes:

replicas = min(replicas, max)
replicas = max(replicas, min)

Подробнее о расчете см. в документации cluster-proportional-autoscaler.

Измените конфигурациюИзмените конфигурацию

  1. Проверьте текущие параметры.

    В этом примере создана группа узлов Managed Service for Kubernetes node-group-1 с параметрами:

    • Количество узлов Managed Service for Kubernetes — 3.
    • Количество ядер (vCPU) — 12.

    По умолчанию установлен режим linear и следующие параметры масштабирования:

    • coresPerReplica — 256.
    • nodesPerReplica — 16.
    • preventSinglePointFailure — true.
    replicas = max( ceil( 12 * 1/256 ), ceil( 3 * 1/16 ) ) = 1
    

    Параметр preventSinglePointFailure установлен в true, поэтому количество реплик CoreDNS будет равно двум.

    Чтобы проверить информацию о подах coredns, выполните команду:

    kubectl get pods -n kube-system
    

    Результат:

    NAME                      READY  STATUS   RESTARTS  AGE
    ...
    coredns-7c********-4dmjl  1/1    Running  0         128m
    coredns-7c********-n7qsv  1/1    Running  0         134m
    
  2. Задайте новые параметры.

    Измените конфигурацию следующим образом:

    • coresPerReplica: 4.
    • nodesPerReplica: 2.
    • preventSinglePointFailure: true.
    replicas = max( ceil( 12 * 1/4 ), ceil( 3 * 1/2 ) ) = 3
    

    Чтобы передать параметры приложению kube-dns-autoscaler, отредактируйте соответствующий ConfigMap с помощью команды:

    kubectl edit configmap kube-dns-autoscaler --namespace=kube-system
    

    Откроется текстовый редактор с конфигурацией kube-dns-autoscaler. Измените строку с параметрами:

    linear: '{"coresPerReplica":4,"nodesPerReplica":2,"preventSinglePointFailure":true}'
    

    Сохраните изменения. На экране отобразится результат операции:

    configmap/kube-dns-autoscaler edited
    

    Приложение kube-dns-autoscaler загрузит конфигурацию и масштабирует службу DNS в соответствии с новыми параметрами.

Проверьте масштабированиеПроверьте масштабирование

Измените размер кластера Managed Service for KubernetesИзмените размер кластера Managed Service for Kubernetes

Создайте вторую группу узлов Managed Service for Kubernetes с помощью команды:

yc managed-kubernetes node-group create \
  --name node-group-2 \
  --cluster-name dns-autoscaler \
  --location zone=ru-central1-a \
  --public-ip \
  --fixed-size 2 \
  --cores 4 \
  --core-fraction 5

Результат:

done (2m43s)
...

Теперь в кластере Managed Service for Kubernetes 5 узлов с 20 ядрами. Рассчитайте количество реплик:

replicas = max( ceil( 20 * 1/4 ), ceil( 5 * 1/2 ) ) = 5

Проверьте изменения в количестве реплик CoreDNSПроверьте изменения в количестве реплик CoreDNS

Выполните команду:

kubectl get pods -n kube-system

Результат:

NAME                      READY  STATUS   RESTARTS  AGE
...
coredns-7c********-7l8mc  1/1    Running  0         3m30s
coredns-7c********-n7qsv  1/1    Running  0         3h20m
coredns-7c********-pv9cv  1/1    Running  0         3m40s
coredns-7c********-r2lss  1/1    Running  0         49m
coredns-7c********-s5jgz  1/1    Running  0         57m

Настройте уменьшение количества узлов Managed Service for KubernetesНастройте уменьшение количества узлов Managed Service for Kubernetes

По умолчанию Cluster Autoscaler не уменьшает количество узлов в группе узлов Managed Service for Kubernetes с автоматическим масштабированием, если на этих узлах присутствуют поды из пространства имен kube-system под управлением контроллеров репликаций приложений Deployment, ReplicaSet или StatefulSet, например, поды CoreDNS. В этом случае количество узлов Managed Service for Kubernetes в группе не может стать меньше числа подов CoreDNS.

Чтобы разрешить уменьшение числа узлов Managed Service for Kubernetes, сконфигурируйте для них объект PodDisruptionBudget, в котором есть возможность останавливать до двух подов CoreDNS одновременно:

kubectl create poddisruptionbudget <имя_pdb> \
  --namespace=kube-system \
  --selector k8s-app=kube-dns \
  --min-available=2

Результат:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: <имя_pdb>
spec:
  minAvailable: 2
  selector:
    matchLabels:
      k8s-app: kube-dns

Отключите масштабированиеОтключите масштабирование

Обнулите количество реплик в Deployment приложения kube-dns-autoscaler:

kubectl scale deployment --replicas=0 kube-dns-autoscaler --namespace=kube-system

Результат:

deployment.apps/kube-dns-autoscaler scaled

Проверьте результат с помощью команды:

kubectl get rs --namespace=kube-system

Результат:

NAME                 READY  UP-TO-DATE  AVAILABLE  AGE
...
kube-dns-autoscaler  0/0    0           0          3h53m

Удалите созданные ресурсыУдалите созданные ресурсы

Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:

Вручную
Terraform

Удалите кластер Managed Service for Kubernetes.

  1. В терминале перейдите в директорию с планом инфраструктуры.

    Важно

    Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.

  2. Удалите ресурсы:

    1. Выполните команду:

      terraform destroy
      
    2. Подтвердите удаление ресурсов и дождитесь завершения операции.

    Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.

Была ли статья полезна?

Предыдущая
Интеграция с корпоративной зоной DNS
Следующая
Настройка NodeLocal DNS Cache
Проект Яндекса
© 2025 ООО «Яндекс.Облако»