K8s Pod 资源进阶

文章目录

  • K8s Pod 资源进阶
    • pod 资源限制
      • 限制资源单位
    • 资源限制实战
    • Pod 服务质量Qos
    • Downward API
      • 可注入的元数据信息
      • 环境变量方式注入元数据
      • 存储卷方式注入元数据
      • 为注册服务注入Pod 名称
      • 为 JVM 注入堆内存限制

K8s Pod 资源进阶

pod 资源限制

资源限制的方法:

  • Requests: 申请的资源大小; 刚创建时,申请1G内存,找到符合的节点,然后调度上去;
  • Limits: 限制运行过程中的最大使用量; 限制2G,当达到2G就没办法在继续使用了;

限制资源种类。常用有 cpu 和 memory 资源,也可以用来限制 nvidia.com/gpu 资源。限制gpu资源需要先安装对应插件,gpu 的限制方案和cpu 基本一致

Pod资源限制:

  • CPU/GPU: 可压缩资源,超载,响应慢;
  • 内存: 不可被压缩的资源,超载,触发OOM机制;杀死Pod;看 QOS

限制资源单位

  • CPU: 1 核CPU 等于 1000 毫核, 1 核心 = 1000 millicpu(1 Core = 1 m)。 k8s 不允许设置精度小于1m 的CPU 资源。 因此当 CPU 单位小于 1 时, 只能用豪核心表示

  • memory: 内存的基本单位是字节数(Bytes),也可以加上国际单位,十进制的 E、P、T、G、M、K、m,或二进制 Ei、Pi、Ti、Gi、Mi、Ki

    1 MB = 1000 KB = 1000000 Bytes

    1 Mi = 1024 KB = 1038576 bytes

资源限制实战

apiVersion: v1
kind: Pod
metadata:name: pod-resource
spec:containers:- name: memory-demo-ctrimage: polinux/stresscommand: ["stress"]args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1" ] # 告知容器尝试分配 150 MiB 内存 resources:requests:cpu: "100m" #  申请 0.1 Core cpu 资源  设置高了。没有可调度node, pod 会一直处于pending 状态memory: "100Mi"  # 申请 100 Mi 内存  设置高了 pendinglimits:cpu: "200m"      # 最多使用 0.2 Core cpu 超了会影响效率memory: "200Mi"  # 最多使用 200 Mi 内存  使用超过设置 会导致 status 为 OOMKilled 内存溢出(OOM) 杀死容器

Pod 服务质量Qos

QoS(Quality of Service),译作 “服务质量保证”, 是作用在Pod 上的一个配置,当kubernetes 创建一个pod 时,它就会给这个Pod 分配一个QoS 等级。

当Pod 过载使用资源时,kubernetes 会根据Pod 对象的服务质量和优先级等完成判定,进而挑选对应的Pod 杀死。kubernetes 根据pod 的Requests 和 Limits 属性,把Pod 对象归类为三类 BestEffort、BurStable、Guaranteed

  • Guaranteed: Pod 对象为每个容器(包括initContainer)都设置了CPU资源需求和资源限制,切两者值相同;还同时为每个容器设置了内存需求和限制,并且两者的值相同。这类Pod 对象具有最高级别的服务质量
  • Burstable: 至少有一个容器设置 CPU 或内存资源 Requests 属性,但不满足 Guaranteed, 这类Pod具有中级服务质量
  • BestEffort: 没有为任何容器设置Requests 和 Limits属性,这类Pod对象服务质量是最低级别

当 kubernetes 集群内存资源紧缺,优先杀死BestEffort类别的容器,因为系统不为该类资源提供任何服务保证,但此类资源最大的好处就是能够尽可能的使用资源。

如果系统中没有BestEffort类别的容器,接下来就轮到BUrstable类别的容器,如果有多个Burstable类别的容器,就看谁的内存资源占用多,就优先干掉谁。比如A容器申请16内存资源,实际使用了95%,而B容器申请了26内存资源,实际使用了80%,但任然会优先干掉A容器,虽然A

容器的用量少,但与自身的Requests值相比,它的占比要大于B容器。

对于Guaranteed类别的容器拥有最高优先级,它们不会被杀死,除非其内存资源需求超限,或者OOM时没有其他更低优先级的Pod对象存在,才会千掉Guaranteed类容器。

Downward API

DownwardAPI可以让容器获取Pod的相关元数据信息,比如Pod名称,Pod的IP,Pod的资源限制等,获取后通过env、volume的方式将相关的环境信息注入到容器中,从而让容器通 过这些信息,来设定容器的运行特性。

  • 例如:Nginx进程根据节点的CPU核心数量自动设定要启动的worker 进程数。
  • 例如:JVM虛拟根据Pod的内存资源限制,来设定对应容器的堆内存大小。
  • 例如:获取Pod名称,以Pod名称注册到某个服务,当Pod结束后,调用prestop清理对应名称的注册信息。

可注入的元数据信息

使用 pod.spec.containers.env. valueFrom. fieldRef 可以注入的字段有:

  • metadata.name:Pod对象的名称
  • metadata.namespace:Pod对象隶属的名称空间
  • metadata.uid: Pod对象的UID
  • metadata.labels[‘’]:获取Labe1指定KEY对应的值
  • metadata.annotations["’]:获取Annotat ions对应KEY的值
  • status.podIP:Pod对象的IP地址
  • status.hostIP:节点IP
  • status.nodeName:节点名称
  • spec.serviceAccountName:Pod对象使用的ServiceAccount资源名称

使用 pod.spec.containers.env.valueFrom.resourceFieldRef 可以注入的字段有:

  • requests.cpu
  • requests.memory
  • limits.cpu
  • limits.memory

环境变量方式注入元数据

apiVersion: v1
kind: Pod
metadata:name: pod-down-apilabels:app: nginx-approle: backendzone: beijing
spec:containers:- name: pod-down-apiimage: nginxcommand: ["/bin/bash" ,  "-c", "env"]resources:requests:cpu: "200m"memory: "32Mi"limits:cpu: "200m"memory: "64Mi"env:- name: APP1_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: APP1_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: APP1_POD_LABELSvalueFrom:fieldRef:fieldPath: metadata.labels['app']- name: APP1_CPU_REQUESTSvalueFrom:resourceFieldRef:resource: requests.cpu- name: APP1_MEM_LIMITSvalueFrom:resourceFieldRef:resource: limits.memorydivisor: 1Mi       # 默认显示为字节,通过 divisor 调整显示单位为兆

存储卷方式注入元数据

apiVersion: v1
kind: Pod
metadata:name: pod-down-api-volumeslabels:app: nginx-approle: backendzone: beijing
spec:containers:- name: pod-down-apiimage: nginxresources:requests:cpu: "200m"memory: "32Mi"limits:cpu: "200m"memory: "64Mi"volumeMounts:   # 将环境变量挂载到/etc/podinfo 目录中,没注入一条元数据都会产生一个文件- name: podinfomountPath: /etc/infovolumes:- name: podinfodownwardAPI:items:- path: pod_namefieldRef:fieldPath: metadata.name- path: pod_namespacefieldRef:fieldPath: metadata.namespace- path: pod_labelsfieldRef:fieldPath: metadata.labels- path: req_cpuresourceFieldRef:containerName: pod-down-apiresource: requests.cpu- path: limit_memresourceFieldRef:containerName: pod-down-apiresource: limits.memory

为注册服务注入Pod 名称

apiVersion: apps/v1
kind: Deployment
metadata:name: pod-mysql-register
spec:replicas: 10selector:matchLabels:app: toolstemplate:metadata:labels:app: toolsspec:containers:- name: registerimage: tools:latest  # 找一个能够有mysql client的镜像即可imagePullPolicy: IfNotPresentcommand:- "/bin/bash"- "-c"- |mysql -h 172.0.1.1 -uroot -p1234 -e "create database ${POD_NAME//-/_}"sleep 99999999env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.namelifecycle:preStop:  # pod 终止前执行exec:command:- "/bin/bash"- "-c"- mysql -h 172.0.1.1 -uroot -p1234 -e "drop database ${POD_NAME//-/_}"

为 JVM 注入堆内存限制

apiVersion: v1
kind: Pod
metadata:name: pod-tomcat-downward
spec:containers:- name: tomcatimage: tomcat:9.0.63ports:- containerPort: 8080env:- name: JAVA_OPTS   # JVM 内存设置环境变量value: -server -Xms${JVM_XMS} -Xmx${JVM_XMX} -XX:+UseConcMarkSweepGC- name: JVM_XMS   # 读取 resources 配置valueFrom:resourceFieldRef:resource: requests.memory- name: JVM_XMXvalueFrom:resourceFieldRef:resource: limits.memoryresources:requests:memory: 100Milimits:memory: 100Mi

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

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

相关文章

厨房防蟑螂3个避坑细节

厨房发黑有蟑螂咋办      检查3个地方,想要厨房卫生干净      1,台面和墙中间这个缝别用美缝剂,      不想后期剁骨头开裂进水,就用有弹性的防霉玻璃胶      2,水槽的下水管用u型存水弯      可以…

纯电动汽车硬件在环测试

纯电动汽车硬件在环测试技术研究综述 1、新能源汽车概述 随着新能源汽车“电动化、智能化、网联化、共享化”进程的不断推进,新能源汽车的整体性能得到显著提高,纯电动汽车已经逐渐走进大众视野,消费者对于新能源汽车的认可度和购买欲望也稳…

Crontab 自动脚本实例 | 校园网保持联网

唠唠闲话 自动化脚本的用途广泛,比如自动挂载磁盘,自动登录校园网等。本篇将介绍 crontab 这一自动脚本执行工具。 Crontab 简介 crontab 是类 Unix 操作系统中用于设置周期性执行任务的工具。crontab(代表 “cron table”)允许…

php 设置时区

date_default_timezone_set() 设置所有日期/时间函数使用的默认时区 除了在脚本中使用此函数设置默认时区,还可以使用 INI 设置 date.timezone 设置默认时区。 参数 timezoneId 时区标识符,像 UTC、Africa/Lagos、Asia/Hong_Kong 或 Europe/Lisbon。…

Element-UI详解

Element-UI详解 一、Element-UI的特点1. 完整性2. 易用性3. 美观性4. 可扩展性 二、Element-UI的安装和使用1. 安装2. 引入 Element-UI3. 使用组件 三、核心组件详解1. 布局组件示例 2. 表单组件示例 3. 数据展示组件示例 4. 反馈组件示例 5. 导航组件示例 四、Element-UI的应用…

Codeforces Round 927 (Div. 3) D. Card Game 题解 贪心

Card Game 题目描述 Two players are playing an online card game. The game is played using a 32-card deck. Each card has a suit and a rank. There are four suits: clubs, diamonds, hearts, and spades. We will encode them with characters ‘C’, ‘D’, ‘H’, …

让大模型变得更聪明三个方向

让大模型变得更聪明三个方向 随着人工智能技术的飞速发展,大模型在多个领域展现出了前所未有的能力,但它们仍然面临着理解力、泛化能力和适应性等方面的挑战。那么,如何让大模型变得更聪明呢? 方向一:算法创新 1.1算…

粤嵌—2024/5/20—三角形最小路径和(✔)

代码实现&#xff1a; int minimumTotal(int **triangle, int triangleSize, int *triangleColSize) {if (triangleSize 1) {return triangle[0][0];}for (int i 1; i < triangleSize; i) {for (int j 0; j < triangleColSize[i]; j) {int x i - 1;int y1 j - 1, y2…

【数据结构】快速排序详解!

文章目录 1. 快速排序的非递归版本2. 快速排序2.1 hoare 版本一2.2 挖坑法 &#x1f427;版本二2.3 前后指针 版本三2.4 调用以上的三个版本的快排 3. 快速排序的优化 1. 快速排序的非递归版本 &#x1f192;&#x1f427;关键思路&#xff1a; &#x1f34e;① 参数中的begin…

MySQL基础_6.函数

文章目录 一.不同DBMS函数的差异二.单行函数三.聚合函数3.1 常用聚合函数3.2 GROUP BY 四.SELECT的执行顺序4.1 写SELECT的顺序4.2 SELECT 的执行顺序 一.不同DBMS函数的差异 我们在使用 SQL 语言的时候&#xff0c;不是直接和这门语言打交道&#xff0c;而是通过它使用不同的…

5-26 Cpp学习笔记

1、如果子类实现了基类的函数&#xff0c;返回值、参数都相同&#xff0c;就覆盖了基类的函数。 2、使用作用域解析运算符来调用基类的函数。myDinner.Swim(); —— 调用子类的。myDinner.Fish::Swim(); —— 调用基类的(基类是Fish) 3、在子类中使用关键字using解除对Fish::…

力扣刷题---LCS 02. 完成一半题目【简单】

题目描述 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目&#xff0c;整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题&#xff0c;请返回被选的 N 道题目至少包含多少种知识点类型。 示例 1&…

YOLOv10 论文学习

论文链接&#xff1a;https://arxiv.org/pdf/2405.14458 代码链接&#xff1a;https://github.com/THU-MIG/yolov10 解决了什么问题&#xff1f; 实时目标检测是计算机视觉领域的研究焦点&#xff0c;目的是以较低的延迟准确地预测图像中各物体的类别和坐标。它广泛应用于自动…

【JMU】21编译原理期末笔记

本拖延症晚期患者不知不觉已经有半年没写博客了&#xff0c;天天不知道在忙什么。 乘着期末周前赶紧先把编译原理上传了&#xff0c;我记得我这科是86分&#xff0c;有点小遗憾没上90&#xff0c;但是总体不错。 链接&#xff1a;https://pan.baidu.com/s/1gO8pT7paHv1lkM_ZpkI…

JVM学习-Class文件结构①

字节码文件的跨平台性 Java语言&#xff1a;跨平台的语言(Write Once,Run Anywhere) 当Java源代码编译成字节码后&#xff0c;如果想在不同平台上运行&#xff0c;则无须再次编译这上优势不再那么吸引人&#xff0c;Python,PHP,Ruby,Lisp等有强大的解释器跨平台似乎已经成为一…

《最新出炉》系列入门篇-Python+Playwright自动化测试-41-录制视频

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 上一篇讲解和分享了录制自动生成脚本&#xff0c;索性连带录制视频也一股脑的在这里就讲解和分享了。今天我们将学习如何使用Playwright和Python来录制浏览器操作的视频&#…

删除有序数组中的重复项-力扣

本题的解题思路同样是使用快慢指针对数组进行操作&#xff0c;代码如下&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int fastindex 1;int slowindex 0;for(fastindex; fastindex < nums.size(); fastindex){if(nums[fasti…

Overleaf中出现文字越界、越下届、没有正确分页、换页的原因和解决方法

在使用overleaf中&#xff0c;我偶尔会遇到如标题所说的情况&#xff0c;也如图所示&#xff1a; 后来发现&#xff0c;是因为这一页前面是一个表格&#xff0c;所以怀疑是表格的格式导致的。所以让chatgpt帮我更换了表格的格式&#xff0c;成功解决问题。 对于问题可能的成因…

Exel 求某行数最大值

方法1 MAX&#xff08; 选中比较数回车

伪css的处理方式

import re # 正则表达式模式&#xff0c;匹配以 cl 开头&#xff0c;后跟任意数字&#xff0c;然后是 a::before pattern_cl8 r(cl8)\sa::before # 在源码中查找匹配项 matches_cl8 re.findall(pattern_cl8, page_source, re.IGNORECASE) # 如果找到 cl8 a::before&#…