Автоматическое масштабирование 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, отредактируйте соответствующий 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 с помощью команды:
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-манифестах, будут удалены.
-