毎日バッチ操作を実行するために、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時間は十分な長さであると思います。
何が足りないのですか?
編集:私はそれを機能させ、私の解決策を詳しく説明しました ここ 。
更新:
注: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にスケールダウンすることができますか?
この種の仕事のためにGKEを微調整するのは良い考えではないと思います。本当に0個のインスタンスが必要な場合は、どちらかを使用することをお勧めします