深入剖析Kubernetes之资源模型和GPU 管理

2023-11-02

资源模型

  • 在 Kubernetes 里,Pod 是最小的原子调度单位。这也就意味着,所有跟调度和资源管理相关的属性都应该是属于 Pod 对象的字段。而这其中最重要的部分,就是 Pod 的 CPU 和内存配置,如下所示:
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: wp
    image: wordpress
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  • 在 Kubernetes 中,像 CPU 这样的资源被称作“可压缩资源”(compressible resources)。它的典型特点是,当可压缩资源不足时,Pod 只会“饥饿”,但不会退出。而像内存这样的资源,则被称作“不可压缩资源(incompressible resources)。当不可压缩资源不足时,Pod 就会因为 OOM(Out-Of-Memory)被内核杀掉。
  • Pod 可以由多个 Container 组成,所以 CPU 和内存资源的限额,是要配置在每个 Container 的定义上的。这样,Pod 整体的资源配置,就由这些 Container 的配置值累加得到。
    • Kubernetes 里为 CPU 设置的单位是“CPU 的个数”。比如,cpu=1 指的就是,这个 Pod 的 CPU 限额是 1 个 CPU。当然,具体“1 个 CPU”在宿主机上如何解释,是 1 个 CPU 核心,还是 1 个 vCPU,还是 1 个 CPU 的超线程(Hyperthread),完全取决于宿主机的 CPU 实现方式。Kubernetes 只负责保证 Pod 能够使用到“1 个 CPU”的计算能力。Kubernetes 允许你将 CPU 限额设置为分数。当然,你可以直接把这个配置写成 cpu=0.5。但在实际使用时,推荐使用 500m 的写法,毕竟这才是 Kubernetes 内部通用的 CPU 表示方式。
    • Kubernetes 里对于内存资源来说,它的单位自然就是 bytes。Kubernetes 支持使用 Ei、Pi、Ti、Gi、Mi、Ki(或者 E、P、T、G、M、K)的方式来作为 bytes 的值。比如,在上面的例子里,Memory requests 的值就是 64MiB (2 的 26 次方 bytes) 。这里要注意区分 MiB(mebibyte)和 MB(megabyte)的区别。备注:1Mi=1024*1024;1M=1000*1000
  • Kubernetes 里 Pod 的 CPU 和内存资源,实际上还要分为 limits 和 requests 两种情况,如下所示:
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
  • 两者的区别:在调度的时候,kube-scheduler 只会按照 requests 的值进行计算。而在真正设置 Cgroups 限制的时候,kubelet 则会按照 limits 的值来进行设置。

QoS 模型

  • Kubernetes 中,不同的 requests 和 limits 的设置方式,其实会将这个 Pod 划分到不同的 QoS 级别当中。
    • 当 Pod 里的每一个 Container 都同时设置了 requests 和 limits,并且 requests 和 limits 值相等的时候,这个 Pod 就属于 Guaranteed 类别。
    • 当 Pod 不满足 Guaranteed 的条件,但至少有一个 Container 设置了 requests。那么这个 Pod 就会被划分到 Burstable 类别。
    • 当一个 Pod 既没有设置 requests,也没有设置 limits,那么它的 QoS 类别就是 BestEffort
  • QoS 划分的主要应用场景,是当宿主机资源紧张的时候,kubelet 对 Pod 进行 Eviction(即资源回收)时需要用到的
  • 当 Kubernetes 所管理的宿主机上不可压缩资源短缺时,就有可能触发 Eviction。比如,可用内存(memory.available)、可用的宿主机磁盘空间(nodefs.available),以及容器运行时镜像存储空间(imagefs.available)等等。
  • Eviction 在 Kubernetes 里其实分为 Soft 和 Hard 两种模式。
    • Soft Eviction 允许你为 Eviction 过程设置一段“优雅时间”,比如 imagefs.available=2m,就意味着当 imagefs 不足的阈值达到 2 分钟之后,kubelet 才会开始 Eviction 的过程。
    • Hard Eviction 模式下,Eviction 过程就会在阈值达到之后立刻开始。
  • 当 Eviction 发生的时候,kubelet 具体会挑选哪些 Pod 进行删除操作,就需要参考这些 Pod 的 QoS 类别了。
    • 首当其冲的,自然是 BestEffort 类别的 Pod。
    • 其次,是属于 Burstable 类别、并且发生“饥饿”的资源使用量已经超出了 requests 的 Pod。
    • 最后,才是 Guaranteed 类别。并且,Kubernetes 会保证只有当 Guaranteed 类别的 Pod 的资源使用量超过了其 limits 的限制,或者宿主机本身正处于 Memory Pressure 状态时,Guaranteed 的 Pod 才可能被选中进行 Eviction 操作。
  • 当然,对于同 QoS 类别的 Pod 来说,Kubernetes 还会根据 Pod 的优先级来进行进一步地排序和选择。

cpuset 的设置

  • 在使用容器的时候,可以通过设置 cpuset 把容器绑定到某个 CPU 的核上,而不是像 cpushare 那样共享 CPU 的计算能力。这种情况下,由于操作系统在 CPU 之间进行上下文切换的次数大大减少,容器里应用的性能会得到大幅提升。事实上,cpuset 方式,是生产环境里部署在线应用类型的 Pod 时,非常常用的一种方式
  • 在 Kubernetes 里又该如何实现呢?首先,你的 Pod 必须是 Guaranteed 的 QoS 类型;然后,你只需要将 Pod 的 CPU 资源的 requests 和 limits 设置为同一个相等的整数值即可。这时候,该 Pod 就会被绑定在 独占的 CPU 核上。当然,具体是哪个 CPU 核,是由 kubelet 分配的。

在实际的使用中,强烈建议你将 DaemonSet 的 Pod 都设置为 Guaranteed 的 QoS 类型。否则,一旦 DaemonSet 的 Pod 被回收,它又会立即在原宿主机上被重建出来,这就使得前面资源回收的动作,完全没有意义了。

GPU 管理

  • 后续补充…

你知道的越多,你不知道的越多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入剖析Kubernetes之资源模型和GPU 管理 的相关文章

随机推荐

  • Android RecyclerView的notify方法和动画的刷新详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 本篇讲解了RecyclerView关于通知列表刷新的常用的notify方法 和RecyclerVie
  • PyQt5入门1——PyQt5的安装与Hello World应用

    PyQt5入门1 PyQt5的安装与Hello World应用 学习前言 简介 From 百度百科 安装 Hello World 1 窗口构建 a 构建基础类 b 编写UI 2 主程序运行 全部代码 学习前言 搞搞可视化界面哈 虽然不一定有
  • paramiko通过ssh远程登陆服务器执行命令出现错误的问题

    最近为了要实现对远程linux服务器的上传 下载文件 和对远程服务器操作的命令 因此用到了python的一个模块paramiko来实现 上传文件和下载文件这些基本命令是很容易实现的 还有就是通过exec command cmd 命令能对服务
  • ant design中如何在表头中加个Icon和排序,悬浮icon又触发Tooltip

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 需求 本篇文章适用于表头同时添加悬浮和排序 另 只需支持文字悬浮对title封一层方法即可eg const TooltipTitle text
  • matlab字符串处理

    TOC matlab字符串处理 前言 在Matlab中 字符串是用单引号括起来的字符序列 一 字符串的表示 字符串是用单引号括起来的字符序列 gt gt xm Online University xm Online University g
  • MySQL长文本字段的选取

    某个字段需要存储 长文本类型的数据 长度可变 范围不清 varchar最多能存储多大长度呢 何种情况下用text更好 以下内容就为探究这个问题 lt 1 gt 先将content字段设为varchar 255 则此字段只能最多存储255个字
  • 企业生产过程能力分析(CPK)

    系列文章目录 文章目录 系列文章目录 前言 一 Cpk的定义 二 Cp Cpk Pp Ppk之间的关系 1 能力指数Cp 2 中心能力指数Cpk 3 性能指数Pp 4 中心性能指数Ppk 5 关联性 三 Cpk Ppk的区别 四 案例介绍
  • ClickHouse建表语句分析

    MergeTree引擎 Clickhouse 中最强大的表引擎当属 MergeTree 合并树 引擎及该系列 MergeTree 中的其他引擎 MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中 数据可以以数据片段的形式一
  • Angular基础系列学习(六)--异步数据交互(请求数据&接口调用)

    Angular从入门到放弃秘籍 第一篇Angular的介绍以及基本环境搭建 第二篇Angular模板语法 插值语法 事件绑定 第三篇Angular内置基本指令介绍 第四篇Angular组件的创建 组件声明周期钩子函数 第五篇Angular父
  • Unity踩坑记录—— 归一化距离向量

    Vector3 normalized 和 Vector3 Normalize 依据官方文档解释 前者 Vector3 normalized 是当前向量是不改变的 返回一个新的规范化的同方向上的向量 值为1 后者 Vector3 Normal
  • 网络总结知识点(网络工程师必备)四

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 前言 71 NAPT有什么特点 72 AR
  • java长连接和短连接_[Java教程]Tomcat 长连接与短连接性能测试

    Java教程 Tomcat 长连接与短连接性能测试 0 2015 01 10 19 00 59 环境 操作系统 centos 6 5 x64 cpu 32 core 内存 32G web服务器 tomcat 6 x jdk 1 6x 测试环
  • Java 程序员应该了解的 10 个面向对象设计原则

    http www iteye com news 24488 面向对象设计原则是OOPS Object Oriented Programming System 面向对象的程序设计系统 编程的核心 但大多数Java程序员追逐像Singleton
  • Appium实现app自动化测试

    目录 1 Appium设计 2 Appium环境安装 1 JDK安装配置 2 SDK安装 3 Appium desktop安装 appium server appium inspector工具 3 DesiredCapability 启动参
  • 开篇--Java程序员如何快速成长?

    你好 很高兴你走进我的 深入拆解 Tomcat Jetty 专栏 与我和其他同学一起探讨熟悉又陌生的 Tomcat 和 Jetty 如果你和我一样选择了 Java Web 开发这个方向 并且正在学习和提高的路上 你一定思考过这个问题 我怎样
  • Python--描述符

    描述符是描述类A的实例对象a 在另一个类B中实例描述对象a 再实例化B的对象b后 b就可以通过操作a来达到一些A中定义好的方法 如get set del 简单例子 class MyDecription def get self instan
  • 一个大二学生送给大一学弟学妹的建议

    博主简介 先简单的介绍一下我吧 本人是一名大二学生 来自四川 目前所学专业是人工智能 致力于在CSDN平台分享自己的学习内容 我为什么要写这篇文章 我来到CSDN也已经一年了 在这一年里面 我学会了很多 也认识了很多的优秀大佬 当然 也有很
  • 欢聚时代java面试_欢聚时代面试经验

    面试过程 欢聚时代复盘 自我介绍 被打断问 你觉得掌握了工具就是好的设计师吗 问你 互联网设计师的生命周期其实只有三年 这三年过后 你想怎么样 你自己的职业规划发展道路是什么样的 我说走专业线 努力成为高级视觉设计师 又问你觉得高级视觉设计
  • NUMA备忘

    NUMA起源百度一搜一大把 就不写了 写几条笔记给自己备忘 为什么要关注NUMA 原因就是由于在某个Node上运行的程序要访问的内存在另外一个Node 一个有内存控制器的单核或者多核CPU组合体 对intel AMD来说 一般一个物理soc
  • 深入剖析Kubernetes之资源模型和GPU 管理

    文章目录 资源模型 QoS 模型 GPU 管理 资源模型 在 Kubernetes 里 Pod 是最小的原子调度单位 这也就意味着 所有跟调度和资源管理相关的属性都应该是属于 Pod 对象的字段 而这其中最重要的部分 就是 Pod 的 CP