【问题标题】:Node pool does not reduce his node size to zero although autoscaling is enabled尽管启用了自动缩放,但节点池不会将其节点大小减少到零
【发布时间】:2018-09-28 22:42:38
【问题描述】:

我创建了两个节点池。一个用于所有 google 系统作业的小型作业,一个用于我的任务的较大作业。较大的应在作业完成后将其大小减小到 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

【问题讨论】:

  • 你知道最后的问题是什么吗?

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


【解决方案1】:

引用谷歌Documentation:

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

另请注意:

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

请注意,集群自动扩缩器的工作基于 Pod 资源请求,即您的 Pod 请求了多少资源。集群自动扩缩器不会考虑您的 Pod 正在积极使用的资源。本质上,集群自动扩缩器相信您提供的 Pod 资源请求是准确的,并根据该假设在节点上调度 Pod。”

因此我会检查:

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

如果仍然有可能是自动扩缩器的问题,您可以打开 private issue 向 Google 指定您的项目 ID,因为社区无能为力。

如果您对 cme​​ts 感兴趣,请查看问题跟踪器的链接,我会查看您的项目(我为 Google Cloud Platform Support 工作)

【讨论】:

    【解决方案2】:

    我遇到了同样的问题并测试了许多不同的场景。我终于通过执行以下操作使其工作:

    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,以便在成功/失败后自动从节点池中清除作业。

    应该是这样的。

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2020-07-10
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2022-01-14
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多