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 2

2 ответа:

Масштабирование всего кластера до 0 не поддерживается, поскольку для системных модулей всегда требуется хотя бы один узел:

См. docs

Можно создать один пул узлов с небольшой машиной для системных модулей и дополнительный пул узлов с большой машиной, на которой будет выполняться рабочая нагрузка. Таким образом, второй пул узлов может уменьшиться до 0, и у вас все еще есть место для запуска системных модулей.

После попытки, @xEc упоминает: Также обратите внимание, что есть сценарии в который мой пул узлов не будет масштабироваться, например, если я создам пул с начальным размером 0 вместо 1.

-- старое предложение Беллоу

Возможно, вы могли бы запустить микро-виртуальную машину с cron для масштабирования кластера, отправить задание (вместо CronJob), дождаться его завершения и затем масштабировать его обратно до 0?

Я не думаю, что это хорошая идея, чтобы настроить GKE для такого рода работы. Если вам действительно нужно 0 экземпляров, я бы предложил вам использовать либо

  1. стандартная среда App Engine, которая позволяет масштабировать экземпляры до 0 (https://cloud.google.com/appengine/docs/standard/go/config/appref ) или
  2. облачные функции, они все равно "без инстансов" /без серверов. Вы можете использовать это неофициальное руководство для запуска ваших облачных функций (https://cloud.google.com/community/tutorials/using-stackdriver-uptime-checks-for-scheduling-cloud-functions)