pod进阶

news2024/12/25 9:28:50

一.资源限制

当定义 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值匹配。

官网示例:kubernetes.io/docs/concep…

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

  • 定义创建容器时预分配的CPU资源:spec.containers[].resources.requests.cpu

  • 定义创建容器时预分配的内存资源:spec.containers[].resources.requests.memory

  • 定义cpu的资源上限:spec.containers[].resources.limits.cpu

  • 定义内存的资源上限:spec.containers[].resources.limits.memory

1.2 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.3 内存资源单位

内存的 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

PS:在买硬盘的时候,操作系统报的数量要比产品标出或商家号称的小一些,主要原因是标出的是以MB、GB为单位的,1GB就是1,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,所以检测实际结果要比标出的少一些。

1.4 示例:

修改数据库的资源限制

执行yaml文件创建pod

查看pod的状态(OOMKilled是指内存不够的情况)

修改yaml文件,给数据库足够的资源

查看资源使用情况

二.健康检查:又称为探针(Probe)

探针是由kubelet对容器执行的定期诊断。

2.1 探针的三种规则

  • livenessProbe:判断容器是否正在运行。如果探测失败,则kubelet会杀死容器,并且容器将根据restartRolicy来设置Pod状态。如果容器不提供存活探针,则默认状态为Success。

  • readinessProbe:判断容器是否准备好接受请求。如果探测失败,端点控制器将从与 pod 匹配的所有 service endpoints中剔除删除该Pod的IP地址。初始延迟之前的就绪状态默认为Failure。如果容器不提供就绪探针,则默认状态为Success。

  • startupProbe(这个1.17版本增加的):判断容器内的应用程序是否已启动,主要针对于不能确定具体启动时间的应用。如果配置了startupProbe探测,在则在startupProbe状态为Success之前,其他所有探针都处于无效状态,直到它成功后其他探针才起作用。如果startupProbe失败,kubelet将杀死容器,容器将根据restartPolicy来重启。如果容器没有配置 startupProbe,则默认状态为Success。

注:以上规则可以同时定义。在readinessProbe检测成功之前,Pod的running状态是不会变成ready状态的。

2.2 Probe支持三种检查方法

  • exec:在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功。

  • tcpSocket:对指定端口上的容器的IP地址进行TCP检查(三次握手)。如果端口打开,则诊断被认为是成功的。

  • httplet:对指定的端口和路径上的容器的IP地址执行HTTPGet请求。如果响应的状态码大于等于200且小于400,则诊断被认为是成功的

2.3 每次探测都将获得以下三种结果之一

  • 成功:容器通过了诊断。

  • 失败:容器未通过诊断。

  • 未知:诊断失败,因此不会采取任何行动

官网示例:kubernetes.io/docs/tasks/…

2.4示例:

exec方式

initialDelaySeconds:指定kubelet 在执行第一次探测前应该等待5秒,即第一次探测是在容器启动后的第6秒才开始执行。默认是0秒,最小值是0

  • periodSeconds:指定了kubelet 应该每5秒执行一次存活探测。默认是10秒。最小值是1

  • failureThreshold:当探测失败时,Kubernetes 将在放弃之前重试的次数。存活探测情况下的放弃就意味着重新启动容器。就绪探测情况下的放弃 Pod会被打上未就绪的标签。默认值是3。最小值是1。

  • timeoutSeconds:探测的超时后等待多少秒。默认值是1秒。最小值是1。(在Kubernetes 1.20 版本之前,exec探针会忽略timeoutSeconds探针会无限期地持续运行,甚至可能超过所配置的限期,直到返回结果为止。)

可以看到 pod 中只有一个容器。kubelet 在执行第一次探测前需要等待5秒,kubelet 会每5秒执行一次存活探测。kubelet在容器内执行命令cat /tmp/healthy来进行探测。如果命令执行成功并且返回值为 0,kutbelet就会认为这个容器是健康存活的。当到达第 31秒时,这个命令返回非0值,kubelet会杀死这个容器并重新启动它。

测试过程(使用存活探针)

这里直接复制前面的demo1.yaml文件进行使用,修改demo3.yaml文件

执行yaml文件

查看pod详细信息

httpGet方式

在这个配置文件中,可以看到Pod 也只有一个容器。initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待3秒。periodSeconds 字段指定了kubelet每隔3秒执行一次存活探测。kubelet 会向容器内运行的服务(服务会监听8080端口)发送一个HTTP GET请求来执行探测。如果服务器上/healthz路径下的处理程序返回成功代码,则 kubelet 认为容器是健康存活的。如果处理程序返回失败代码,则kubelet 会杀死这个容器并且重新启动它。

任何大于或等于200并且小于400 的返回代码表示成功,其它返回代码都表示失败。

测试过程(使用存活探针)

直接复制前面的demo3.yaml文件进行使用,修改demo4.yaml文件

执行yaml文件

查看pod的日志记录

删除index.html文件

重启后再次查看日志,又能探测成功

原因:K8S 中不支持重启 Pod资源,只有删除重建。由于还是基于同一个镜像,所以又恢复到index.html违背删除的状态。

tcpSocket方式

这个例子同时使用readinesspProbe和 livenessProbe 探测。kubelet会在容器启动5秒后发送第一个readinessProbe探测。这会尝试连接 gproxy 容器的 8080端口。如果探测成功,kubelet 将继续每隔10秒运行一次检测。除了readinessProbe 探测,这个配置包括了一个livenessProbe 探测。kubelet 会在容器启动15秒后进行第一次 livenessProbe 探测。就像readinessProbe 探测一样,会尝试连接goproxy容器的 8080端口。如果livenessProbe探测失败,这个容器会被重新启动。

测试过程1(使用存活探针)

直接复制前面的demo4.yaml文件进行使用,修改demo5.yaml文件

执行yaml文件

查看pod详细信息

测试过程2(使用就绪探针和存活探针,且两个探针参数不同)

直接复制前面的demo4.yaml文件进行使用,修改demo6.yaml文件

执行yaml文件

查看pod的日志记录

在nginx的默认根目录/usr/share/nginx/html/下,创建abc.html

删除index.html文件,存活探针探测失败,容器进行重启,重启后又无法进入ready状态,因为重建后的pod中abc.html又不存在了

三.启动、退出动作

  • spec.containers.lifecycle.postStart:配置exec.command字段设置Linux命令,实现当应用容器启动时,会执行的额外操作

  • spec.containers.lifecycle.preStop:配置exec.command字段设置 Linux命令,实现当应用容器退出时,会执行的最后一个操作

创建demo7.yaml,当前node节点还都没有/data/volumes/nginx/log/

执行yaml文件,等待pod进入Running状态

去pod所在node节点查看,/data/volumes/nginx/log/存在

删除pod,再查看message文件

总结

Pod容器资源限制

request:设置Pod容器创建时需要预留的资源量,容器所需资源的下限<——request <——容器所需资源的上限

spec.template.spec.containers.resources.requests.cpu/memory

limit:设置Pod容器能够使用的资源量的上限

spec.template.spec.containers.resources.limits.cpu/memory

  • CPU资源量单位:cpu数,比如0.1、0.5、1、2﹔毫核,100m、500m、1000m、2000m

  • 内存资源量单位:2为底数的单位,Ki、Mi、Gi、Ti,默认单位使用字节

查看pod或者node 的资源量使用情况:kubectl describe pod/node XXX

Pod容器的探针(健康检查)3种

  • 存活探针livenessProbe)探测容器是否运行正常。如果探测失败则kubelet杀掉容器(不是pod),容器会根据重启策略决定是否重启

  • 就绪探针readinessProbe)探测Pod是否能够进入READY状态,并做好接收请求的准备。如果探测失败Pod 则会进入NOTREADY状态(READY为0/1)并且从所关联的service资源的端点(endpoints)中踢出,service将不会再把访问请求转发给这个Pod

  • 启动探针startupProbe)探测容器内的应用是否启动成功,在启动探针探测成功之前,其它类型的探针都会暂时处于禁用状态

:启动探针只是在容器启动后按照配置满足一次后就不再进行后续的探测了。存活探针和就绪探针会一直探测到Pod生命周期结束为止

3种探测方式

  • exec:通过command字段设置在容器内执行的Linux命令来进行探测,如果命令返回码为0,则认为探测成功,返回码非0则探测失败

  • httpGet:通过向容器的指定端口和uri路径发起HTTP GET请求,如果HTTP返回状态码为>=200或<400的人(2XX,3XX),则认为探测成功,返回状态码为4XX,5XX则探测失败

  • tcpSocket:通过向容器的指定端口发送tcp三次握手连接,如果端口正确却tcp连接成功,则认为探测成功,tcp连接失败则探测失败

常用探针参数

  • initialDelaySeconds:容器启动后延迟几秒探测

  • periodseconds:每次探测的间隔时间

  • failureThreshold:探测失败重试的次数

Pod容器的启动和退出动作

  • spec.containers.lifecycle.postStart:配置exec.command字段设置Linux命令,实现当应用容器启动时,会执行的额外操作

  • spec.containers.lifecycle.preStop:配置exec.command字段设置 Linux命令,实现当应用容器退出时,会执行的最后一个操作

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

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

相关文章

C++Primer16.1.6节练习

练习16.28&#xff1a; 简易的shared_ptr代码如下 #include <iostream> #include <vector> #include <list> using namespace std;//shared_ptr模板 template<typename T>class SharedPtr {friend SharedPtr<T>& MakeShared(T* t); public…

docker部署MySQL主从服务

一.主从同步流程关于MySQL主从复制主要同步的是binlog日志&#xff0c;涉及到三个线程&#xff0c;一个运行在主节点&#xff08;log dump thread&#xff09;&#xff0c;其余两个(I/O thread, SQL thread)运行在从节点&#xff0c;如下图所示:当主库数据发生变更时&#xff0…

【JavaWeb】EL表达式(191-202)

191.EL表达式-什么是EL表达式&#xff0c;以及它的作用 什么是 EL 表达式&#xff0c;EL 表达式的作用? EL 表达式的全称是&#xff1a;Expression Language。是表达式语言。 EL 表达式的什么作用&#xff1a;输出&#xff0c;EL 表达式主要是代替 jsp 页面中的表达式脚本在…

第三章 opengl之纹理

OpenGL纹理纹理环绕方式纹理过滤多级渐远纹理加载和创建纹理stb_image.h生成纹理纹理的应用纹理单元纹理 用stb_image.h库&#xff0c;原先用SOIL库也可以实现。 可以为每个顶点添加颜色来增加图形的细节。但是想得到一个真实的图形&#xff0c;需要足够多的顶点&#xff0c;…

定时任务调度方案——Xxl-Job

定时任务调度方案 随着系统规模的发展&#xff0c;项目的组织结构以及架构越来越复杂&#xff0c;业务覆盖的范围越来越广&#xff0c;定时任务数量日益增多&#xff0c;任务也变得越来越复杂&#xff0c;尤其是为了满足在用户体量日历增大时&#xff0c;系统能够稳定运行&…

汽车改色避坑指南

关于汽车改色&#xff0c;真的不是只看颜色看价格那么简单。 如何选择一家靠谱的改色店&#xff1f;要看这家店是否正规&#xff0c;是否有完备的售后和质保流程&#xff0c;后续剐蹭、磕碰、划痕是否可以修复&#xff1f;是否提前告知注意事项&#xff0c;以及改色后备案流程&…

浅谈车载测试之智能座舱人机交互

1、引言 目前&#xff0c;汽车不仅在动力源、驱动方式和驾驶体验上发生了变化&#xff0c;驾驶舱也告别了传统的枯燥机械和电子空间&#xff0c;智能化水平飙升&#xff0c;成为继家庭和办公室以外人们生活之后的“第三空间”。通过人脸&#xff1b;指纹识别、语音 / 手势交互…

【线程-J.U.C】

Lock J.U.C最核心组件&#xff0c;Lock接口出现之前&#xff0c;多线程的并发安全只能由synchronized处理&#xff0c;但java5之后&#xff0c;Lock的出现可以解决synchronized的短板&#xff0c;更加灵活。 Lock本质上是一个接口&#xff0c;定义了释放锁&#xff08;unlock&…

解决:centos7如何解决网络不可达和wget: 无法解析主机地址 “downloads.mysql.com”

遇到此类问题可能会有多重解决方法&#xff0c;需要一个一个的去排除。 1、查看自己的网络设置是不是设置的NAT模式&#xff0c;设置完成后再去ping一下网络地址。 2、ping一下百度看能不能拼成功&#xff0c;下图是ping成功的样式。&#xff08;如果不行继续往下走&#xff0…

牛客sql题目练习

Sql3描述 题目&#xff1a;现在运营需要查看用户来自于哪些学校&#xff0c;请从用户信息表中取出学校的去重数据。 示例:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing42315femal…

PowerShell攻击指南

文章目录一&#xff1a;PowerShell简介1.1&#xff1a;基本概念1.2&#xff1a;执行策略与绕过1.3&#xff1a;常用命令二&#xff1a;PowerSploit2.1&#xff1a;PowerSploit安装2.2&#xff1a;PowerSploit攻击实战2.2.1&#xff1a;直接shellcode反弹meterpreter shell2.2.2…

【C/C++每日一练】总目录(不断更新中...)

C/C 2023.03 20230303 1. 字符串相乘 ★★ 2. 单词拆分 II ★★★ 3. 串联所有单词的子串 ★★★ 20230302 1. 个位数是6&#xff0c;且能被3整除的五位数共有多少个&#xff1f; ☆ 2. 不同方式求n的阶乘 ★ 3. 报数游戏 ★☆ 20230301 1. 冒泡排序法排序 ★ …

视频号频出10w+,近期爆红的账号有哪些?

回顾2月&#xff0c;视频号持续放出大动作&#xff0c;不仅进行了16小时不间断的NBA全明星直播&#xff0c;还邀请国际奥委会入驻&#xff0c;分享奥运的最新资讯。视频号成为越来越多官方机构宣传推广的有效渠道。官方积极入驻&#xff0c;内容创作生态也在同步繁荣发展&#…

中村成洋《垃圾回收的算法与实现》PDF 读书笔记

观前提醒 为了能够锻炼自己&#xff0c;我会查阅大量外文不停的修改内容&#xff0c;少部分会提示成中文。 可能有误&#xff0c;请见谅 提示&#xff1a;若是觉得阅读困难&#xff0c;可以看如下内容 脚本之家可获取&#xff0c;若失效可私信浏览器的沙拉查词扩展&#xf…

Shell脚本学习指南 - 第二章入门篇

shell脚本的第一行#! #! /bin/awk -f 内核会扫描文件开头的#!后面内容&#xff0c;跳过所有空白符号&#xff0c;寻求可以用来执行程序的解释器的full path和option&#xff08;option后面的空格会识别&#xff09; ; shell用分号隔开多条语句 & 后台执行该命令&#xff…

ChatGPT解答:JavaScript保存当前网页页面图片为pdf文件或者word文件,前端用vue2,给出详细的方案和代码

ChatGPT解答&#xff1a;JavaScript保存当前网页页面图片为pdf文件或者word文件&#xff0c;前端用vue2&#xff0c;给出详细的方案和代码 ChatGPTDemo Based on OpenAI API (gpt-3.5-turbo). JavaScript保存当前网页页面图片为pdf文件或者word文件&#xff0c;前端用vue2&am…

Python 操作Redis

在 Python中我们使用 redis库来操作 Redis数据库。Redis数据库的使用命令这里就不介绍了。 需要安装 redis库。检查是否安装redis&#xff1a; pip redis 如果未安装&#xff0c;使用 pip命令安装 redis。 pip install redis #安装最新版本 一、Redis连接 Redis提供两个类 Re…

CEC2021:鱼鹰优化算法(Osprey optimization algorithm,OOA)求解CEC2021(提供MATLAB代码

一、鱼鹰优化算法简介 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕食行为。 鱼鹰是鹰形目、鹗科、鹗属的仅有的一种中型猛禽。雌雄相似。体长51-64厘米…

2023年“楚怡杯“湖南省职业院校技能竞赛“网络安全”竞赛任务书

2023年“楚怡杯“湖南省职业院校技能竞赛“网络安全”竞赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 …

技术官方文档中的代码是用什么展示的?代码高亮插件总结

****内容预警****菜鸟教程***大佬绕道我们经常看到各种技术官方文档&#xff0c;有很多代码展示的区域&#xff0c;用于我们复制粘贴代码&#xff0c;比如vue 的官网当我们需要自己实现这么一个网站的时候&#xff0c;我就开始手忙脚乱&#xff0c;这到底是咋实现的&#xff1f…