深入探究kubernetes resources - Part 2

news2024/11/24 5:07:15

你以为CPU请求只是用来调度的吗? 再想一想。 引入 CPU 份额,并为消除限制奠定基础!

了解 CPU 请求

在上一篇文章中,我谈到了 Kubernetes 资源管理的基础。 在这篇文章中,我们将深入探讨当我们将 CPU 请求配置到 pod 的容器时幕后发生的事情。

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m" # For the last time!

资源请求首先用于调度决策,但 CPU 请求还有其他用途吗?

CPU Shares

当您在 Pod 的清单中将 X 数量的 vCPU 配置为容器 CPU 请求时,Kubernetes 会为您的容器配置 (1024 * X) CPU 份额。

例如,如果我为我的 CPU 请求配置 250m,Kubernetes 将设置 1024 * 250m = 256 个 CPU 份额。

那么什么是 CPU 份额,它们有什么作用?

了解CPU shares,先说说Kernel的机制,叫做CFS(Completely Fair Scheduler)。

CFS — Completely Fair Scheduler

CFS 是默认的 Linux CPU 调度程序,负责在进程之间公平分配 CPU 时间。

“完全公平”部分并不像听起来那么简单,它使用一些参数来决定每个进程的相对权重(优先级)是多少。 你们中的许多人可能熟悉可以为进程设置的“nice”设置以更改其相对权重。 但目前,Kubernetes 并没有使用 nice 来影响进程的权重,而是为一个 CGroup 配置 CPU 份额。

因此,CPU 份额是 Linux CGroup 的一项功能,旨在为 CFS 确定 CGroup 进程的优先级,以便在拥塞时将更多的 CPU 时间分配给优先级更高的进程。

让我们将单个 CPU 时间范围(例如 1 秒)想象成一个披萨。 每一秒都有一个新的比萨从烤箱里出来,进程从中吃掉他们需要的东西,然后它就消失了。 如果我所有的进程都没有饿到在 1 秒内吃掉所有的披萨,它们就会吃饱直到时间结束,一个新的 CPU-second-pizza 会从烤箱里出来。

当我们的进程很饿并且每秒 1 个披萨不足以养活它们时,并发症就开始了。

当我的所有进程没有足够的 CPU 时间(或披萨)时,CFS 将查看每个 CGroup 拥有的份额,将披萨切成一定份额,并相应地进行拆分。

如果 CGroup 中的许多进程需要的 CPU 多于可用的 CPU,则每个 CGroup 收到的切片将在该 CGroup 中的进程之间平均分配。

因此,例如,如果 5 个 CGroup 中的进程正在请求尽可能多的 CPU,并且每个 CGroup 具有相同数量的 CPU 份额,那么 CPU 时间将在 CGroup 之间平均分配。

另一个例子是(保持所有进程都在请求尽可能多的CPU的状态); 如果我有 3 个 CGroup,每个 CGroup 有 1024 个 CPU 份额,另一个 CGroup 有 3072 个份额,前 3 个 CGroup 将获得 CPU 的 1/6,最后一个 CGroup 将获得一半(3/6)

请记住,所有这一切仅在我缺少 CPU 时才有意义,如果我有 3 个 CGroups,具有 X CPU 份额,需要大量 CPU,而第四个 CGroup 具有 1000X CPU 份额,处于空闲状态,前 3 个 CGroup 将平分 CPU。

我的容器甚至可以在 Kubernetes 上拥有 1,048,576 个 CPU 份额吗? 前提是我的节点有超过 1024 个 CPU 内核,例如 Epiphany-V,但我敢肯定我们大多数人都没有那种节点。

Kubernetes 如何使用这些特性

正如我所说,Kubernetes CPU 请求为我们的容器 CGroups 配置 CPU 份额,

Kubernetes 魔法阻止了共享“过度承诺”; 一方面,调度程序仅在每个节点上调度 CPU 请求总量,使其低于或等于节点上的 CPU 数量。 另一方面,您提供的 CPU 份额最高可达内核数的 1024 倍。 这为 pod 可以使用的最大份额数设置了上限,并且比率保持不变。

您的容器在 Kubernetes 上可以拥有的 CPU 份额总和是集群中可分配 CPU 数量的 1024 倍。

现实生活中的例子

我试图让前面的例子尽可能简单,所以我删除了一些重要的参数,例如:

  • 每个 CGroup 中的线程和进程数
  • 节点消耗的 CPU(除了正在运行的 Pod)

尽管您可能这么认为,但还有一些其他参数不会生效。 例如:

  • 服务质量 (QoS)
  • Pod 优先级
  • 驱逐

让我们深入了解一下;

线程数

当我们在容器中只运行一个进程时,如果该进程只创建一个线程,它无论如何也不会消耗超过一个核心。 当您为容器设置 CPU 请求时,请始终牢记它们将运行的线程数。

旁注——线程不是免费的,尽量不要使用太多线程,因为每个线程都有自己的开销,而是增加副本的数量。

节点负载

前面的条形图是针对孤立的流程,但并非所有流程都是孤立的。 不用担心! 您的容器的 CGroups 在 CGroups 层次结构中非常低。

也许在阅读时你已经去检查你的 Kubelet 有多少 CPU 份额以确保它没有被剥夺。 别担心,您的 pod 和容器只是共享“kubepods”CGroup 符合条件的 CPU 时间。 如果节点上的 Kubelet、容器运行时或其他服务需要 CPU 时间,它们将获得它。

设置高 CPU 请求时不要担心,节点的组件开箱即用。

服务质量

Kubernetes 正在根据 QoS 配置 CGroups,目前,它们没有真正的功能,它们的存在是为了将来使用。

就 CPU 时间和优先级而言,CPU 请求是唯一重要的事情。

那么不设置CPU Requests会怎么样呢? 默认情况下,容器将获得 2 个 CPU 份额,并且与配置了 CPU 请求的 Pod 相比,其优先级非常低。

可突发 Pod 和 Best-Effort Pod 的 CPU 时间分配是相同的。 保证将有另一个影响 CPU 时间的参数。 更多内容在下一部分。
底线是 QoS 不会直接影响 pod 的容器将接收的 CPU 时间。 唯一重要的是 CPU 份额(以及限制,如果你仍然使用它们)。

Pod 优先级

“没关系,我设置了 pod 优先级。” — 对不起,但不完全是……

Pod 优先级仅用于确定节点退出的终止顺序,正如我们已经提到的; 没有因 CPU 压力导致的驱逐。

驱逐

驱逐是在节点上运行的一个进程,当节点资源不足时,它会选择并杀死 pod。 逐出只发生在不可压缩的资源,如内存、磁盘空间等。更多在第四部分。

不只是为了调度

我们了解到,CPU 请求不仅用于调度目的,还用于容器的生命周期。 内存请求也有它们的深层,更多内容在第四部分。

此外,我们只讨论了正常的 Kubernetes 行为,还有许多其他选项,例如为每个容器设置独占 CPU 核心的 CPU 固定。 这超出了本文的范围,但我们将来可能会涉及 😄

总结

我们了解到 CPU 请求不仅用于调度,而且在整个容器生命周期中占据很大一部分! 我们了解了设置正确请求以便为每个容器配置正确数量的 CPU 份额的重要性,以及为什么 QoS 等配置不会真正影响我们的工作负载。

记住! CPU 请求配置在容器的整个生命周期内保证有多少 CPU 可用!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D建模Cocos Creator3D:发射器模块(ShapeModule)

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 发射器模块(ShapeModule) 公有属性: 属性作用position相对于挂载节点的位置rotation相对于挂载节点的旋转scale相对于挂载节点的缩放sphericalDirectionAmount表示当前…

ESP32(Micro Python)LVGL 两个动画程序

本次发布两个程序,仪表盘动画程序对刻度数量等参数进行调整,方便布置多个小尺寸仪表盘;进度条动画程序展示了多个进度条的排列方式。 仪表盘程序 import lvgl as lv import time from espidf import VSPI_HOST from ili9XXX import ili93…

人机交互学习-6 交互式系统的设计

交互式系统的设计 设计框架定义外形因素和输入方法定义功能和数据元素决定功能组合层次勾画大致的设计框架构建关键情景场景剧本通过验证性的场景剧本来检查设计 设计策略删除组织隐藏转移简化设计策略的组合 设计中的折中个性化和配置本地化和国际化审美学与实用性 软件设计的…

Golang context 实现原理与源码分析

0 context入门介绍 context是Golang应用开发常用的并发控制技术,主要在异步场景中用于实现并发协调以及对 goroutine 的生命周期控制,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。 con…

DataGrip使用技巧

DataGrip介绍 DataGrip是JetBrains提供的面向开发人员的数据库管理产品。提供智能查询控制台、高效的架构导航、智能SQL补全等功能。 同类的产品有navicat、dbeaver。本文中使用的DataGrip版本为2023.1 显示数据库其他类型的数据库结构 DataGrip中如果某类型数据库结构数量为…

GaussDB单SQL性能慢分析

文章目录 问题描述问题现象告警单SQL性能慢分析步骤一:确定目标SQL步骤二:收集统计信息、提前排除影响步骤三:分析SQL性能瓶颈 单SQL性能慢-视图分析流控导致慢SQL并发锁冲突导致慢SQL表膨胀导致大量的死元组业务语句不优、计划不优 问题描述…

8自由度并联腿机器狗实现姿态平衡

1. 功能说明 本文示例将实现8自由度并联腿机器狗保持姿态平衡的功能,当机器狗在一个平台上原地站立,平台发生倾斜时,机器狗能够自动调整姿态,保证背部水平。 2. 机器狗的稳定性分析 稳定性是机器狗运动中很重要的一部分&#xff0…

Leetcode | 35 搜索插入位置

35 搜索插入位置 文章目录 35 搜索插入位置题目我的思路[官方题解](https://leetcode.cn/problems/search-insert-position/solutions/333632/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/ "官方题解")欢迎关注公众号【三戒纪元】 题目 给定一个排序数组和一个目标…

Rocky linux 9.0系统安装MySQL5.7

前言 本文将带你在Rocky linux 9.0上折腾一个MySQL5.7, 说干就干。 文章目录 前言安装环境下载mysql 包开始安装启动测试总结 安装环境 删除系统中可能存在的包: [rootmufeng ~]# rpm -qa |grep mysql [rootmufeng ~]# rpm -qa |grep mariadb [rootmu…

Ansible概述和模块解释

Ansible概述 Ansible介绍 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能做什么 Ansible能…

Linux---详细讲解linux计算机体系结构

前言 Linux是一种开源的操作系统,它的核心思想是基于冯诺依曼体系结构。在本文中,我们将深入探讨Linux的基本原理和操作系统的概念。 Linux是一款基于Unix操作系统的开源软件,它的核心是由Linus Torvalds在1991年开发的。Linux的出现&#x…

认识 Vue.js

node版本管理工具 nvm - 简书 Vue介绍 Vue.js(简称Vue) 是一套用于构建用户界面的渐进式前端框架。(其实就是使用js开发的一个框架) Vue.js 核心实现 : 响应式的数据绑定:当数据发生改变,视图可以自动更新,不用关心D…

「有问必答」Go如何优雅的对时间进行格式化?

昨天 交流群 关于「Go如何优雅的对时间进行格式化?」展开了讨论: 咋搞捏? 如何在不循环的情况下,把列表数据结构体的时间修改为咱们习惯的格式,而不是UTC模式 我们要实现的效果如下: created_at 是go语言原生的方式&#xff0…

Android Framework分析Zygote进程的启动过程

Zygote进程是Android系统中的一个重要进程,其主要作用是预热Java虚拟机和启动应用进程。本文将着重分析Zygote进程的启动过程,结合代码注释和示例代码,让读者更好地理解Zygote的内部工作原理。 Zygote进程的启动过程 Zygote进程的启动过程包…

Python3 里面的四舍五入

目录 1.一般的四舍五入 : 使用内置的round函数 1.1官方文档: 1.2 举例说明: 2.python3里的格式化输出 format 2.1 记忆法则 :填齐宽 逗精类 2.2 format实质就是通过设置精度间接使用了等效round函数,但是不要把格式化输出和四…

chatgpt赋能python:Python是如何帮助确定location的?

Python是如何帮助确定location的? 什么是location? 在SEO中,location指的是特定页面、文章或者商铺在搜索结果中的排名位置。通常来说,更高的location意味着更多的点击率和流量,因此在SEO中,确定location…

独立站思考:Facebook选品测品

导语:对于独立站而言,获取稳定的流量是至关重要的。本文将探讨如何利用Facebook的选品测品功能,精准找到用户并提高点击率,以及如何通过数据分析优化,提高转化率并快速产生订单。 第一部分:精准定位用户的方…

Nodejs五、Express

零、文章目录 Nodejs五、Express 1、初识 Express (1)Express 简介 Express是什么 官方给出的概念:Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。 通俗的理解:Express 的作用和 Node.js 内置的 …

Swift 5.9 有哪些新特性(一)

文章目录 前言if 和 switch 表达式Value 和 Type 参数包 前言 虽然 Swift 6 已经在地平线上浮现,但 5.x 版本仍然有很多新功能-更简单的 if 和 switch 用法、宏、非可复制类型、自定义 actor 执行器等等都将在 Swift 5.9 中推出,再次带来了一个巨大的更…

矩阵补全文献汇总

[1] Nguyen L T , Kim J , Shim B .Low-Rank Matrix Completion: A Contemporary Survey[J].IEEE Access, 2019, PP(99):1-1.DOI:10.1109/ACCESS.2019.2928130. 几根棒子的一篇工作。基本结构可以借鉴。 适用于秩未知的矩阵补全文献汇总 [1] Fornasier M , Rauhut H , Ward…