Настройка автомасштабирования
Для Managed Service for Kubernetes доступны три способа автоматического масштабирования:
- Автоматическое масштабирование кластера.
- Горизонтальное автомасштабирование подов.
- Вертикальное автомасштабирование подов.
Перед началом работы
-
Создайте кластер Managed Service for Kubernetes любой подходящей конфигурации.
-
Установите kubectl
и настройте его на работу с созданным кластером.
Настройка автоматического масштабирования кластера
Важно
Автоматическое масштабирование этого типа можно включить только при создании группы узлов Managed Service for Kubernetes.
Чтобы создать автомасштабируемую группу узлов Managed Service for Kubernetes:
Создайте группу узлов Managed Service for Kubernetes со следующими параметрами:
- Тип масштабирования:
Автоматический
. - Минимальное кол-во узлов: укажите количество узлов Managed Service for Kubernetes, которое должно оставаться в группе при минимальной нагрузке.
- Максимальное кол-во узлов: укажите максимально допустимое количество узлов Managed Service for Kubernetes в группе.
- Начальное кол-во узлов: количество узлов Managed Service for Kubernetes, которые следует создать вместе с группой (должно быть не меньше минимального и не больше максимального количества узлов в группе).
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Изучите команду создания группы узлов Managed Service for Kubernetes:
yc managed-kubernetes node-group create --help
-
Создайте автомасштабируемую группу узлов Managed Service for Kubernetes:
yc managed-kubernetes node-group create \ ... --auto-scale min=<минимальное_количество_узлов>, max=<максимальное_количество_узлов>, initial=<начальное_количество_узлов>
-
Terraform
позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.Terraform распространяется под лицензией Business Source License
, а провайдер Yandex Cloud для Terraform — под лицензией MPL-2.0 .Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
или в зеркале .Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Откройте актуальный конфигурационный файл Terraform с описанием группы узлов.
О том, как создать такой файл, см. в разделе Создание группы узлов.
-
Добавьте описание новой группы узлов, указав настройки автомасштабирования в блоке
scale_policy.auto_scale
:resource "yandex_kubernetes_node_group" "<имя_группы_узлов>" { ... scale_policy { auto_scale { min = <минимальное_количество_узлов_в_группе> max = <максимальное_количество_узлов_в_группе> initial = <начальное_количество_узлов_в_группе> } } }
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
-
Выполните команду:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
-
Подтвердите изменение ресурсов.
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
-
Управление Cluster Autoscaler выполняется на стороне сервиса Managed Service for Kubernetes.
Подробнее о Cluster Autoscaler см. в разделе Автоматическое масштабирование кластера. Параметры, используемые по умолчанию, приведены в документации Kubernetes
См. также раздел Вопросы и ответы про автоматическое масштабирование группы узлов в Managed Service for Kubernetes.
Настройка горизонтального автомасштабирования подов
-
Создайте Horizontal Pod Autoscaler для вашего приложения, например:
kubectl autoscale deployment/<имя_приложения> --cpu-percent=50 --min=1 --max=3
Где:
--cpu-percent
— желаемая нагрузка пода Managed Service for Kubernetes на vCPU.--min
— минимальное количество подов Managed Service for Kubernetes.--max
— максимальное количество подов Managed Service for Kubernetes.
-
Проверьте состояние Horizontal Pod Autoscaler:
kubectl describe hpa/<имя_приложения>
Подробнее о Horizontal Pod Autoscaler см. в разделе Горизонтальное автомасштабирование подов.
Настройка вертикального автомасштабирования подов
-
Установите Vertical Pod Autoscaler из репозитория
:cd /tmp && \ git clone https://github.com/kubernetes/autoscaler.git && \ cd autoscaler/vertical-pod-autoscaler/hack && \ ./vpa-up.sh
-
Создайте конфигурационный файл
vpa.yaml
для вашего приложения:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: <имя_приложения> spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: <имя_приложения> updatePolicy: updateMode: "<режим_работы_VPA>"
Где
updateMode
— режим работы Vertical Pod Autoscaler:Auto
илиOff
. -
Создайте Vertical Pod Autoscaler для вашего приложения:
kubectl apply -f vpa.yaml
-
Проверьте состояние Vertical Pod Autoscaler:
kubectl describe vpa <имя_приложения>
Подробнее о Vertical Pod Autoscaler см. в разделе Вертикальное автомасштабирование подов.
Удаление подов в статусе Terminated
Иногда во время автоматического масштабирования поды узлов Managed Service for Kubernetes не удаляются, а остаются в статусе Terminated. Это происходит из-за того, что контроллер Pod garbage collector (PodGC)
Вы можете удалить зависшие поды Managed Service for Kubernetes:
Вручную
Выполните команду:
kubectl get pods --all-namespaces | grep -i Terminated \
| awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
Автоматически с помощью CronJob
Чтобы автоматически удалять зависшие поды Managed Service for Kubernetes:
Если CronJob больше не нужен, удалите его.
Настройка автоматического удаления в CronJob
-
Создайте файл
cronjob.yaml
со спецификацией для CronJob и ресурсов, необходимых для его выполнения:--- apiVersion: batch/v1 kind: CronJob metadata: name: terminated-pod-cleaner spec: schedule: "*/5 * * * *" jobTemplate: spec: template: spec: serviceAccountName: terminated-pod-cleaner containers: - name: terminated-pod-cleaner image: bitnami/kubectl imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c"] args: ["kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs --no-run-if-empty -n2 kubectl delete pod -n"] restartPolicy: Never --- apiVersion: v1 kind: ServiceAccount metadata: name: terminated-pod-cleaner --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: terminated-pod-cleaner rules: - apiGroups: [""] resources: - pods verbs: [list, delete] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: terminated-pod-cleaner subjects: - kind: ServiceAccount name: terminated-pod-cleaner namespace: default roleRef: kind: ClusterRole name: terminated-pod-cleaner apiGroup: rbac.authorization.k8s.io
В строке
schedule: "*/5 * * * *"
задано расписание в cron-формате: выполнение задания каждые 5 минут. При необходимости измените интервал. -
Создайте CronJob и ресурсы:
kubectl create -f cronjob.yaml
Результат:
cronjob.batch/terminated-pod-cleaner created serviceaccount/terminated-pod-cleaner created clusterrole.rbac.authorization.k8s.io/terminated-pod-cleaner created clusterrolebinding.rbac.authorization.k8s.io/terminated-pod-cleaner created
-
Проверьте, что CronJob создался:
kubectl get cronjob terminated-pod-cleaner
Результат:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE terminated-pod-cleaner */5 * * * * False 0 <none> 4s
Через указанный в
SCHEDULE
интервал в столбцеLAST SCHEDULE
появится значение времени. Это означает, что задание было успешно выполнено или завершено с ошибкой.
Проверка результатов заданий CronJob
-
Получите список заданий:
kubectl get jobs
Результат:
NAME COMPLETIONS DURATION AGE <имя_задания> 1/1 4s 2m1s ...
-
Получите имя пода Managed Service for Kubernetes, в котором выполнялось задание:
kubectl get pods --selector=job-name=<имя_задания> --output=jsonpath={.items[*].metadata.name}
-
Просмотрите логи пода Managed Service for Kubernetes:
kubectl logs <имя_пода>
В логе будет список удаленных подов Managed Service for Kubernetes. Если лог пустой, подов Managed Service for Kubernetes в статусе Terminated на момент выполнения задания не было.
Удаление CronJob
Чтобы удалить CronJob и его ресурсы, выполните команду:
kubectl delete cronjob terminated-pod-cleaner && \
kubectl delete serviceaccount terminated-pod-cleaner && \
kubectl delete clusterrole terminated-pod-cleaner && \
kubectl delete clusterrolebinding terminated-pod-cleaner