Автоматическое масштабирование DNS по размеру кластера
В Managed Service for Kubernetes поддерживается автоматическое масштабирование сервиса DNS. В кластере работает приложение kube-dns-autoscaler
под управлением контроллера Deployment. Приложение регулирует количество реплик CoreDNS по формулам в зависимости от:
- количества узлов в кластере;
- количества ядер (vCPU) в кластере.
В данном сценарии вы отредактируете конфигурацию kube-dns-autoscaler
и увидите изменения в ReplicaSet службы DNS.
Чтобы настроить масштабирование, выполните следующие действия:
Если не требуется изменять количество реплик CoreDNS соразмерно кластеру, отключите масштабирование.
Подготовьте окружение
-
Создайте ресурсы.
Для выполнения сценария вам понадобятся облачная сеть и подсеть, а также сервисный аккаунт. Вы можете использовать существующие ресурсы или создать новые.
Как создать ресурсы- Создайте облачную сеть.
- Создайте в облачной сети подсеть.
- Создайте сервисный аккаунт с ролью
editor
.
-
Создайте кластер Kubernetes и группу узлов.
Вы можете использовать уже работающий кластер и группу узлов Kubernetes или создать новые.
Как создать кластер Kubernetes и группу узловЕсли у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.-
Создайте кластер Kubernetes:
yc managed-kubernetes cluster create \ --name dns-autoscaler \ --service-account-name <имя сервисного аккаунта> \ --node-service-account-name <имя сервисного аккаунта> \ --public-ip \ --zone ru-central1-a \ --network-name <имя облачной сети>
Результат выполнения:
done (7m21s) ...
-
Создайте группу узлов:
yc managed-kubernetes node-group create \ --name node-group-1 \ --cluster-name dns-autoscaler \ --location zone=ru-central1-a \ --public-ip \ --fixed-size 3 \ --cores 4 \ --core-fraction 5
Результат выполнения:
done (2m43s) ...
-
-
Настройте kubectl.
Чтобы запускать команды для кластера Kubernetes, установите и настройте консоль управления kubectl.
Как настроить kubectl-
Установите Kubernetes CLI kubectl.
-
Добавьте учетные данные кластера Kubernetes в конфигурационный файл kubectl:
yc managed-kubernetes cluster get-credentials --external --name dns-autoscaler
Результат выполнения:
Context 'dns-autoscaler' was added as default to kubeconfig '/home/<ваш домашний каталог>/.kube/config'. ...
-
Настройте 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 (ступенчатая функция).
В режиме 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
Проследите изменения в службе DNS
Чтобы проверить количество реплик 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
...
Отключите масштабирование
Чтобы отключить масштабирование, обнулите количество реплик в 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
...