web-dev-qa-db-ja.com

自動スケーリングが有効になっている場合、GKEは0にスケーリングされません。

毎日バッチ操作を実行するために、GKEでCronJobを実行したいと思います。理想的なシナリオは、ジョブが実行されていないときにクラスターを0ノードにスケーリングし、スケジュールが満たされるたびに動的に1ノードにスケーリングしてジョブを実行することです。

私は最初に、現在の時刻のみを出力して終了する kubernetes ドキュメントにある単純なCronJobを使用してこれを達成しようとしています。

最初に、次のコマンドを使用してクラスターを作成しました。

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

ジョブは1時間ごとに実行され、終了する前に現在の時刻を出力するようにスケジュールされています。

まず、ノードが0のクラスターを作成したかったのですが、--num-nodes 0を設定するとエラーが発生します。なぜそうなのですか?クラスターの作成後、クラスターを手動で0ノードにスケールダウンできることに注意してください。

次に、クラスターに0ノードがある場合、クラスターは自動的に1ノードにスケーリングされないため、ジョブはスケジュールされませんが、代わりに次のエラーが発生します。

ポッドをスケジュールできません:ポッドをスケジュールするために使用できるノードがありません。

第3に、クラスターに1つのノードがある場合、ジョブは正常に実行されますが、その後、クラスターは0ノードにスケールダウンせず、代わりに1ノードのままになります。クラスターを2つの連続するジョブで実行させましたが、その間にスケールダウンしませんでした。クラスターがそうするのに1時間は十分な長さであると思います。

何が足りないのですか?

編集:私はそれを機能させ、私の解決策を詳しく説明しました ここ

8
xEc

更新:

注:Kubernetesバージョン1.7以降、ノードプールにゼロの最小サイズを指定できます。これにより、ワークロードを実行するために内部のインスタンスが必要ない場合に、ノードプールを完全にスケールダウンできます。

https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler


古い答え:

システムポッドには常に少なくとも1つのノードが必要なため、クラスター全体を0にスケーリングすることはサポートされていません。

ドキュメントを参照

システムポッド用の小さなマシンで1つのノードプールを作成し、ワークロードを実行する大きなマシンで追加のノードプールを作成できます。このようにして、2番目のノードプールを0にスケールダウンしても、システムポッドを実行するためのスペースがあります。

試行した後、@ xEcは次のように述べています:また、初期サイズが1ではなく0でプールを作成した場合のように、ノードプールがスケーリングしないシナリオがあることに注意してください。

最初の提案:

おそらく、cronを使用してマイクロVMを実行し、クラスターをスケールアップし、(CronJobの代わりに)ジョブを送信し、完了するのを待ってから、0にスケールダウンすることができますか?

3
Robert Lacok

この種の仕事のためにGKEを微調整するのは良い考えではないと思います。本当に0個のインスタンスが必要な場合は、どちらかを使用することをお勧めします

  1. インスタンスを0にスケーリングできるAppEngine標準環境( https://cloud.google.com/appengine/docs/standard/go/config/appref )または
  2. クラウド関数、とにかく「インスタンスレス」/サーバーレスです。この非公式ガイドを使用して、Cloud Functionsをトリガーできます( https://cloud.google.com/community/tutorials/using-stackdriver-uptime-checks-for-scheduling-cloud-functions
0
Andrey Bulezyuk