Skip to main content

Command Palette

Search for a command to run...

Kubernetes 集群规模杂谈

Updated
2 min read

节点数量

早在 Kubernetes 1.2 时候,就已经宣布达到 1000 节点的规模了,在 1.6 版本更达到了 5000 节点的规模。各大厂也都有了各自的超大规模单一集群。然而普罗大众的情况是如何呢? Sysdig 在 2019 年度容器应用报告中得到的结果是,大于 50 节点规模的集群不足 10%,另外一个佐证是 Mohamed Ahmed 的一篇调查报告中也提供了类似的数据。这种情况的一种解释是,目前的应用阶段还比较早期,处于试探期间;然而从一个侧面来说,Sysdig 的调研对象针对的是生产应用,也就是说处于生产应用状态下的集群,绝大多数都是这种小规模集群。根据对 CNCF Landscape 中 Distribution 分类的产品的抽查,也可以看到随处可见的 Kubernetes As Service 类似功能的实现,这也证实了小集群协作方案的落地趋势。相对于少量大集群,多个小集群的差异在于:

隔离程度高

虽然现在存在不少沙箱容器实现,然而最易用的、生态最为成熟的方案还是 Docker为代表的传统容器方案,传统容器方案所缺失的隔离能力,通过多租户多集群方式是一个非常自然的思路。

实现难度低

国内几个大厂都有自己的大规模 Kubernetes 集群实现方式,然而通常需要对基础组件大动干戈,甚至不惜使用无法回流社区的孤岛版本,虽然部分大企业的研究院等相关部门已经具备了非常强的研发实力,然而对于通常的 To B 场景来说,这并不是一个合适的选择。

运管成本高

多个集群很明显会需要更多的运维和管理人力的投入。

资源利用率低

多个集群都会有自己的 Master 组件、ETCD 集群、网络组件等,这些都会抢占更多原本属于工作负载的系统资源,客观上降低了资源的总体利用率。

节点尺寸

目前很多 Kubernetes 系统都会使用虚拟机来做为节点。那么虚拟机的资源是多分还是少分呢?下表是一个简单的对比:

大节点小节点备注
节点数量同样的资源总量情况下,相对来说小资源节点会得到更多的数量。
运维成本通常情况下,节点的运维成本是和节点数量正相关的。
容错能力较大的节点上通常会集中较多的应用,因此在节点出现故障时,可能会带来更大的损失。
资源粒度单节点资源较大,因此其资源粒度也较大。
应用副本数同一应用的多个副本,如果调度到同一个节点上的话,对于提高其负载能力和健壮性来说并无裨益。
副本规模毫无疑问,具备更多资源的大节点,能够运行更大资源需求范围的容器应用。
系统开销每个虚拟机都会有自己的操作系统、网络等基础开销,因此相对于少量大节点来说,大量的小节点会消耗更多的资源。
虚拟机分配难度过大的节点资源需求,如果采用虚拟机分配,就需要有更大规模的物理机提供支持。

除了这些原则性的条目之外,更重要的决策依据就是运行在集群上的应用需求。例如某租户的集群需要支撑 20 个应用,共 300 个 Pod,按照常见的每节点 30-50 Pod 的分布,就需要 6-10 个运算节点(Node)。以 10 节点算,加入系统保留、冗余等计算,可能需要 10 * 120G 的虚拟机实例;然而考虑到故障情况——一个节点的故障,最好的结果也是短期内降低 10% 的算力。如果扩张到 40 个 32G 的虚拟机节点,会大幅降低单节点故障的影响——当然也会提高网络的复杂性和效率要求。

应用资源

Java 应用是特别常见的迁移案例,除掉微服务化、网格、分布式等改造要求之外,资源的申请和限制是一个必须要面对的门槛。requests 是个用于调度的定义,Kubernetes 根据这个要求来选择能够满足要求的节点来分配应用;而 limits 则会用于触发 OOM。

众所周知的是,Java 的早期版本是无法识别容器内的内存限制的,因此如果没有限制堆内存上限,又开启了 limits,就会被 Kubernetes 杀掉。因此针对容器中运行的情况,需要进行一些启动参数的设置。

如果允许更新到新版本的 JVM,可以使用新引入的 UseCGroupMemoryLimitForHeap、MaxRAMFraction 参数,让 JVM 直接继承容器的定义。

如果无法直接升级,那么就有必要设置 xmx 和 xms 参数了,这里有几个小建议:

  • xmx 和 xms,request 和 limits 建议设成一致,能省掉很多麻烦。
  • tmpfs、filemapping 等都是可能的内存大户。
  • JVM 并不是唯一的内存消耗者,一般建议 Limit 大于 XMX 25% 以上。
  • /sys/fs/cgroup/memory/memory.stat 是你的好朋友。

Kubernetes 中的 CPU 和内存

Kubernetes 集群中的资源,主要关注的是 CPU 和内存两种。Pod 的定义中会定义对资源需求的声明,声明方式分为 Request 和 Limit。

Request 是一个调度参数,可以理解为基本需求:一个 Pod 中的所有容器的 Request 之和,就是 Pod 对资源的最小需求,调度器根据这个最小需求来选择具备条件的节点,在其上运行被调度的 Pod。

Limit 是一个安全参数,它的值一定大于 Request,顾名思义,它声明的是上限:

CPU是弹性资源,如果容器使用CPU达到Limit,就无法进一步提高运算能力,可能会导致运算速度无法满足需求。

  • Memory 是非弹性资源,如果容器使用 Memory 达到 Limit,就会触发 cgroup 的 OOM 事件,导致容器被杀死。

综上所述,Memory超限会对业务产生更大伤害,那么是不是不设限会更安全?答案很显然是否定的:

  • 不设置 Limit,一旦引发系统 OOM 或者驱逐事件,宏观来看,都会导致一个不可预知的结果。
  • 不设置 Request,Kubernetes 调度器会失去重要的调度标准,会影响负载分布的准确性。

一般来说如果 Limit 大于 Request(称为 Burstable),Kubernetes 会根据 Request 将 Pod 调度到满足 Request 要求的节点上去,然而一旦内存消耗从 Request 向着 Limit 增长的过程中出现了节点内存不足的情况,仍然会引发驱逐问题,因此对于保障级别高的业务,我们强烈建议将 Limit 设置为和 Request 相等。

副本和节点数量

目前 Kubernetes 的主流网络模型是基于 iptables 的,很显然 Service、Endpoint 和 Pod 并非越多越好。

而对于应用来说更多的副本数往往意味着更好的容错能力——同样损失一个副本,越多总数意味着业务损失越小。

参考资料

  • https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

  • https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/

  • https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/

  • https://dig.sysdig.com/c/pf-2019-container-usage-report?x=u_WFRi&mkt_tok=eyJpIjoiWW1GbVptUmtOakk1T1RVNCIsInQiOiJCUitxTXpSYUpXbVJOUDBUK09sbDh4aDVDNkZURHFXK0UwdUNEbkp6UG43XC9VamJIbm9obzJ6MDdcL3EwYXRHS0dTMVdrQXlJaEZDUFd5WnE0WUpXa1ZNVHZyRFkrYjlTNmhwb3d4cFk0alBSOHBqY09mY0pkaDV1VkZCeCtOaHpnIn0%3D

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts