Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Managed Service for Kubernetes
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Подключение к узлу по SSH
    • Обновление Kubernetes
    • Настройка автомасштабирования
    • Подключение к кластеру
      • Обзор способов подключения
      • Настройка групп безопасности
      • Создание статического файла конфигурации
    • Установка приложений из Cloud Marketplace
      • Основы работы с Cloud Marketplace
      • Установка Argo CD
      • Установка Container Storage Interface для S3
      • Установка Crossplane
      • Установка External Secrets Operator
      • Установка Falco
      • Установка Filebeat
      • Установка Fluent Bit
      • Установка Gateway API
      • Установка GitLab Agent
      • Установка GitLab Runner
      • Установка HashiCorp Vault
      • Установка Ingress-контроллера Application Load Balancer
      • Установка Jaeger
      • Установка Kyverno & Kyverno Policies
      • Установка Loki
      • Установка Metrics Provider
      • Установка NodeLocal DNS
      • Установка Policy Reporter
      • Установка Thumbor
    • Сетевые сценарии
      • Обеспечение доступа к приложению, запущенному в кластере Kubernetes
      • Настройка контроллера сетевых политик Calico
      • Настройка контроллера сетевых политик Cilium
      • Настройка NodeLocal DNS для контроллера сетевых политик Cilium
    • Работа с постоянными томами
      • Динамическая подготовка тома
      • Статическая подготовка тома
      • Управление классами хранилищ
      • Увеличение размера тома для подов
      • Увеличение размера тома для контроллера StatefulSet
      • Подключение тома в блочном режиме
      • Интеграция с Object Storage
    • Управление кластером Kubernetes
      • Получение информации о кластере Kubernetes
      • Создание кластера Kubernetes
      • Изменение кластера Kubernetes
      • Создание пространства имен в кластере Kubernetes
      • Удаление кластера Kubernetes
    • Управление группой узлов
      • Информация об имеющихся группах узлов
      • Создание группы узлов
      • Подключение к узлу по SSH
      • Настройка автомасштабирования
      • Изменение группы узлов
      • Управление метками узлов кластера Kubernetes
      • Удаление группы узлов
    • Подключение внешних узлов к кластеру
  • Практические руководства
    • Все руководства
    • Создание нового Kubernetes-проекта в Yandex Cloud
    • Интеграция с Container Registry
    • Подпись и проверка Docker-образов Container Registry
    • Сканирование уязвимостей Container Registry при непрерывном развертывании приложений с помощью GitLab
    • Запуск рабочих нагрузок с GPU
    • Установка Ingress-контроллера NGINX с Let's Encrypt®
    • Установка Ingress-контроллера NGINX с сертификатом из Certificate Manager
    • Резервное копирование в Object Storage
    • Горизонтальное масштабирование приложения в кластере
    • Вертикальное масштабирование приложения в кластере
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • Работа со снапшотами
    • Интеграция с корпоративной зоной DNS
    • Автоматическое масштабирование DNS по размеру кластера
    • Настройка локального кеширования DNS
    • Проверка DNS Challenge для сертификатов Let's Encrypt®
    • Мониторинг кластера с помощью Prometheus и Grafana
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Изменение параметров сервера метрик (Metrics Server)
    • Использование продуктов Cloud Marketplace
      • Интеграция с Argo CD
      • Интеграция с Crossplane
      • Синхронизация с секретами Yandex Lockbox
      • Настройка Fluent Bit для работы с Cloud Logging
      • Настройка Gateway API
      • Настройка Application Load Balancer Ingress-контроллера
      • Использование Jaeger для трассировки запросов в Managed Service for YDB
      • Настройка Kyverno & Kyverno Policies
      • Использование Metrics Provider для трансляции метрик
  • Концепции
    • Взаимосвязь ресурсов сервиса
    • Релизные каналы и обновления
    • Шифрование секретов
    • Использование объектов API Kubernetes
      • Том
      • Сервис
    • Группа узлов
      • Автоматическое масштабирование группы узлов
      • Расселение подов с узла
      • Динамическое резервирование ресурсов для узла
      • Группы узлов с GPU
    • Сеть в Managed Service for Kubernetes
    • Внешние узлы кластера
    • Сетевые настройки и политики кластера
    • Автоматическое масштабирование
    • Квоты и лимиты
    • Рекомендации по использованию Managed Service for Kubernetes
  • Управление доступом
  • Правила тарификации
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • ClusterService
      • NodeGroupService
      • VersionService
      • OperationService
    • REST (англ.)
      • Overview
      • Cluster
        • Overview
        • create
        • delete
        • get
        • list
        • listNodeGroups
        • listNodes
        • listOperations
        • start
        • stop
        • update
      • NodeGroup
        • Overview
        • create
        • delete
        • get
        • list
        • listNodes
        • listOperations
        • update
      • Version
        • Overview
        • list
  • Вопросы и ответы
    • Общие вопросы
    • Хранилище данных
    • Настройка и обновление
    • Автоматическое масштабирование
    • Ресурсы
    • Логи
    • Все вопросы на одной странице
  1. Практические руководства
  2. Автоматическое масштабирование DNS по размеру кластера

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

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

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

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

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

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

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

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

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

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

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

    Вручную
    С помощью Terraform
    1. Создайте кластер Managed Service for Kubernetes с настройкой Публичный адрес: Автоматически.

    2. Создайте группу узлов любой подходящей конфигурации.

    3. Настройте группы безопасности кластера и группы узлов. Группа безопасности кластера должна разрешать входящие подключения к портам 443 и 6443.

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

    2. Скачайте файл с настройками провайдера. Поместите его в отдельную рабочую директорию и укажите значения параметров.

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

      • Сеть.
      • Подсеть.
      • Группа безопасности по умолчанию и правила, необходимые для работы кластера Managed Service for Kubernetes:
        • Правила для служебного трафика.
        • Правила для доступа к API Kubernetes и управления кластером с помощью kubectl (через порты 443 и 6443).
      • Кластер Managed Service for Kubernetes.
      • Группа узлов Managed Service for Kubernetes.
      • Сервисный аккаунт, необходимый для создания кластера и группы узлов Managed Service for Kubernetes.
    4. Укажите в файле конфигурации идентификатор каталога.

    5. Выполните команду terraform init в директории с конфигурационными файлами. Эта команда инициализирует провайдер, указанный в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера.

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

      terraform validate
      

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

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

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

        terraform plan
        

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

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

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

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

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

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

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

Настройте 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 данные о количестве узлов и ядер в кластере. На основании этих данных выполняется расчет количества реплик CoreDNS.

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

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

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

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

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

Где:

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

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

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

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

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

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

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

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

    • Количество узлов — 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-7c646474c9-4dmjl  1/1    Running  0         128m
    coredns-7c646474c9-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 в соответствии с новыми параметрами.

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

Измените размер кластера

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

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)
...

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

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

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

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

kubectl get pods -n kube-system

Результат:

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

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

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

Чтобы разрешить уменьшение числа узлов, сконфигурируйте для них объект 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.

Чтобы удалить инфраструктуру, созданную с помощью Terraform:

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

  2. Удалите конфигурационный файл k8s-cluster.tf.

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

    terraform validate
    

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

  4. Подтвердите изменение ресурсов.

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

      terraform plan
      

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

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

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

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

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

    Все ресурсы, которые были описаны в конфигурационном файле k8s-cluster.tf, будут удалены.

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

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Настройте kube-dns-autoscaler
  • Убедитесь, что приложение работает
  • Определите параметры масштабирования
  • Измените конфигурацию
  • Проверьте масштабирование
  • Измените размер кластера
  • Проверьте изменения в количестве реплик CoreDNS
  • Настройте уменьшение количества узлов
  • Отключите масштабирование
  • Удалите созданные ресурсы