AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1002886
Accepted
tacos_tacos_tacos
tacos_tacos_tacos
Asked: 2020-02-13 19:15:34 +0800 CST2020-02-13 19:15:34 +0800 CST 2020-02-13 19:15:34 +0800 CST

Kubernetes 节点池不会自动缩放到 0 个节点

  • 772

我有一个相当昂贵的工作负载,一些同事有时需要在工作日运行(而不是按照任何设定的时间表)。我使用谷歌云 Kubernetes。

它由三个 statefulsets 组成,每个 statefulsets 有一个副本。

我已经指导他们如何“打开”和“关闭”它。为了“打开”它,他们将每个 statefulset 扩展到 1 个副本。为了“关闭”它,他们将每个 statefulset 扩展为 0 个副本。

最初,我有一个默认大小为三个节点的自动缩放节点池(每个状态集几乎消耗整个节点的 CPU 和 RAM)。我观察到,即使在缩小到 0 之后,一两个小时后至少会保留一个(有时是两个)节点。我期待最终所有节点都会消失,但这并没有发生。

我注意到正在运行的节点仍然有一些 pod,只是在不同的命名空间中。其余的 pod 都在kube-system命名空间中,除了一个在custom-metrics命名空间中。

所以我想,好吧——即使没有用户定义的工作负载/pod,Kubernetes 也可能想要运行其他服务。所以我创建了另一个节点池,有一个非常小但足够的节点。该节点足够大,可以运行 Kubernetes 报告在那些非default命名空间中运行的所有内容。

在新节点池与一个节点一起运行后,我继续手动将原始节点池的大小调整为 0。这很好。我希望此时我有一个用于运行kube-system和其他东西的“系统”节点池,以及一个用于运行我自己的东西的“用户”节点池。

所以对于我的下一个测试,这次我只扩展了一个 statefulset 副本。最终一个节点上线,statefulset pod 正在运行/准备就绪。然后我再次将其缩小到 0 并等待......等待......并且节点没有消失。

使自动缩放节点池实际达到 0 个节点需要什么?显然我遗漏了一些东西(或更多东西),但我很难找到有关触发节点缩放器将节点池缩小到 0 所需的信息。

任何建议表示赞赏。

附加信息

当我查看节点池中的节点上运行的内容时,我想转到 0,这就是我看到的

  Namespace                  Name                                                   CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                                                   ------------  ----------  ---------------  -------------  ---
  kube-system                fluentd-gcp-v3.1.1-mfkxf                               100m (0%)     1 (3%)      200Mi (0%)       500Mi (0%)     28m
  kube-system                kube-proxy-gke-tileperformance-pool-1-14d3671d-jl76    100m (0%)     0 (0%)      0 (0%)           0 (0%)         28m
  kube-system                prometheus-to-sd-htvnw                                 1m (0%)       3m (0%)     20Mi (0%)        20Mi (0%)      28m

如果我尝试访问drain节点,它会抱怨它们是通过 管理的DaemonSet,所以我可以强制它,但显然我试图不必以任何方式手动干预。

哈克

为了让自动缩放器“工作”并缩小到 0,我暂时nodeSelector在所有kube-system部署中添加了一个,以便将它们分配到一个单独的池中kube-system。但必须有更好的方法,对吧?

kubernetes google-kubernetes-engine autoscaling
  • 2 2 个回答
  • 3243 Views

2 个回答

  • Voted
  1. Dawid Kruk
    2020-02-19T01:16:56+08:002020-02-19T01:16:56+08:00

    Autoscaler 不会将您的节点池减少到 0。

    注意:如果您指定最少零个节点,则空闲节点池可以完全缩减。但是,集群中必须始终至少有一个节点可用以运行系统 Pod。

    -- Google Cloud:Kubernetes 引擎集群自动扩缩器

    但是,集群自动扩缩器不能将整个集群完全缩减到零。集群中必须至少有一个节点始终可用以运行系统 pod。所以你需要至少保留一个节点。但这并不意味着您需要让一个昂贵的节点保持空闲状态。

    -- Medium.com:使用 gke autoscaler 将您的 kubernetes 集群扩展到几乎为零

    您可以使用以下命令将节点池显式减少为零 (0):

    $ gcloud container clusters resize CLUSTER_NAME --node-pool NAME_OF_THE_POOL --num-nodes 0

    但请注意,这种方法会有一个缺点。

    想象一种情况:

    • 使用上面的命令将集群缩小到零节点
    • 您在具有零节点的集群上创建工作负载

    Autoscaler 将无法从零增加节点数。它无法判断是否需要额外的资源。在这些节点上运行的 podkube-system对于确定是否需要另一个节点至关重要。

    有一篇文章的用例与您的相似。请看一下:Medium.com:使用 gke autoscaler 将您的 kubernetes 集群扩展到几乎为零

    另一种方法是使用 pod 中断预算。请查看以下资源:

    • Kubernetes.io:中断
    • Kubernetes.io:中断预算如何运作。
    • Kubernetes.io:配置 pod 中断预算

    可能阻止集群自动扩缩程序删除节点的可能原因:

    • 具有限制性 PodDisruptionBudget 的 Pod。
    • Kube 系统 pod:
      • 默认不在节点上运行,
      • 没有 设置pod 中断预算 ,或者他们的 PDB 过于严格(自 CA 0.6 起)。
    • 不受控制器对象支持的 Pod(因此不是由部署、副本集、作业、有状态集等创建的)。
    • 具有本地存储的 Pod。
    • 由于各种限制(缺乏资源、不匹配的节点选择器或亲和性、匹配的反亲和性等)而无法移动到其他地方的 Pod
    • 具有以下注释集的 Pod: "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

    除非 pod 具有以下注解(CA 1.0.3 或更高版本支持):

    "cluster-autoscaler.kubernetes.io/safe-to-evict": "true"

    -- Github.com:Kubernetes autoscaler:哪些类型的 pod 可以阻止 ca 移除节点

    如果它们正在运行不应驱逐的 pod,CA 不会删除未充分利用的节点

    不按比例缩小的其他可能原因:

    • 节点组已经具有最小大小,
    • 尝试删除此特定节点失败,在这种情况下,Cluster Autoscaler 将额外等待 5 分钟,然后再考虑将其删除,

    -- Github.com:我有几个节点利用率很低,但它们没有按比例缩小,为什么

    • 2
  2. Best Answer
    Vincent Yin
    2020-12-13T18:10:44+08:002020-12-13T18:10:44+08:00

    在 GKE 1.18 上,我的实验表明我必须添加节点污染才能使节点池能够缩小到零:

    $ gcloud container node-pools create ... \
          --min-nodes 0 \
          --max-nodes 2 \
          --node-taints=...  # Without a taint, my node pool won't scale down to zero somehow.
    
    • 1

相关问题

  • 无法通过 Docker 在本地运行 Hyperkube (kubernetes)

  • 跨 Kubernetes 分散工作负载

  • Kubernetes升级回滚机器类型

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve