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