虽然启用了自动缩放,但节点池不会将其节点大小减小为零

时间:2018-04-18 15:48:44

标签: kubernetes google-cloud-platform gcloud google-kubernetes-engine

我创建了两个节点池。一个小的用于所有谷歌系统工作,一个较大的一个用于我的任务。较大的一个应该在工作完成后将其大小减小到0。

  

问题是:即使没有cron作业,节点池也不会   将他的体型缩小到0。

创建群集:

gcloud beta container --project "projectXY" clusters create "cluster" --zone "europe-west3-a" --username "admin" --cluster-version "1.9.6-gke.0" --machine-type "n1-standard-1" --image-type "COS" --disk-size "100" --scopes "https://www.googleapis.com/auth/cloud-platform" --num-nodes "1" --network "default" --enable-cloud-logging --enable-cloud-monitoring --subnetwork "default" --enable-autoscaling --enable-autoupgrade --min-nodes "1" --max-nodes "1"

创建节点池:

在完成所有任务后,节点池应将其大小减小为0.

gcloud container node-pools create workerpool --cluster=cluster --machine-type="n1-highmem-8", -m "n1-highmem-8" --zone=europe-west3-a, -z europe-west3-a --disk-size=100 --enable-autoupgrade --num-nodes=0 --enable-autoscaling --max-nodes=2 --min-nodes=0

创建cron作业:

kubectl create -f cronjob.yaml

2 个答案:

答案 0 :(得分:3)

从Google Documentation引用

  

"注意:从Kubernetes 1.7版开始,您可以为节点池指定最小大小为零。如果运行工作负载不需要实例,则允许您的节点池完全缩小。但是,虽然节点池可以扩展到零大小,但整个群集大小不会缩减到零节点(因为始终需要至少一个节点来运行系统Pod)。"

另请注意:

  

"群集自动规划器还根据节点池的总容量需求来衡量每个节点的使用情况。如果某个节点在一段时间内没有安排新Pod,并且 [此选项对您不起作用,因为它是最后一个节点] 可以安排在该节点上运行的所有Pod在池中的其他节点上,自动缩放器移动Pod并删除节点。

     

请注意,群集自动缩放器基于Pod资源请求工作,即Pod已请求的资源数量。群集自动缩放器不会考虑Pod正在使用的资源。从本质上讲,集群自动调节器信任您提供的Pod资源请求是准确的,并根据该假设在节点上调度Pod。"

因此我会检查:

  • 您的Kubernetes群集版本至少为1.7
  • 最后一个节点上没有运行pod(检查每个命名空间,必须在每个节点上运行的pod都不计算:fluentd,kube-dns,kube-proxy),没有cronjobs的事实是
  • 对于相应的托管实例组,自动缩放器 NOT 已启用,因为它们是不同的工具
  • 在任何仍然分配给该节点的奇怪状态中没有任何pod被卡住
  • 群集中没有等待安排的广告

如果仍然存在自动缩放器的所有问题,您可以打开private issue指定您的项目ID,因为社区可以做的事情不多。

如果您对评论感兴趣,问题跟踪器和我的链接将会查看您的项目(我为Google云平台支持工作)

答案 1 :(得分:0)

我遇到了同样的问题,并测试了许多不同的情况。最后,通过执行以下操作使它起作用:

  1. 创建初始大小为1而不是0的节点池:

    gcloud container node-pools create ${NODE_POOL_NAME} \
      --cluster ${CLUSTER_NAME} \
      --num-nodes 1 \
      --enable-autoscaling --min-nodes 0 --max-nodes 1 \
      --zone ${ZONE} \
      --machine-type ${MACHINE_TYPE}
    
  2. 以与此类似的方式配置CronJob:

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: cronjob800m
    spec:
      schedule: "7 * * * *"
      concurrencyPolicy: Forbid
      failedJobsHistoryLimit: 0
      successfulJobsHistoryLimit: 0
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: cronjob800m
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
                resources:
                  requests:
                    cpu: "800m"
              restartPolicy: Never
    

    请注意,资源的设置方式只能在大型节点池上运行作业,而不能在小型节点池上运行。还要注意,我们将failedJobsHistoryLimitsuccessfulJobsHistoryLimit都设置为0,以便在成功/失败后自动从节点池中清除作业。

应该的。