k8s之pod进阶---资源限制与探针

news2025/2/27 17:10:25

目录

一、资源限制

 二、探针(健康检查)

2.1 含义

2.2 探针的三种规则

2.3 probe支持三种检查方法

2.4 探针的示例

1、存活探针:livenessProbe

(1)exec方式

(2)httpGet方式

(3)tcpsocket方式

2、就绪探针:readinessProbe

(1) 就绪探针1

(2) 就绪探针2

 3、startupProbe


一、资源限制

容器中的程序要运行,肯定是要占用一定资源的,比如cpu和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。 针对这种情况,kubernetes提供了对内存和cpu的资源进行配额的机制,这种机制主要通过resources选项实现,他有两个子选项:

limits: 用于限制运行时容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启

requests : 用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动 内存资源单位

内存的request 和limit 以字节为单位,可以整数表示,或者以10为底数的指数的单位(E、P、T、G、M、K)来表示,或者以2 为底数的指数来表示(Ei、Pi、Ti、Gi、Mi、Ki)来表示。 cpu的单位如果为0.5,表示该容器能获取的一个Cpu的一半,(类似于Cgroup对cpu的资源的时间分片),表达式0.1等价于表达式100m(毫核),表示每1000毫秒内容器可以使用cpu时间总量为100号秒。

k8s中会根据预选和优选的策略,就是预选和优选cpu和内存大小,会把不符合的首先剔除,然后再选能保证最小基本运行的。

编辑一个yaml配置文件

vim pod2.yaml

[root@master01 ziyuan]# kubectl apply -f pod1.yaml
pod/frontend created


#查看刚刚创建的pod,frontend所在的节点服务器,在node01
[root@master01 ziyuan]# kubectl get pods -owide
NAME        READY   STATUS             RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
frontend    2/2     Running            0          29m   10.244.1.73   node01   <none>           <none>


#查看节点01的详细信息,包含cpu,内存资源等信息,验证资源限制是否成功
[root@master01 ziyuan]# kubectl describe nodes node01

 二、探针(健康检查)

2.1 含义

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

2.2 探针的三种规则

        (1)livenessProbe

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

        (2)readinessProbe

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

        (3)startupProbe

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

2.3 probe支持三种检查方法

        (1)exec

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

        (2)tcpSocket

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

        (3)httpGet

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

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

成功:容器通过了诊断。

失败:容器未通过诊断。

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

2.4 探针的示例

1、存活探针:livenessProbe

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

(1)exec方式

编辑exec.yaml配置文件

vim exec.yaml

(2)httpGet方式

编辑httpget.yaml配置文件

vim httpget.yaml

[root@master01 ziyuan]# kubectl create -f httpget.yaml
pod/liveness-httpget created

查看刚刚创建的pod
[root@master01 ziyuan]# kubectl get pods
NAME               READY   STATUS             RESTARTS   AGE
frontend           2/2     Running            0          77m
ky30               0/1     Error              0          21h
liveness-exec      1/1     Running            7          12m
liveness-httpget   1/1     Running            0          38s
myapp-pod          1/1     Running            8          24h
pod-demo2          0/1     CrashLoopBackOff   87         22h


#进入liveness-httpgetpod中,并删除index.html文件进行测试
[root@master01 ziyuan]# kubectl exec -it liveness-httpget -- rm -rf /usr/share/nginx/html/index.html

#再次查看刚刚创建的pod,发现因为刚刚删除过index.html文件了,导致pod中的容器重启
[root@master01 ziyuan]# kubectl get pods
NAME               READY   STATUS             RESTARTS   AGE
frontend           2/2     Running            0          77m
ky30               0/1     Error              0          21h
liveness-exec      1/1     Running            7          12m
liveness-httpget   1/1     Running            1          42s
myapp-pod          1/1     Running            8          24h
pod-demo2          0/1     CrashLoopBackOff   87         22h
#查看刚刚创建的pod中容器的ip地址
[root@master01 ziyuan]# kubectl describe pod liveness-httpget

(3)tcpsocket方式

编辑tcpsocket.yaml配置文件

[root@master01 ziyuan]# vim tcpsocket.yaml

[root@master01 ziyuan]# kubectl create -f tcpsocket.yaml
pod/probe-tcp created
#这段输出表明在名为 "probe-tcp" 的 Pod 中,有一个正在监听 80 端口的 TCP 连接,该连接与 Nginx 服务器的主进程相关。这是一个常见的网络配置,用于接受来自客户端的 HTTP 请求。但是刚刚配置文件中指定的探测的端口是8080,所以探测失败,会重新再次探测。因为failureThreshold的值设置为2,所以当连续两次探测失败后,就会重启容器。
[root@master01 ziyuan]# kubectl exec -it probe-tcp -- netstat -natp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro

 

2、就绪探针:readinessProbe

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

(1) 就绪探针1
vim readness-httpget.yaml

[root@master01 jiuxu]# kubectl create -f readness-httpget.yaml
pod/readliness-httpget created

[root@master01 jiuxu]# kubectl describe pod readliness-httpget

(2) 就绪探针2
vim demo01-readness-myapp.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp1
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: readiness-http-container
    image: soscscs/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    readinessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10

---
apiVersion: v1
kind: Pod
metadata:
  name: myapp2
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: readiness-http-container
    image: soscscs/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    readinessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10

---
apiVersion: v1
kind: Pod
metadata:
  name: myapp3
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: readiness-http-container
    image: soscscs/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    readinessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp

[root@master01 jiuxu]# kubectl apply -f demo01-readness-myapp.yaml
pod/myapp1 created
pod/myapp2 created
pod/myapp3 created
service/myapp-svc created

#删除其中之一pod容器的html页面,使其就绪探针readiness探测失败
[root@master01 jiuxu]# kubectl exec -it myapp2 -- rm -rf /usr/share/nginx/html/index.html

 3、startupProbe

spec.container.lifecycle.postStart 配合 exec.command 字段 当容器启动时,会执行的额外操作。

spec.container.lifecycle.postStop 配合 exec.command 字段 当容器退出时,会执行的操作。

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

[root@master01 jiuxu]# vim demo2-start-up.yaml

[root@master01 jiuxu]# kubectl create -f demo2-start-up.yaml
pod/lifecycle-demo created

#删除pod
[root@master01 jiuxu]# kubectl delete pod lifecycle-demo
pod "lifecycle-demo" deleted

三、pod生命周期的状态

  • 挂起(Pending):apiserver已经创建了pod资源对象,但它尚未被调度完成或者仍处于下载镜像的过程中。
  • 运行中(Running):pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成。
  • 成功(Succeeded):pod中的所有容器都已经成功终止并且不会被重启。
  • 失败(Failed):所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态。
  • 未知(Unknown):apiserver无法正常获取到pod对象的状态信息,通常由网络通信失败所导致。

 

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

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

相关文章

百度 | 文心一言也开始收费了

好久没用文心一言了 之前一直用ChatGPT的 今天打开文心一言一看&#xff0c;好家伙 出了文心大模型4.0&#xff0c;想体验一下来着 可惜是收费的 看下价格&#xff0c;没买 50块钱一个月&#xff0c;对比ChatGPT4来说&#xff0c;确实不算贵 毕竟gpt4一个月20美刀 &#xff0c;…

CEYEE希亦新品洗地机Pro系列发布, 领跑行业的「水汽混动」技术的旗舰新杰作

CEYEE希亦全新一代洗地机T800 PRO正式上市&#xff0c;采用双滚刷&#xff0c;双倍活水洗拖洗方式&#xff0c;达到拖一遍抵两遍&#xff0c;相对于10倍洁净效果&#xff01; 这款希亦Pro系列产品不仅刷新了洗地机行业技术水准&#xff0c;满足了用户愈发极致的清洁效能追求&a…

小白学习必看,NAS网络存储详细学习

NAS&#xff08;Network Attached Storage&#xff1a;网络附属存储&#xff09;按字面简单说就是连接在网络上&#xff0c;具备资料存储功能的装置&#xff0c;因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心&#xff0c;将存储设备与服务器彻底分离&…

急诊医学科常用评估量表汇总,建议收藏!

根据急诊医学科医生的量表使用情况&#xff0c;笔者整理了10个急诊医学科常用量表&#xff0c;可在线评测直接出结果&#xff0c;可转发使用&#xff0c;可生成二维码使用&#xff0c;可创建项目进行数据管理&#xff0c;有需要的小伙伴赶紧收藏&#xff01; 1.急性生理学与慢性…

11月的『备考学习计划』+高效的作息时间表 超好用~

每日作息时间表 每天有三个时间段学习效率高 上午10点左右 下午4点左右 晚上8点-10点左右 坚持住了&#xff0c;学习效果事半功倍 有同感的同学 可以举举手&#x1f91a;&#xff0c;点点赞&#x1f493; 每日作息时间表 6:30-7:00起床 6:30---7:00是起床的最佳时刻&am…

报错-TypeError: Cannot read properties of undefined (reading ‘url‘)

背景&#xff1a;使用pinia进行状态管理&#xff0c;优化接口调用请求时&#xff0c;报错 TypeError: Cannot read properties of undefined (reading url) TypeError:无法读取未定义的属性&#xff08;读取“url”&#xff09; 解决&#xff1a;花括号的属性未定义&#xf…

人工智能基础_机器学习013_三种梯度下降对比_线性回归梯度下降更新公式_对梯度下降函数求偏导数_得到---人工智能工作笔记0053

这里批量梯度下降,就是用准备的所有样本数据进行梯度下降计算. 然后小批量梯度下降就是使用比如我一共有500个样本,那么我从中拿出50个样本进行梯度下降计算. 然后随机梯度下降,更厉害, 从一共有500个样本中,随机的取一个样本进行梯度下降计算, 首先我们看批量梯度下降,使用…

如何在 Photoshop 中使用位图模式制作自定义音乐海报

如何在 Photoshop 中使用位图创建炫酷的音乐海报设计。 1.如何设置新的 Photoshop 文件 步骤1 在 Photoshop中&#xff0c;转到 “文件”>“新建”。将文档命名为 “音乐海报”。 将宽度设置 为 1270 px &#xff0c; 高度 设置为 1600 px。将分辨率 设置 为 72 像素/英寸…

【案例】3D地球(vue+three.js)

需要下载插件 <template><div class"demo"><div id"container" ref"content"></div></div> </template> <script> import * as THREE from three; // import mapJSON from ../map.json; import { Or…

【笔记】Arrays.binarySearch()实践,以及需要注意的一些问题点

背景&#xff1a;我想校验一个指定的String字符串&#xff0c;是否存在于另一个String数组中&#xff0c;选择Arrays.binarySearch()方法实现&#xff0c;代码如下&#xff1a; String[] item {"0","1","16","1591","1594"…

Java程序员面试核心知识--Java基础知识(一)

目录 一、Java程序初始化顺序 二、Java的Clone方法作用 三、 OverLoad&#xff08;重载&#xff09;与Override&#xff08;重写&#xff09;区别 四、abstract class&#xff08;抽象类&#xff09;与interface&#xff08;接口&#xff09;的异同 五、String、StringBuf…

行业追踪,2023-11-01

自动复盘 2023-11-01 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

【腾讯云 HAI域探秘】宝妈也能快速入门AI绘画

活动背景 本次活动是由腾讯云和CSDN联合推出的开发者技术实践活动。我通过技术交流直播、动手实验、征文等形式&#xff0c;深入沉浸式体验腾讯云高性能应用服务 HAI。从活动中汲取到技术上的精华。在本次活动中&#xff0c;只要完成各个环节任务&#xff0c;不仅可以参与 AIGC…

嵌入式每日500(2)231102 (GPIO外设)

文章目录 1.GPIO外设介绍&#xff08;老生常谈的那些东西&#xff09;2.GPIO的寄存器&#xff08;9个&#xff09;3.GPIO的类型定义&#xff08;结构体和枚举&#xff09;4.GPIO常量定义&#xff08;GPIO_PIN,GPIO_MODE,GPIO_SPEED,GPIO_PULL&#xff09;5.GPIO函数定义&#x…

echarts 画散点图, x周,y周在指定位置标志一下

文章目录 echarts 画散点图&#xff0c; x周&#xff0c;y周在指定位置标志一下示例一例子二示例三 echarts 画散点图&#xff0c; x周&#xff0c;y周在指定位置标志一下 示例一 let scatterData {data: [[[-0.2, -0.6],[0.4, 0.3],[0.1, 0.4],[0.3, 0.5],[0.09, 0.1],[0.7,…

仿东郊到家按摩小程序app开发搭建

最新版的仿东郊到家按摩小程序&#xff0c;支持上门服务系统&#xff0c;全开源&#xff0c;并且支持公众号、小程序和app。前端使用uniapp&#xff0c;后端使用php&#xff0c;价格合理。用户端功能模块包括技师选择、预约服务、优惠券、订单等&#xff0c;还有意见功能和城市…

Java多线程篇(13)——FutureTask、Disruptor的使用

文章目录 FutureTaskCompletionServiceCompletableFuture DisruptorDisruptor 核心概念运行流程不同生产者模式的区别Disruptor设计精髓 FutureTask 现有一个场景&#xff0c;10个线程执行10个任务&#xff0c;然后主线程获取任务结果。 比较广泛的一个说法就是&#xff0c;r…

代码随想录算法训练营第三十九天丨 动态规划part02

62.不同路径 思路 动态规划 机器人从(0 , 0) 位置出发&#xff0c;到(m - 1, n - 1)终点。 按照动规五部曲来分析&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#…

【每日一题】参加会议的最多员工数

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;内向基环树拓扑排序分类讨论内向基环树分类讨论基环长度大于 2基环长度等于 2 功能实现 写在最后 Tag 【内向基环树拓扑排序分类讨论】【图】【2023-11-01】 题目来源 2127. 参加会议的最多员工数 题目解读 员工只有…

阿昌教你如何优雅的数据脱敏

阿昌教你如何优雅的数据脱敏 Hi&#xff0c;我是阿昌&#xff0c;最近有一个数据脱敏的需求&#xff0c;要求用户可自定义配置数据权限&#xff0c;并对某种类型数据进行脱敏返回给前端 一、涉及知识点 SpringMVCJava反射Java自定义注解Java枚举 二、方案选择 1、需求要求…