kubelet节点资源预留

目录
  • 一、Node Allocatable
    • 1、node资源预留
      • 1.1 为什么要做资源预留?
      • 1.2 node allocatable
        • 1.2.1 查看node节点资源
        • 1.2.2 确认node01节点资源
    • 2、 配置资源预留
      • 2.1 kube预留值
      • 2.2 systemReserved预留
      • 2.3 evictionHard预留
      • 2.4 整体配置
      • 2.5 重启服务
      • 2.6 Allocatable资源说明

一、Node Allocatable

1、node资源预留

1.1 为什么要做资源预留?

  1. Kubernetes 的节点可以按照节点的资源容量进行调度,默认情况下 Pod 能够使用节点全部可用容量。这样就会造成一个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程。除非为这些系统守护进程留出资源,否则它们将与 Pod 争夺资源并导致节点资源短缺问题。

  2. 当我们在线上使用 Kubernetes 集群的时候,如果没有对节点配置正确的资源预留,我们可以考虑一个场景,由于某个应用无限制的使用节点的 CPU 资源,导致节点上 CPU 使用持续100%运行,而且压榨到了 kubelet 组件的 CPU 使用,这样就会导致 kubelet 和 apiserver 的心跳出问题,节点就会出现 Not Ready 状况了。默认情况下节点 Not Ready 过后,5分钟后会驱逐应用到其他节点,当这个应用跑到其他节点上的时候同样100%的使用 CPU,是不是也会把这个节点搞挂掉,同样的情况继续下去,也就导致了整个集群的雪崩,集群内的节点一个一个的 Not Ready 了,后果是非常严重的,或多或少的人遇到过 Kubernetes 集群雪崩的情况,这个问题也是面试的时候镜像询问的问题。

  3. 要解决这个问题就需要为 Kubernetes 集群配置资源预留,kubelet 暴露了一个名为 Node Allocatable 的特性,有助于为系统守护进程预留计算资源,Kubernetes 也是推荐集群管理员按照每个节点上的工作负载来配置 Node Allocatable。

1.2 node allocatable

Kubernetes 节点上的 Allocatable 被定义为 Pod 可用计算资源量,调度器不会超额申请 Allocatable,目前支持 CPU, memory 和 ephemeral-storage 这几个参数。
image.png

1.2.1 查看node节点资源

我们可以通过 kubectl describe node 命令查看节点可分配资源的数据:
[root@master01 ~]# kubectl describe node node01
image.png
这段 Kubernetes 节点的配置信息描述了该节点的总容量(Capacity)和可分配资源(Allocatable)。
其中,Capacity 字段列出了该节点上可用的 CPU、内存、磁盘空间和 Pod 等资源的总数。具体来说:

  • cpu: 8 表示该节点上有 8 个 CPU 核心;
  • memory: 15595848Ki 表示该节点上有 15,595,848 KiB (约为 14.87 GiB)的内存;
  • ephemeral-storage: 83873664Ki 表示该节点上有 83,873,664 KiB (约为 79.97 GiB)的临时存储空间;
  • pods: 110 表示该节点上最多可以调度 110 个 Pod。

Allocatable 字段列出了该节点上实际可分配的资源数量,也就是 Kubernetes 调度器实际可以使用的资源数量。通常情况下,Allocatable 的值应该小于或等于 Capacity 的值。具体来说:

  • cpu: 8 表示该节点上可供调度器使用的 CPU 核心数为 8 个;
  • memory: 15493448Ki 表示该节点上可供调度器使用的内存为 15,493,448 KiB (约为 14.79 GiB);
  • ephemeral-storage: 77297968615 表示该节点上可供调度器使用的临时存储空间为 77,297,968,615 字节;
  • pods: 110 表示该节点上最多可以调度 110 个 Pod。

如果在一个节点上运行的 Pod 数量超过了该节点的 Allocatable 值,Kubernetes 将会拒绝将更多的 Pod 调度到该节点上。因此,在进行集群规划和调度时,需要根据节点的 Capacity 和 Allocatable 值来合理分配和调度应用程序,以充分利用资源并确保系统的稳定性和可靠性。

1.2.2 确认node01节点资源

image.png
可以看到其中有 Capacity 与 Allocatable 两项内容,其中的 Allocatable 就是节点可被分配的资源,我们这里没有配置资源预留,所以默认情况下 Capacity 与 Allocatable 的值基本上是一致的。下图显示了可分配资源和资源预留之间的关系:

  • Kubelet Node Allocatable 用来为 Kube 组件和 System 进程预留资源,从而保证当节点出现满负荷时也能保证 Kube 和 System 进程有足够的资源。
  • 目前支持 cpu, memory, ephemeral-storage 三种资源预留。
  • Node Capacity 是节点的所有硬件资源,kube-reserved 是给 kube 组件预留的资源,system-reserved 是给系统进程预留的资源,eviction-threshold 是 kubelet 驱逐的阈值设定,allocatable 才是真正调度器调度 Pod 时的参考值(保证节点上所有 Pods 的 request 资源不超过Allocatable)。

节点可分配资源的计算方式为:

  • Node Allocatable Resource = Node Capacity - Kube-reserved - system-reserved - eviction-threshold

2、 配置资源预留

2.1 kube预留值

首先我们来配置 Kube 预留值,kube-reserved 是为了给诸如 kubelet、容器运行时、node problem detector 等 kubernetes 系统守护进程争取资源预留。要配置 Kube 预留,需要把 kubelet 的 --kube-reserved-cgroup 标志的值设置为 kube 守护进程的父控制组。
不过需要注意,如果 --kube-reserved-cgroup 不存在,Kubelet 不会创建它,启动 Kubelet 将会失败。
比如我们这里修改 node-ydzs4 节点的 Kube 资源预留,我们可以直接修改/var/lib/kubelet/config.yaml 文件来动态配置 kubelet,添加如下所示的资源预留配置:

kubeReserved: 这个配置是用来为 Kubernetes 系统守护进程(如 kubelet、docker 等)预留资源的。当您在 kubeReserved 中设置了特定的资源量(比如 CPU、内存、临时存储等),Kubernetes 将保留这些资源,不会将它们分配给普通的 Pod 使用。这是为了确保系统进程有足够的资源运行,避免因资源不足而出现问题。

enforceNodeAllocatable:
- pods
kubeReserved:cpu: "100m"           # 为Kubernetes系统组件预留100m CPUmemory: "100Mi"       # 为Kubernetes系统组件预留100Mi 内存ephemeral-storage: "7Gi" # 保持原配置,为Kubernetes系统组件预留8Gi 临时存储

2.2 systemReserved预留

systemReserved:memory: "100Mi"         # 为系统级服务预留1Gi 内存

2.3 evictionHard预留

硬驱逐策略

evictionHard:memory.available: "200Mi" # 当可用内存降至200Mi时开始驱逐Podsnodefs.available: "10%"   # 当节点文件系统可用空间降至总空间的10%时开始驱逐Podsnodefs.inodesFree: "5%"   # 当节点文件系统可用inode数量降至总数的5%时开始驱逐Podsimagefs.available: "15%"  # 当镜像文件系统可用空间降至总空间的15%时开始驱逐Pods

2.4 整体配置

enforceNodeAllocatable:
- pods
kubeReserved:cpu: "100m"           # 为Kubernetes系统组件预留100m CPUmemory: "100Mi"       # 为Kubernetes系统组件预留100Mi 内存ephemeral-storage: "7Gi" # 保持原配置,为Kubernetes系统组件预留8Gi 临时存储
systemReserved:memory: "100Mi"         # 为系统级服务预留1Gi 内存
evictionHard:memory.available: "200Mi" # 当可用内存降至200Mi时开始驱逐Podsnodefs.available: "10%"   # 当节点文件系统可用空间降至总空间的10%时开始驱逐Podsnodefs.inodesFree: "5%"   # 当节点文件系统可用inode数量降至总数的5%时开始驱逐Podsimagefs.available: "15%"  # 当镜像文件系统可用空间降至总空间的15%时开始驱逐Pods
victionMinimumReclaim:memory.available: "100Mi" # 在内存驱逐发生后,尝试至少回收300Mi内存nodefs.available: "100Mi" # 在节点文件系统空间驱逐后,尝试至少回收500Mi空间imagefs.available: "500Mi"  # 在镜像文件系统空间驱逐后,尝试至少回收2Gi空间

2.5 重启服务

systemctl daemon-reload
systemctl  restart  kubelet
systemctl status  kubelet

查看资源
image.png

2.6 Allocatable资源说明

这是一个用于说明节点可分配(Node Allocatable)计算方式的示例:

  • 节点拥有 32Gi memory、16 CPU 和 100Gi Storage 资源
  • --kube-reserved 被设置为 cpu=1,memory=2Gi,ephemeral-storage=1Gi
  • --system-reserved 被设置为 cpu=500m,memory=1Gi,ephemeral-storage=1Gi
  • --eviction-hard 被设置为 memory.available<500Mi,nodefs.available<10%

在这个场景下,'Allocatable' 将会是 14.5 CPUs、28.5Gi 内存以及 88Gi 本地存储。 调度器保证这个节点上的所有 Pod 的内存 requests 总量不超过 28.5Gi,存储不超过 '88Gi'。 当 Pod 的内存使用总量超过 28.5Gi 或者磁盘使用总量超过 88Gi 时,kubelet 将会驱逐它们。 如果节点上的所有进程都尽可能多地使用 CPU,则 Pod 加起来不能使用超过 14.5 CPUs 的资源。
当没有执行 kube-reserved 和/或 system-reserved 策略且系统守护进程使用量超过其预留时, 如果节点内存用量高于 31.5Gi 或 storage 大于 90Gi,kubelet 将会驱逐 Pod。

本文来自博客园,作者:&UnstopPable 转载请注明原文链接:https://www.cnblogs.com/Unstoppable9527/p/18341549

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777618.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 是否该数据列每个数据都唯一就应该设置唯一索引?

前言 比较一下唯一索引和普通索引的区别。 如果有一列数据唯一,这个时候是否是就直接设置唯一索引,这样可以避免插入重复的值,来实现业务需求。 那么唯一索引是如何保持唯一的呢?这个对性能是否有影响。 正文 数据库我们知道是增删改查。 那么首先来看下这个查,唯一索引是…

Markdown 达人必备!轻松几步画出专业流程图

流程图,顾名思义,就是表示一个事件或活动的流程的图示。流程图,顾名思义,就是表示一个事件或活动的流程的图示。 ‍ ‍ 快速入门 最简单的例子:从 A 到 B graph TDA --> B‍ 效果: graph TDA --> B ‍ ‍ 注意起始的关键字“grpah”是必须的,表明这是流程图。 后续…

CVE-2023-1313 复现

CVE-2023-1313 复现cockpit在2.4.1版本之前存在任意文件上传漏洞PS:通过在浏览器中打开/install来运行安装首先看到了一个登录页面.我们按照提示访问/install,成功的添加了用户名和密码都为admin,登录. 来到如下界面,可以进行任意文件上传然后点击三个点可以选择下载文件,将得…

使用 addRouteMiddleware 动态添加中间

title: 使用 addRouteMiddleware 动态添加中间 date: 2024/8/4 updated: 2024/8/4 author: cmdragon excerpt: 摘要:文章介绍了Nuxt3中addRouteMiddleware的使用方法,该功能允许开发者动态添加路由中间件,以实现诸如权限检查、动态重定向及路由变化时的特定操作。内容涵盖…

DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑

共享纹理 老游戏使用directx9无法直接与cc高光sdk(d3d11)对接,但是d3d9ex有共享纹理,我们通过共享纹理把游戏画面共享给cc录制,记录一些踩坑的笔记。 共享纹理示例: // 初始化Direct3D void initD3D9(HWND hWnd) {hr = d3d9exdev->GetRenderTarget(0, &g_d3d9Render…

三数之和(双指针法)

题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 双指针法:首先我们要对数…

Nessus Professional 10.8.0 Auto Installer for macOS Sonoma

Nessus Professional 10.8.0 Auto Installer for macOS SonomaNessus Professional 10.8.0 Auto Installer for macOS Sonoma 发布 Nessus 试用版自动化安装程序,支持 macOS Sonoma、RHEL 9 和 Ubuntu 24.04 请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-…

Nexpose v6.6.263 for Linux Windows - 漏洞扫描

Nexpose v6.6.263 for Linux & Windows - 漏洞扫描Nexpose v6.6.263 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Jul 31, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。您的本地漏…

最佳包裹

求三维凸包用增量法求解 假设我们已经维护好了前面的点的凸包,对于新加入的点: 如果这个点在凸包内部显然那就不用管了 如果这个点在凸包外部,那么考虑如下情况:将新点\(P_r\)当做光源,照的到的面全部删掉,照不到的面保留下来即可 如何判断一个面是否能够被照到:取多面体…

数值分析方法

数值分析复习笔记数值分析方法 数值方法可以用近似方法来理解 对于一些得不到解析解否则解析解计算难度太大的问题,如何用较少的计算得到相对较好(满足精度要求)的数值解、近似解。数值分析最基本的立足点是容许误差 例子:近似计算基本方法:离散化(e.g. 数值积分) 递推法(将…

rocksdb安装与使用

首先要安装gcc 7.3以上版本,依赖于c++ 17.参见gcc 7安装及4.8.5和7.5并存。 需要rpm方式或源码安装gflags 2.2,否则系统可能内置了gflags 2.1,从而导致链接时一直找不到gflags库。如下:/tmp/ccUXmr9R.o: In function `__static_initialization_and_destruction_0(int, int)…

WPF【无限滚动图片浏览】自定义控件

自定义控件自定义控件是我比较陌生的一个主题。我好久没练习过wpf了,需要巩固记忆。我想了一会儿,打开动漫之家,忽然觉得这个看漫画的图片浏览控件有意思。于是特地花了一天做了这个图片控件。我原本以为很容易,但实际上并不简单。这个图片浏览控件比我想象中要难许多,有技…