启用自动缩放后,GKE 不会缩放 to/from 0
GKE does not scale to/from 0 when autoscaling enabled
我想 运行 我的 GKE 上的 CronJob 以便每天执行批处理操作。理想情况是我的集群在作业未 运行ning 时扩展到 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
作业计划每小时 运行 并在终止前打印当前时间。
首先,我想创建具有 0 个节点的集群,但设置 --num-nodes 0
会导致错误。为什么会这样?请注意,我可以在创建集群后手动将集群缩减到 0 个节点。
其次,如果我的集群有 0 个节点,则不会安排作业,因为集群不会自动扩展到 1 个节点,而是会出现以下错误:
Cannot schedule pods: no nodes available to schedule pods.
第三,如果我的集群有 1 个节点,作业 运行 正常,但在那之后,集群不会缩减到 0 个节点,而是保持在 1 个节点。我让我的集群 运行 用于两个连续的作业,并且它没有在两者之间缩小。我假设一个小时应该足以让集群这样做。
我错过了什么?
编辑:我已经开始工作并详细说明了我的解决方案 here。
更新:
Note: Beginning with Kubernetes version 1.7, you can specify a minimum
size of zero for your node pool. This allows your node pool to scale
down completely if the instances within aren't required to run your
workloads.
https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler
旧答案:
不支持将整个集群扩展到 0,因为系统总是需要至少一个节点 pods:
您可以为系统 pods 创建一个带有小型机器的节点池,以及一个带有大型机器的额外节点池,您可以在其中 运行 处理您的工作负载。这样第二个节点池可以缩小到 0,而你仍然有 space 到 运行 系统 pods。
尝试后,@xEc 提到:另请注意,在某些情况下我的节点池无法扩展,例如我创建的初始大小为 0 而不是 1 的池。
初步建议:
也许你可以 运行 一个微型虚拟机,用 cron 来扩展集群,提交一个作业(而不是 CronJob),等待它完成,然后将它缩小到 0?
我认为针对此类工作调整 GKE 不是一个好主意。如果你真的需要 0 个实例,我建议你使用
- App Engine 标准环境,允许您将实例扩展到 0 (https://cloud.google.com/appengine/docs/standard/go/config/appref)
或者
- Cloud Functions,它们是 'instanceless'/无服务器的。您可以使用此非官方指南来触发您的 Cloud Functions (https://cloud.google.com/community/tutorials/using-stackdriver-uptime-checks-for-scheduling-cloud-functions)
我想 运行 我的 GKE 上的 CronJob 以便每天执行批处理操作。理想情况是我的集群在作业未 运行ning 时扩展到 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
作业计划每小时 运行 并在终止前打印当前时间。
首先,我想创建具有 0 个节点的集群,但设置 --num-nodes 0
会导致错误。为什么会这样?请注意,我可以在创建集群后手动将集群缩减到 0 个节点。
其次,如果我的集群有 0 个节点,则不会安排作业,因为集群不会自动扩展到 1 个节点,而是会出现以下错误:
Cannot schedule pods: no nodes available to schedule pods.
第三,如果我的集群有 1 个节点,作业 运行 正常,但在那之后,集群不会缩减到 0 个节点,而是保持在 1 个节点。我让我的集群 运行 用于两个连续的作业,并且它没有在两者之间缩小。我假设一个小时应该足以让集群这样做。
我错过了什么?
编辑:我已经开始工作并详细说明了我的解决方案 here。
更新:
Note: Beginning with Kubernetes version 1.7, you can specify a minimum size of zero for your node pool. This allows your node pool to scale down completely if the instances within aren't required to run your workloads.
https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler
旧答案:
不支持将整个集群扩展到 0,因为系统总是需要至少一个节点 pods:
您可以为系统 pods 创建一个带有小型机器的节点池,以及一个带有大型机器的额外节点池,您可以在其中 运行 处理您的工作负载。这样第二个节点池可以缩小到 0,而你仍然有 space 到 运行 系统 pods。
尝试后,@xEc 提到:另请注意,在某些情况下我的节点池无法扩展,例如我创建的初始大小为 0 而不是 1 的池。
初步建议:
也许你可以 运行 一个微型虚拟机,用 cron 来扩展集群,提交一个作业(而不是 CronJob),等待它完成,然后将它缩小到 0?
我认为针对此类工作调整 GKE 不是一个好主意。如果你真的需要 0 个实例,我建议你使用
- App Engine 标准环境,允许您将实例扩展到 0 (https://cloud.google.com/appengine/docs/standard/go/config/appref) 或者
- Cloud Functions,它们是 'instanceless'/无服务器的。您可以使用此非官方指南来触发您的 Cloud Functions (https://cloud.google.com/community/tutorials/using-stackdriver-uptime-checks-for-scheduling-cloud-functions)