Автоматическое масштабирование DNS по размеру кластера
В Managed Service for Kubernetes поддерживается автоматическое масштабирование сервиса DNS. В кластере Managed Service for Kubernetes работает приложение kube-dns-autoscaler
, которое регулирует количество реплик CoreDNS в зависимости от:
- Количества узлов в кластере.
- Количества ядер (vCPU) в кластере.
Количество реплик рассчитывается с помощью формул.
Чтобы автоматизировать масштабирование DNS:
Если автоматическое масштабирование потеряло актуальность, отключите его.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Создайте ресурсы Kubernetes:
ВручнуюС помощью Terraform-
Создайте кластер Managed Service for Kubernetes с настройкой Публичный адрес:
Автоматически
. -
Создайте группу узлов любой подходящей конфигурации.
-
Настройте группы безопасности кластера и группы узлов. Группа безопасности кластера должна разрешать входящие подключения к портам
443
и6443
.
-
Если у вас еще нет Terraform, установите его.
-
Скачайте файл с настройками провайдера. Поместите его в отдельную рабочую директорию и укажите значения параметров.
-
Скачайте в ту же рабочую директорию файл конфигурации кластера k8s-cluster.tf. В файле описаны:
- Сеть.
- Подсеть.
- Группа безопасности по умолчанию и правила, необходимые для работы кластера Managed Service for Kubernetes:
- Правила для служебного трафика.
- Правила для доступа к API Kubernetes и управления кластером с помощью
kubectl
(через порты 443 и 6443).
- Кластер Managed Service for Kubernetes.
- Группа узлов Managed Service for Kubernetes.
- Сервисный аккаунт, необходимый для создания кластера и группы узлов Managed Service for Kubernetes.
-
Укажите в файле конфигурации идентификатор каталога.
-
Выполните команду
terraform init
в директории с конфигурационными файлами. Эта команда инициализирует провайдер, указанный в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.
-
-
-
Установите 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.
Измените конфигурацию
-
Проверьте текущие параметры.
В этом примере создана группа узлов
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
- Количество узлов —
-
Задайте новые параметры.
Измените конфигурацию следующим образом:
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:
-
В терминале перейдите в директорию с планом инфраструктуры.
-
Удалите конфигурационный файл
k8s-cluster.tf
. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Подтвердите изменение ресурсов.
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Все ресурсы, которые были описаны в конфигурационном файле
k8s-cluster.tf
, будут удалены. -