Автоматическое масштабирование DNS по размеру кластера
В Managed Service for Kubernetes поддерживается автоматическое масштабирование сервиса DNS. В кластере Managed Service for Kubernetes работает приложение kube-dns-autoscaler, которое регулирует количество реплик CoreDNS в зависимости от:
- Количества узлов в кластере Managed Service for Kubernetes.
- Количества ядер (vCPU) в кластере Managed Service for Kubernetes.
Количество реплик рассчитывается с помощью формул.
Чтобы автоматизировать масштабирование DNS:
Если автоматическое масштабирование потеряло актуальность, отключите его.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
В стоимость поддержки описываемого решения входят:
- Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
- Плата за каждую ВМ (узлы кластера и ВМ для управления кластером без публичного доступа): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
- Плата за публичный IP-адрес для узлов кластера (см. тарифы Virtual Private Cloud).
Перед началом работы
- 
Создайте ресурсы Managed Service for Kubernetes: ВручнуюTerraform- 
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов. Важно От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений. 
- 
Создайте кластер Managed Service for Kubernetes. При создании укажите группы безопасности, подготовленные ранее. Если вы планируете работать с кластером в пределах сети Yandex Cloud, выделять кластеру публичный IP-адрес не нужно. Для подключений извне предоставьте кластеру публичный адрес. 
- 
Создайте группу узлов. Выделите ей публичный адрес, чтобы предоставить доступ в интернет и возможность скачивать Docker-образы и компоненты. Укажите группы безопасности, подготовленные ранее. 
 - 
Если у вас еще нет Terraform, установите его. 
- 
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера. 
- 
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его - 
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле. 
- 
Скачайте в ту же рабочую директорию файл конфигурации кластера Managed Service for Kubernetes k8s-cluster.tf - 
Сеть. 
- 
Кластер Managed Service for Kubernetes. 
- 
Группа узлов Managed Service for Kubernetes. 
- 
Сервисный аккаунт, необходимый для создания кластера и группы узлов Managed Service for Kubernetes. 
- 
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов. Важно От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений. 
 
- 
- 
Укажите в файле конфигурации идентификатор каталога. 
- 
Проверьте корректность файлов конфигурации Terraform с помощью команды: terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет. 
- 
Создайте необходимую инфраструктуру: - 
Выполните команду для просмотра планируемых изменений: terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены. 
- 
Если вас устраивают планируемые изменения, внесите их: - 
Выполните команду: terraform apply
- 
Подтвердите изменение ресурсов. 
- 
Дождитесь завершения операции. 
 
- 
 В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления - 
 
- 
- 
Установите kubectl Если для кластера не предоставлен публичный адрес и kubectlнастроен через внутренний адрес кластера, выполняйте командыkubectlна ВМ Yandex Cloud, находящейся в одной сети с кластером.
Настройте kube-dns-autoscaler
Убедитесь, что приложение работает
Проверьте Deploymentkube-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
Измените конфигурацию
- 
Проверьте текущие параметры. В этом примере создана группа узлов 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
- Количество узлов Managed Service for Kubernetes — 
- 
Задайте новые параметры. Измените конфигурацию следующим образом: - coresPerReplica:- 4.
- nodesPerReplica:- 2.
- preventSinglePointFailure:- true.
 replicas = max( ceil( 12 * 1/4 ), ceil( 3 * 1/2 ) ) = 3Чтобы передать параметры приложению kube-dns-autoscaler, отредактируйте соответствующий ConfigMapkubectl 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 с помощью команды:
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
Выполните команду:
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
По умолчанию Cluster Autoscaler не уменьшает количество узлов в группе узлов Managed Service for Kubernetes с автоматическим масштабированием, если на этих узлах присутствуют поды из пространства имен kube-system под управлением контроллеров репликаций приложений Deployment
Чтобы разрешить уменьшение числа узлов Managed Service for Kubernetes, сконфигурируйте для них объект PodDisruptionBudget
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
Отключите масштабирование
Обнулите количество реплик в Deploymentkube-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-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории. 
- 
Удалите ресурсы: - 
Выполните команду: terraform destroy
- 
Подтвердите удаление ресурсов и дождитесь завершения операции. 
 Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены. 
-