GKE не масштабируется до / от 0, если включено автоматическое масштабирование
Я хочу запустить CronJob на моем GKE для выполнения пакетной операции на ежедневной основе. Идеальным сценарием для моего кластера было бы масштабирование до 0 узлов, когда задание не выполняется, и динамическое масштабирование до 1 узла и запуск задания на нем каждый раз, когда выполняется расписание.
Я сначала пытаюсь достичь этого с помощью простого CronJob, найденного вKubernetes doc, который только печатает текущее время и завершает работу.
Я сначала создал кластер со следующим команда:
gcloud container clusters create $CLUSTER_NAME
--enable-autoscaling
--min-nodes 0 --max-nodes 1 --num-nodes 1
--zone $CLUSTER_ZONE
Затем я создал CronJob со следующим описанием:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: Never
Задание планируется выполнять каждый час и печатать текущее время перед завершением.
Во-первых, я хотел создать кластер с 0 узлами, но установка --num-nodes 0
приводит к ошибке. Почему это так? Обратите внимание, что я могу вручную уменьшить масштаб кластера до 0 узлов после его создания.
Во-вторых, если мой кластер имеет 0 узлов, задание не будет запланировано, потому что кластер делает это не масштабируется автоматически до 1 узла, но вместо этого выдает следующую ошибку:
Не удается запланировать модули: нет доступных узлов для планирования модулей.
В-третьих, если мой кластер имеет 1 узел, задание выполняется нормально, но после этого кластер не будет уменьшаться до 0 узлов, а останется с 1 узлом. Я позволил своему кластеру работать для двух последовательных заданий, и он не уменьшался между ними. Я предполагаю, что одного часа должно быть достаточно для кластера, чтобы сделать это.
Что я упускаю?
2 ответа:
Масштабирование всего кластера до 0 не поддерживается, поскольку для системных модулей всегда требуется хотя бы один узел:
Можно создать один пул узлов с небольшой машиной для системных модулей и дополнительный пул узлов с большой машиной, на которой будет выполняться рабочая нагрузка. Таким образом, второй пул узлов может уменьшиться до 0, и у вас все еще есть место для запуска системных модулей.
После попытки, @xEc упоминает: Также обратите внимание, что есть сценарии в который мой пул узлов не будет масштабироваться, например, если я создам пул с начальным размером 0 вместо 1.
-- старое предложение Беллоу
Возможно, вы могли бы запустить микро-виртуальную машину с cron для масштабирования кластера, отправить задание (вместо CronJob), дождаться его завершения и затем масштабировать его обратно до 0?
Я не думаю, что это хорошая идея, чтобы настроить GKE для такого рода работы. Если вам действительно нужно 0 экземпляров, я бы предложил вам использовать либо
- стандартная среда App Engine, которая позволяет масштабировать экземпляры до 0 (https://cloud.google.com/appengine/docs/standard/go/config/appref ) или
- облачные функции, они все равно "без инстансов" /без серверов. Вы можете использовать это неофициальное руководство для запуска ваших облачных функций (https://cloud.google.com/community/tutorials/using-stackdriver-uptime-checks-for-scheduling-cloud-functions)