启用自动缩放时,GKE不会缩放到0或从0缩放

xEc*_*xEc 8 autoscaling google-cloud-platform kubernetes google-kubernetes-engine kubernetes-cronjob

我想在我的GKE上运行CronJob,以便每天执行批处理操作.理想的情况是我的集群在作业未运行时扩展到0个节点,并且每次满足计划时动态扩展到1个节点并在其上运行作业.

我首先尝试通过使用kubernetes doc 中的一个简单的CronJob来实现这一点,它只打印当前时间并终止.

我首先使用以下命令创建了一个集群:

gcloud container clusters create $CLUSTER_NAME \
    --enable-autoscaling \
    --min-nodes 0 --max-nodes 1 --num-nodes 1 \
    --zone $CLUSTER_ZONE
Run Code Online (Sandbox Code Playgroud)

然后,我创建了一个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
Run Code Online (Sandbox Code Playgroud)

作业计划每小时运行一次,并在终止前打印当前时间.

首先,我想创建具有0个节点的集群,但设置--num-nodes 0结果是错误的.为什么会这样?请注意,我可以在创建集群后手动将集群缩小到0个节点.

其次,如果我的群集有0个节点,则不会调度作业,因为群集不会自动扩展到1个节点,而是会出现以下错误:

无法安排pod:没有可用于安排pod的节点.

第三,如果我的集群有1个节点,则作业正常运行但在此之后,集群不会缩小到0个节点,而是保留1个节点.我让我的集群运行两个连续的工作,并没有在两者之间缩小.我假设一小时应该足够长,以便群集这样做.

我错过了什么?

Rob*_*cok 3

更新:

注意:从 Kubernetes 版本 1.7 开始,您可以将节点池的最小大小指定为零。如果不需要其中的实例来运行工作负载,这允许您的节点池完全缩小规模。

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


旧答案:

不支持将整个集群扩展到 0,因为系统 Pod 始终需要至少一个节点:

查看文档

您可以使用一台用于系统 Pod 的小型计算机创建一个节点池,并使用一台用于运行工作负载的大型计算机创建另一个节点池。这样,第二个节点池可以缩小到 0,并且您仍然有空间来运行系统 Pod。

尝试后,@xEc 提到: 另请注意,在某些情况下我的节点池无法扩展,例如我创建初始大小为 0 而不是 1 的池。

初步建议:

也许您可以运行一个微型虚拟机,使用 cron 来扩展集群,提交一个作业(而不是 CronJob),等待它完成,然后将其缩小到 0?