Kubernetes 节点的预留资源

简介: Kubernetes 节点的预留资源

在 Kubernetes 中,运行多个集群节点是否存在隐形成本?

是的,因为并非 Kubernetes 节点中的所有 CPU 和内存都可用于运行 Pod。

在一个 Kubernetes 节点中,CPU 和内存分为:

  1. 操作系统
  2. Kubelet、CNI、CRI、CSI(+ 系统 daemons)
  3. Pods
  4. 驱逐阈值

Kubernetes 节点中的可分配资源

这些预留的资源取决于实例的大小,并且可能会增加相当大的开销。

让我们举一个简单的例子。

想象一下,你有一个具有单个 1GiB / 1vCPU 节点的集群。

以下资源是为 kubelet 和操作系统保留的:

  • 255MiB 内存。
  • 60m 的 CPU。

最重要的是,为驱逐阈值预留了 100MB。

那么总共有 25% 的内存和 6% 的 CPU 不能使用。

在 1GiB / 1vCPU Kubernetes 节点中,25% 的内存由 kubelet 保留

在云厂商中的情况又是如何?

EKS 有一些(有趣的?)限制。

让我们选择一个具有 2vCPU 和 8GiB 内存的 m5.large 实例。

AWS 为 kubelet 和操作系统保留了以下内容:

  • 574MiB 内存。
  • 70m 的 CPU。

这一次,你很幸运。

你可以使用大约 93% 的可用内存。

如果将 EKS 与 m5.large 节点一起使用,则可以使用 93% 的可用内存来运行 pod

但这些数字从何而来?

每个云厂商都有自己定义限制的方式,但对于 CPU,他们似乎都同意以下值:

  • 第一个核心的 6%。
  • 下一个核心的 1%(最多 2 个核心)。
  • 接下来 2 个核心的 0.5%(最多 4 个核心)。
  • 四核以上任何核的 0.25%。

至于内存限制,云厂商之间差异很大。

Azure 是最保守的,而 AWS 则是最不保守的。

Azure 中 kubelet 的预留内存为:

  • 前 4 GB 内存的 25%。
  • 4 GB 以下内存的 20%(最大 8 GB)。
  • 8 GB 以下内存的 10%(最大 16 GB)。
  • 下一个 112 GB 内存的 6%(最多 128 GB)。
  • 超过 128 GB 的任何内存的 2%。

这对于 GKE 是相同的,除了一个值:逐出阈值在 GKE 中为 100MB,在 AKS 中为 750MiB。

在 EKS 中,使用以下公式分配内存:

255MiB + (11MiB * MAX_NUMBER OF POD)

不过,这个公式提出了一些问题。

在前面的示例中,m5.large 保留了 574MiB 的内存。

这是否意味着 VM 最多可以有 (574–255) / 11 = 29 个 pod?

如果你没有在 VPC-CNI 中启用 prefix 前缀分配模式,这是正确的。

如果这样做,结果将大不相同。

对于多达 110 个 pod,AWS 保留:

  • 1.4GiB 内存。
  • (仍然)70m 的 CPU。

这听起来更合理,并且与其他云厂商一致。

如果你将 EKS 与 m5.large 节点和前缀分配模式一起使用,则 kubelet 会保留 1.4GiB 的内存

让我们看看 GKE 进行比较。

对于类似的实例类型(即 n1-standard-2,7.5GB 内存,2vCPU),kubelet 的预留如下:

  • 1.7GB 内存。
  • 70m 的 CPU。

如果你将 GKE 与 n1-standard-2 节点一起使用,则 kubelet 会保留 1.7GiB 的内存

换句话说,23% 的实例内存无法分配给运行的 Pod。

如果实例每月花费 48.54 美元,那么你将花费 11.16 美元来运行 kubelet。

其他云厂商呢?

你如何检查这些值?

我们构建了一个简单的工具来检查 kubelet 的配置并提取相关细节。

你可以在这里找到它:https://github.com/learnk8s/kubernetes-resource-inspector

如果你有兴趣探索更多关于节点大小的信息,我们还构建了一个简单的实例计算器,你可以在其中定义工作负载的大小,它会显示适合该大小的所有实例(及其价格)。

https://learnk8s.io/kubernetes-instance-calculator

我希望你喜欢这篇关于 Kubernetes 资源预留的短文;在这里,你可以找到更多链接以进一步探索该主题。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
8月前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
借助阿里云ACK One注册集群,充分利用阿里云强大ACS GPU算力,实现DeepSeek推理模型高效部署。
|
Kubernetes API 调度
k8s中节点无法启动Pod
【10月更文挑战第3天】
415 6
|
7月前
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
480 17
|
7月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
242 12
|
8月前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
198 3
|
存储 Kubernetes Docker
Kubernetes节点资源耗尽状态的处理
Kubernetes节点资源耗尽状态的处理
|
9月前
|
弹性计算 运维 Kubernetes
使用ACK Edge统一管理多地域的ECS资源
本文介绍如何使用ACK Edge来管理分布在多个地域的ECS资源。
|
8月前
|
弹性计算 运维 Kubernetes
使用ACK Edge统一管理多地域的ECS资源
使用ACK Edge统一管理多地域的ECS资源
102 0
|
8月前
|
存储 Kubernetes 对象存储
部署 DeepSeek 但 GPU 不足,ACK One 注册集群助力解决 IDC GPU 资源不足
部署 DeepSeek 但 GPU 不足,ACK One 注册集群助力解决 IDC GPU 资源不足
|
12月前
|
JSON 运维 Kubernetes

热门文章

最新文章

推荐镜像

更多