【Kubernetes】k8s集群中pod的容器资源限制和三种探针

目录

一.关于pod容器的资源限制

1.资源限制的单位

1.1.CPU 资源单位

1.2.内存 资源单位 

二.关于QOS服务质量(pod的调度和驱逐有限制)

1.QoS服务质量分类

2.驱逐顺序

三.关于pod容器的三种探针

1.探针的三种规则

2.Probe支持三种检查方法

3.探测的三种结果

4.常用参数

四.pod容器的启动、退出动作


一.关于pod容器的资源限制

当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和

内存大小,以及其他类型的资源

当为 Pod 中的容器指定了 request 资源时,代表容器运行所需的最小资源量,调度器就使用该信

息来决定将 Pod 调度到哪个节点上。当还为容器指定了 limit 资源时,kubelet 就会确保运行的容

器不会使用超出所设的 limit 资源量。kubelet 还会为容器预留所设的 request 资源量, 供该容器

使用

如果 Pod 运行所在的节点具有足够的可用资源,容器可以使用超出所设置的 request 资源量。不

过,容器不可以使用超出所设置的 limit 资源量

如果给容器设置了内存的 limit 值,但未设置内存的 request 值,Kubernetes 会自动为其设置与内

存 limit 相匹配的 request 值。 类似的,如果给容器设置了 CPU 的 limit 值但未设置 CPU 的

request 值,则 Kubernetes 自动为其设置 CPU 的 request 值 并使之与 CPU 的 limit 值匹配

总结:requests表示创建pod时预留的资源,limits表示pod能够使用资源的最大值。requests值

可以被超,limits值不能超过,如果是内存使用超过limits会触发oom然后杀掉进程,如果是cpu超

过limits会压缩cpu的使用率

官网示例:

https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

Pod 和 容器 的资源请求和限制

spec.containers[].resources.requests.cpu		//定义创建容器时预分配的CPU资源
spec.containers[].resources.requests.memory		//定义创建容器时预分配的内存资源
spec.containers[].resources.limits.cpu			//定义 cpu 的资源上限 
spec.containers[].resources.limits.memory		//定义内存的资源上限spec.containers[].resources.limits.hugepages-<size> 
spec.containers[].resources.requests.hugepages-<size>

1.资源限制的单位

1.1.CPU 资源单位

CPU 资源的 request 和 limit 以 cpu 为单位。Kubernetes 中的一个 cpu 相当于1个 vCPU(1个超

线程)

Kubernetes 也支持带小数 CPU 的请求。spec.containers[].resources.requests.cpu 为 0.5 的容器

能够获得一个 cpu 的一半 CPU 资源(类似于Cgroup对CPU资源的时间分片)。表达式 0.1 等价

于表达式 100m(毫核),表示每 1000 毫秒内容器可以使用的 CPU 时间总量为 0.1*1000 毫秒。

Kubernetes 不允许设置精度小于 1m 的 CPU 资源 

1.2.内存 资源单位 

内存的 request 和 limit 以字节为单位。可以以整数表示,或者以10为底数的指数的单位(E、P、

T、G、M、K)来表示, 或者以2为底数的指数的单位(Ei、Pi、Ti、Gi、Mi、Ki)来表示。

如:1KB=10^3=1000,1MB=10^6=1000000=1000KB,1GB=10^9=1000000000=1000MB

1KiB=2^10=1024,1MiB=2^20=1048576=1024KiB

例如:在买硬盘的时候,操作系统报的数量要比产品标出或商家号称的小一些,主要原因是标出的

是以 MB、GB为单位的,1GB 就是1,000,000,000Byte,而操作系统是以2进制为处理单位的,因

此检查硬盘容量时是以MiB、GiB为单位,1GiB=2^30=1,073,741,824,相比较而言,1GiB要比

1GB多出1,073,741,824-1,000,000,000=73,741,824Byte,所以检测实际结果要比标出的少一些。

案例

vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:name: frontend
spec:containers:- name: webimage: nginx                      #在两个容器下面都设置资源限制imagePullPolicy: IfNotPresentenv:- name: WEB_ROOT_PASSWORDvalue: "password"resources:                        #资源限制requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"- name: dbimage: mysqlimagePullPolicy: IfNotPresentenv:- name: MYSQL_ROOT_PASSWORDvalue: "abc123"resources:                     #资源限制,设置requests和limits中的memory数据一致会发生什么requests: memory: "256Mi"cpu: "0.5"limits:memory: "256Mi"cpu: "1"kubectl apply -f pod2.yaml
kubectl get pod -o wide -w

总结

  • cpu的单位可以是核个数如1.25,0.5等,可以是毫核如500m,1250m
  • memory的单位可以是128M或128Mi (分别是1000k=1M或1024Ki=1Mi)

二.关于QOS服务质量(pod的调度和驱逐有限制)

1.QoS服务质量分类

确定Pod的调度和驱逐优先级

  • Guaranteed:Pod中的每个容器(包括init容器),都设置了CPU、内存的 requests 和 limits,且 requests 和 limits 要相等
  • Burstable:Pod中至少有一个容器设置了CPU或内存的 requests
  • BestEffort:Pod中的所有容器都没有设置CPU或内存的 requests 和 limits 

2.驱逐顺序

优先级:Guaranteed > Burstable > BestEffort

  • Guaranteed的Pod,优先级最高,在其资源使用量不超过其 limits 的情况下,可以确保不被杀死
  • 在node节点的内存资源紧张,且没有其它QOS为BestEffort的Pod时,一旦Burstable的Pod使用的资源量超过了其 requests,这些Pod就容易被杀死
  • BestEffort的Pod,优先级最低,当node节点的内存资源紧张时,这些Pod会被最先杀死

三.关于pod容器的三种探针

健康检查:又称为探针(Probe),探针是由kubelet对容器执行的定期诊断。

1.探针的三种规则

存活探针(livenessProbe)

  • 探测Pod容器是否在正常运行。
  • 如果探测失败则kubelet杀掉容器,并根据容器的重启策略决定是否重启容器

exec检查方式

vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: pod-testname: pod-test
spec:containers:- image: soscscs/myapp:v1name: myappports:- containerPort: 80resources: {}command:- sh- -c- "touch /tmp/scj.txt; sleep 20; rm -f /tmp/scj.txt; sleep 3600"livenessProbe:            #存活探针exec:command:- sh- -c- "test -f /tmp/scj.txt"initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3dnsPolicy: ClusterFirstrestartPolicy: Always
status: {}kubectl apply -f pod3.yaml
kubectl get pod -o wide -w
kubectl describe pod pod-test

httpget检查方式

vim pod4.yaml
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: pod-testname: pod-test
spec:containers:- image: soscscs/myapp:v1name: myappports:- containerPort: 80name: httpresources: {}livenessProbe:               #存活探针  initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3httpGet:                   #httpget检查方式   port: httppath: /index.htmldnsPolicy: ClusterFirstrestartPolicy: Always
status: {}kubectl apply -f pod4.yaml
kubectl log pod-test

tcpSocket检查方式

vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: pod-testname: pod-test
spec:containers:- image: soscscs/myapp:v1name: myappports:- containerPort: 80resources: {}livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3dnsPolicy: ClusterFirstrestartPolicy: Always
status: {}kubectl apply -f pod3.yaml
kubectl exec -it pod-test -- netstat -lntp

就绪探针(readinessProbe)

  • 探测Pod是否能进入就绪状态(要求read状态栏是1/1 2/2),并做好接收service转发来的请求的准备                          
  • 如果探测失败则Pod变成未就绪状态(read状态栏是0/1 1/2),service会删除未就绪的Pod端点,并不再转发请求给未就绪的Pod
vim pod4.yaml
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: pod-testname: pod-test
spec:containers:- image: soscscs/myapp:v1name: myappports:- containerPort: 80name: httpresources: {}readinessProbe:            #就绪探针initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3httpGet:port: httppath: /scj.html        #目标目录中不存在这个文件livenessProbe:initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3httpGet:port: httppath: /index.htmldnsPolicy: ClusterFirstrestartPolicy: Always
status: {}

若想将状态变成就绪,如何操作?

kubectl exec -it pod-test -- sh
cd /usr/share/nginx/html/
echo 123 > scj.html    #创建这个文件后,就绪探针即可满足条件

启动探针(startupProbe)

  • 探测Pod容器内的应用进程是否启动成功。在启动探针探测成功前,存活探针和就绪探针都会处于赞同状态,直到启动探针探测成功为止
  • 如果探测失败则kubelet杀掉容器,并根据容器的重启策略决定是否重启容器
     
vim pod4.yaml
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: pod-testname: pod-test
spec:containers:- image: soscscs/myapp:v1name: myappports:- containerPort: 80name: httpresources: {}readinessProbe:initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3httpGet:port: httppath: /scj.htmllivenessProbe:initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3httpGet:port: httppath: /index.htmlstartupProbe:periodSeconds: 10failureThreshold: 12httpGet:port: httppath: /tan.htmldnsPolicy: ClusterFirstrestartPolicy: Always
status: {}

2.Probe支持三种检查方法

  • exec:在容器里执行指定的Linux命令,如果命令返回码为0则认为探测成功,如果命令返回码为非0值则认为探测失败
  • httpGet:向Pod的指定端口及URL路径发送HTTP GET请求,如果HTTP响应状态码为2XX 3XX则认为探测成功,如果HTTP响应状态码为4XX 5XX则认为探测失败
  • tcpSocket:向Pod的指定端口发送TCP连接请求(三次握手),如果端口正确且TCP连接成功则认为探测成功,如果TCP连接失败则认为探测失败

3.探测的三种结果

  • 成功(Success):表示容器通过了检测
  • 失败(Failure):表示容器未通过检测
  • 未知(Unknown):表示检测没有正常进行

4.常用参数

  • initialDelaySeconds:指定容器启动后延迟探测的时间(单位为秒)
  • periodSeconds:指定每次探测的间隔时间
  • failureThreshold:指定判断探测失败的连续失败次数
  • timeoutSeconds:指定探测超时等待的时间

四.pod容器的启动、退出动作

postStart:当容器创建后且容器进程启动之前(即容器主进程开始运行但不一定完全准备好接收

请求时),Kubernetes会尝试执行postStart。通常用来执行一些初始化任务,比如资源部署、环境

配置等。如果postStart钩子执行失败,容器仍然会被启动,并且kubelet不会因此重启容器。

我们可以通过lifecycle配置项在 Pod 定义的 spec.containers[*].lifecycle.postStart 字段中指定一个

命令或者 HTTP 请求。

preStop:当容器即将被kubelet终止时,Kubernetes会尝试执行preStop。这个钩子可以优雅地关

闭连接、保存状态或释放资源。kubelet会确保preStop被触发并至少已经开始执行。如果容器突然

崩溃(CrashLoopBackOff等情况),preStop可能无法得到执行。

preStop的执行与SIGTERM信号是异步的,也就是说如果PreStop钩子脚本执行时间超过这个优雅

期,Kubernetes将强制终止Pod。

我们同样可以通过 spec.containers[*].lifecycle.preStop 字段来设置执行命令或HTTP请求。

示例

vim pod-test.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-test7
spec:volumes:- name: scj-volhostPath:path: /data/scj/type: DirectoryOrCreateinitContainers:- name: myappimage: soscscs/myapp:v1volumeMounts:- name: scj-volmountPath: /mnt/                command:- sh- -c- "echo 'scj like 123 from initcontainer' >> /mnt/scj.txt"containers:- image: nginx:1.20name: nginxports:- containerPort: 80resources: {}volumeMounts:- name: scj-volmountPath: /usr/local/bin/       #将本地目录/data/scj/挂载到容器的/usr/local/bin/上lifecycle:postStart:                       #设置Pod容器启动时额外执行的操作exec:command:- sh- -c- "echo 'tangjun like from poststat' >> /usr/local/bin/scj.txt"preStop:                         #设置Pod容器被kubelet杀掉退出时执行的操作exec:command:- sh- -c- "echo 'jun like from prestop' >> /usr/local/bin/scj.txt"dnsPolicy: ClusterFirstrestartPolicy: Alwayskubectl apply -f pod-test.yaml

pod生命周期

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

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

相关文章

docker安装及使用

一、docker优点及作用 优点&#xff1a; 基础镜像MB级别创建简单隔离性强启动速度秒级移植与分享放便 作用&#xff1a;资源隔离 cpu、memory资源隔离与限制访问设备隔离与限制网络隔离与限制用户、用户组隔离限制 二、docker安装 2.1.配置yum源 yum install -y yum-uti…

Mysql开启SSL

等二测出未开启SSL,如下 have_openssl、have_ssl都是DISABLED也不知道当时为啥没开&#xff0c;看最近的都是开启的,整改必去得开了&#xff0c;开启步骤 1.生成秘钥 进入mysql的bin目录下&#xff0c;运行 ./mysql_ssl_rsa_setup运行后会生成证书 默认证书会在mysql的data…

主从备份(复制)

一、备份的三种类型 备份的三种主要类型包括热备份、逻辑备份和物理备份&#xff0c;每种备份类型都有其特定的应用场景和优缺点。 1. 热备份 定义&#xff1a; 热备份是在数据库或系统处于正常运行状态下进行的备份。这种备份方式允许在不停机的情况下对数据库或系统数据进…

【Python】Django Web 框架

一、常用的Web开发框架 1.Django Django是一个由Python写成的开放源代码的Web应用框架。这套框架的主要目标是使开发复杂、数据库驱动的网站变得简单。Django注重组件的重用性和“可拔插性”、敏捷开发和DRY(Dont Repeat Yourself)法则 2.Flask Flask是一个微型的Python开发…

反序列化靶机实战serial(保姆级教程)

一.信息收集 靶机地址下载&#xff1a;https://download.vulnhub.com/serial/serial.zip 打开靶机&#xff0c;在kali虚拟机中进行主机存活探测 可以知道靶机ip地址为192.168.133.171 然后扫描端口 可以发现有一个22端口跟80端口 然后接下来用kali扫描它的目录 可以发现有一…

Django-Oscar开发独立站/外贸商城教程与问题记录

​特别说明&#xff1a; 本博客为个人开发Django-Oscar时的经验总结&#xff0c;方便后期维护&#xff01;&#xff08;第一次这么认真的记录这种大型项目&#xff0c;打个广告吧&#xff1a;本人可接单算法程序开发&#xff0c;包含深度学习和图像相关……等相关&#xff09;…

Unity补完计划 之 音效

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 首先&#xff0c;音频这块组件较少&#xff0c;但是内容很重要&#xff0c;因为对于任何一款非特殊面向人群的游戏来说&a…

STM32入门三(开漏输出点亮外接的LED)

前面2章用的是推免输出&#xff0c; 推免输出: 输出端由两个晶体管构成&#xff1a;一个N沟道晶体管和一个P沟道晶体管。这两个晶体管一般不会同时导通&#xff0c;避免短路; 白话&#xff0c;就是输入高还是低&#xff0c;由你的GPIO 控制&#xff08;GPIO 输出高就高&#xf…

【LeetCode 1991 找到数组的中间位置 / LeetCode 724 寻找数组的中心下标】中间索引问题

1991 题目描述 暴力解法1&#xff1a; 思路&#xff1a; 遍历下标&#xff0c;求出左边和和右边和比较两边是否相等相等直接返回值没有符合的返回 -1 class Solution {public int findMiddleIndex(int[] nums) {int lennums.length;//初始化一个变量 midIndex 为 -1&#xff…

C# Unity 面向对象补全计划 七大原则 之 接口隔离原则 (ISP) 难度:☆ 总结:大接口分成小的,然后该干啥干啥

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 请看专栏&#xff1a;http://t.csdnimg.cn/mIitr&#xff0c;查漏补缺 1.接口隔离原则 (ISP) 这…

MySQL--查询数据

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。其基本格式为&#xff1a; select {* | <字段列表>}[from <表1>,&l…

贝壳找房:基于OceanBase构建实时字典服务的实践 | OceanBase案例

贝壳找房作为领先的居住服务综合平台&#xff0c;一直在推进居住产业的数字化与智能化升级。该平台通过汇聚并赋能优质的服务者&#xff0c;旨在为中国广大家庭带来涵盖二手房买卖、新房交易、房屋租赁、家装、家居以及家庭服务等全方位、高质量且高效的居住服务体验。 在贝壳…

0803实操-数字取证

0803实操-数字取证 易失性数据收集 创建应急工具箱&#xff0c;并生成工具箱校验和&#xff0c;能在最低限度地改变系统状态的情况下收集易失性数据。 数据箱 使用md5sums.exe对工具目录中的所有文件进行计算 获取计算机本地日期和时间。输入命令date/t>timefront.txt和…

鸿蒙图形开发【3D引擎接口示例】

介绍 本实例主要介绍3D引擎提供的接口功能。提供了ohos.graphics.scene中接口的功能演示。 3D引擎渲染的画面会被显示在Component3D这一控件中。点击按钮触发不同的功能&#xff0c;用户可以观察渲染画面的改变。 效果预览 使用说明 在主界面&#xff0c;可以点击按钮进入不…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——4Bin模型转化过程

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——4Bin模型转化过程 ​ 大家好&#xff0c;经过前几期的介绍&#xff0c;对于X3派上的Yolo模型部署&#xff0c;我们已经可以进行到最后一步了 ​ 今天给大家带来&#xff0c;转模型的关键步骤&#xff0…

学习进行到了第十七天(2024.8.5)

1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射&#xff0c;可以…

linux磁盘可视化分析工具

在 Linux 系统中&#xff0c;了解磁盘使用情况对于系统维护和优化至关重要。文件和目录随着时间的推移会占据大量磁盘空间&#xff0c;了解哪些部分占用的空间最多可以帮助我们更好地管理和清理磁盘。Baobab&#xff0c;也称为 GNOME Disk Usage Analyzer&#xff0c;是一款非常…

Radamsa:一款高性能通用模糊测试工具

关于Radamsa Radamsa是一款高性能的通用模糊测试工具&#xff0c;广大研究人员可以将其当作一个应用程序稳定性测试的测试用例生成工具。 工具运行机制 该工具使用简单&#xff0c;支持自定义脚本开发&#xff0c;可以用于测试程序对格式错误和潜在恶意输入的承受能力。它的工…

AGI思考探究的意义、价值与乐趣 Ⅴ

搞清楚模型对知识或模式的学习与迁移对于泛化意味什么&#xff0c;或者说两者间的本质&#xff1f;相信大家对泛化性作为大语言模型LLM的突出能力已经非常了解了 - 这也是当前LLM体现出令人惊叹的通用与涌现能力的基础前提&#xff0c;这里不再过多赘述&#xff0c;但仍希望大家…

国标GB28181视频平台LntonCVS视频融合共享平台视频汇聚应用方案

近年来&#xff0c;国内视频监控应用迅猛发展&#xff0c;系统接入规模不断扩大&#xff0c;导致了大量平台提供商的涌现。然而&#xff0c;不同平台的接入协议千差万别&#xff0c;使得终端制造商不得不为每款设备维护多个不同平台的软件版本&#xff0c;造成了资源的严重浪费…