k8s之POD资源限制和健康监测

news2024/11/16 13:47:43

写在前面

本文一起看下POD的资源限制配置和健康监测的相关内容。

在这里插入图片描述

1:资源限制

如果是不对POD设置资源限制的话,若任由其占用系统资源,可能会造成非常严重的后果,所以我们需要根据具体情况来设置资源限制,如使用多少内存,多少CPU,多少IOPS等,实现这些限制使用的是cgroup技术,而配置这些限制使用到属性是resources。在看具体的例子之前需要先来看下cpu资源的表示方法,cpu标识的最小单位是0.001m,这里的m是milli的意思,1000m就代表使用一个cpu,500m就代表0.5cpu,具体配置cpu限制的话使用XmX这种,后者是直接指定使用CPU的个数。如下yaml:

apiVersion: v1
kind: Pod
metadata:
  name: ngx-pod-resources

spec:
  containers:
  - image: nginx:alpine
    name: ngx

    resources:
      requests:
        cpu: 10m
        memory: 100Mi
      limits:
        cpu: 20m
        memory: 200Mi

通过requests配置初始时需要0.01cpu,100MB内存,通过limits配置最多只能申请0.02cpu,200MB内存,如果超过最大限制则会被强制停止。配置了资源限制后,k8s会根据每个Node的剩余资源情况来将POD分配到合适的Node上,尽量的将Node的资源榨取干净。这个过程有些类似于俄罗斯方块,每个方块是分配到某Node上的POD,如下图:

在这里插入图片描述

如果我们申请的资源集群中所有的Node都无法满足会发生什么呢?比如定义如下申请10个CPU的yaml:

dongyunqi@mongodaddy:~/k8s$ cat appy-10-cpu.yml 
apiVersion: v1
kind: Pod
metadata:
  name: ngx-pod-resources

spec:
  tolerations:
  - key: node-role.kubernetes.io/master
    effect: NoSchedule
    operator: Exists
  containers:
  - image: nginx:alpine
    name: ngx

    resources:
      requests:
        cpu: 10
        memory: 100Mi
      limits:
        cpu: 20
        memory: 200Mi

apply后查看:

dongyunqi@mongodaddy:~/k8s$ kubectl get pod | egrep 'NAME|ngx-pod-resources'
NAME                           READY   STATUS    RESTARTS   AGE
ngx-pod-resources              0/1     Pending   0          52s

可以看到其处于PENDING状态,describe查看:

dongyunqi@mongodaddy:~/k8s$ kubectl describe pod ngx-pod-resources
...
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  22s                default-scheduler  0/2 nodes are available: 2 Insufficient cpu.

0/2 nodes are available: 2 Insufficient cpu.的意思是2个node中有0个可用,2个都是因为没有足够的CPU资源导致不可用。

2:健康监测

对于k8s来说,应用就像是一个黑盒子,只能知道其启动了,运行中,停止了,但是到底是不是能够正常的对外提供服务,k8s是不知道的,因此应用就不能是一个黑盒子,要是一个灰盒子,必须能够让k8s获取应用的一些信息,为此应用需要预留一些口子给k8s使用,这个过程有点类似于核酸检测,护士姐姐使用棉签从我们的口腔中蘸取唾液。这个k8s从预留的口子中获取信息的过程,我们叫做是探针 probe,或者叫做探测器,但我觉得叫做探针则更加形象准确。当前k8s定义了3中探针,如下:

startup:加载各种配置文件后启动成功,如spring加载器配置文件后启动
liveness:startup之后进入的状态,但此时可能因为一些初始化工作还没有完成,还不能对外服务,如加载MySQL中的数据到缓存中
ready:liveness之后的状态,进入该状态,则应用就可以正常的对外提供服务了

可以看到k8s对于探针的定义还是比较细的,参考下图:
在这里插入图片描述

三种探针在失败时k8s的处理方式也不尽相同,如下:

startup失败:重启容器,不会启动后续的探针检测
liveness失败:重启容器,不会进行后的探针检测
ready失败:认为POD无法对外提供服务,会将其排除在集群之外

如下图:
在这里插入图片描述

那么该如何使用探针呢?3中探针的定义都是一样的,主要的属性如下:

periodSeconds,执行探测动作的时间间隔,默认是 10 秒探测一次。
timeoutSeconds,探测动作的超时时间,如果超时就认为探测失败,默认是 1 秒。
successThreshold,连续几次探测成功才认为是正常,对于 startupProbe 和 livenessProbe 来说它只能是 1。
failureThreshold,连续探测失败几次才认为是真正发生了异常,默认是 3 次。

具体探测的方式有shell,tcp socket,http GET 三种,如下:

exec,执行一个 Linux 命令,比如 ps、cat 等等,和 container 的 command 字段很类似。
tcpSocket,使用 TCP 协议尝试连接容器的指定端口。
httpGet,连接端口并发送 HTTP GET 请求。

下面我们以Nginx为例来看具体看下,为了便于试验,先来定义ConfigMap如下:

dongyunqi@mongodaddy:~/k8s$ cat probe-cm.yml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: ngx-conf

data:
  default.conf: |
    server {
      listen 80;
      location = /ready {
        return 200 'I am ready';
      }
    }

然后我们定义如下pod分别使用三种探针来进行探针检测,yaml如下:

dongyunqi@mongodaddy:~/k8s$ cat probe-pod.yml 
apiVersion: v1
kind: Pod
metadata:
  name: ngx-pod-probe

spec:
  volumes:
  - name: ngx-conf-vol
    configMap:
      name: ngx-conf

  containers:
  - image: nginx:alpine
    name: ngx
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /etc/nginx/conf.d
      name: ngx-conf-vol

    startupProbe:
      periodSeconds: 1
      exec:
        command: ["cat", "/var/run/nginx.pid"]

    livenessProbe:
      periodSeconds: 10
      tcpSocket:
        port: 80

    readinessProbe:
      periodSeconds: 5
      httpGet:
        path: /ready
        port: 80

startup probe使用了shell探针检测方式,liveness probe使用了tcp socket探针检测方式,ready probe 使用httpGet检测方式,apply后查看如下:

dongyunqi@mongodaddy:~/k8s$ kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
ngx-pod-probe                  1/1     Running   0          18s

kubectl logs查看日志可以看到定期的调用/ready接口,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl logs ngx-pod-probe
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/01/29 07:54:33 [notice] 1#1: using the "epoll" event method
2023/01/29 07:54:33 [notice] 1#1: nginx/1.21.5
2023/01/29 07:54:33 [notice] 1#1: built by gcc 10.3.1 20211027 (Alpine 10.3.1_git20211027) 
2023/01/29 07:54:33 [notice] 1#1: OS: Linux 5.15.0-58-generic
2023/01/29 07:54:33 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/01/29 07:54:33 [notice] 1#1: start worker processes
2023/01/29 07:54:33 [notice] 1#1: start worker process 23
10.10.4.1 - - [29/Jan/2023:07:54:36 +0000] "GET /ready HTTP/1.1" 200 10 "-" "kube-probe/1.23" "-"
10.10.4.1 - - [29/Jan/2023:07:54:37 +0000] "GET /ready HTTP/1.1" 200 10 "-" "kube-probe/1.23" "-"
...

接下来我们修改startupProbe,让其获取一个不可能存在的文件,即让startup probe失败,看下POD会是什么状态,修改后如下:

apiVersion: v1
kind: Pod
metadata:
  name: ngx-pod-probe

spec:
  volumes:
  - name: ngx-conf-vol
    configMap:
      name: ngx-conf

  containers:
  - image: nginx:alpine
    name: ngx
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /etc/nginx/conf.d
      name: ngx-conf-vol

    startupProbe:
      periodSeconds: 1
      exec:
        command: ["cat", "/xxxx/run/nginx.pid"]

    livenessProbe:
      periodSeconds: 10
      tcpSocket:
        port: 80

    readinessProbe:
      periodSeconds: 5
      httpGet:
        path: /ready
        port: 80

apply后查看如下:

dongyunqi@mongodaddy:~/k8s$ kubectl get pod 
NAME                           READY   STATUS    RESTARTS     AGE
ngx-pod-probe                  0/1     Running   2 (3s ago)   13s
dongyunqi@mongodaddy:~/k8s$ kubectl get pod 
NAME                           READY   STATUS             RESTARTS     AGE
ngx-pod-probe                  0/1     CrashLoopBackOff   2 (8s ago)   22s
dongyunqi@mongodaddy:~/k8s$ kubectl get pod 
NAME                           READY   STATUS             RESTARTS      AGE
ngx-pod-probe                  0/1     CrashLoopBackOff   2 (12s ago)   26s

可以看到POD在不断的重启,最后变为CrashLoopBackOff状态,我们可以通过kuectl describe来查看具体原因,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl describe pod ngx-pod-probe
Name:         ngx-pod-probe
Namespace:    default
...
Events:
  Type     Reason     Age                    From               Message
  ----     ------     ----                   ----               -------
  Normal   Scheduled  4m33s                  default-scheduler  Successfully assigned default/ngx-pod-probe to mongomongo
  Normal   Pulled     4m23s (x3 over 4m32s)  kubelet            Container image "nginx:alpine" already present on machine
  Normal   Created    4m23s (x3 over 4m32s)  kubelet            Created container ngx
  Normal   Started    4m23s (x3 over 4m32s)  kubelet            Started container ngx
  Warning  Unhealthy  4m19s (x9 over 4m30s)  kubelet            Startup probe failed: cat: can't open '/xxxx/run/nginx.pid': No such file or directory
  Normal   Killing    4m19s (x3 over 4m27s)  kubelet            Container ngx failed startup probe, will be restarted
  Warning  BackOff    4m13s (x4 over 4m19s)  kubelet            Back-off restarting failed container

Startup probe failed: cat: can't open '/xxxx/run/nginx.pid': No such file or directory可以看出来确实是因为startup probe检测失败导致的。

写在后面

小结

本文一起看了对POD的资源限制配置,以及startup,liveness,ready三种探针及其配置,并给出了一个具体的实例。希望本文能够帮助到你。

参考文章列表

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

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

相关文章

怎样把截图转换成文字?三分钟教会你如何截图转文字

在日常的学习中,当你在网上看到一篇文章,而当中的某一段话很适合拿来用在自己的写作上,但是你却无法直接将其复制粘贴下来,只能先截图下来再手动输入,这种方法虽然可行,但比较消耗时间和精力,那…

详细图解LeetCode经典链表算法题

文章目录链表类型算法题一、链表介绍本文使用的Java中链表类:二、链表基础题1、数组转链表代码:测试:2、单链表翻转题目:代码:解析:测试:补充:3、合并两个有序链表题目:解…

顺应信创发展,君子签电子签章方案全面适配信创环境

信创产业作为战略性新兴产业,近年来,国家不断出台相关政策对行业的发展进行支持。 2018年我国首次将信创纳入国家战略,并提出了 “28N”应用体系,信创发展步入“快车道”;2020年起,信创产业由党政逐渐向其…

垃圾收集器必问系列—ZGC

本文已收录至Github,推荐阅读 👉 Java随想录 人的一切痛苦,本质上都是对自己的无能的愤怒。——王小波 文章目录Region布局读屏障染色指针染色指针的优势运作过程ZGC的优缺点ZGC有人称它为Zero GC,其实“Z”并非什么专业名词的缩写…

vue前端框架课程笔记(二)

目录计算属性问题引入插值语法实现methods配置属性实现computed配置属性一些问题getter与setter注意监视属性问题引入computed和methods实现watch属性watch属性简介computed与watch的比较注意本博客参考尚硅谷官方课程,详细请参考 【尚硅谷bilibili官方】 本博客以…

千峰网络安全笔记(前三讲)

典中典 《c语言从研发到脱发》 《C从入门到放弃》 《Java从跨平台到跨行业》 《Ios开发从入门到下架》 《Android开发大全——从开始到转行》 《PHP由初学至搬砖》 《黑客攻防:从入门到入狱》 《Mysql从删库到跑路》 《服务器运维管理从网络异常到硬盘全红》 《服务器运维管理…

CentOS 8 中dnf管理器如何仅下载不安装软件

在某些情况下,我们希望从命令行下载特定或一组 RPM 包而不安装它。虽然我们可以使用 wget 命令下载,但 wget 不会下载安装包的依赖项。在 CentOS 8 中DNF(或 yum)是一个命令行包管理工具。使用 DNF我们可以安装、更新和删除 rpm 包…

HTTP协议学习

一、http请求协议1、常见请求头accept:浏览器通过这个头告诉服务器,它所支持的数据类型Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式Accept-Language…

114.简单的动态切换app的图标

1.第一步 通过activity-alias别名实现&#xff0c;manifest 这里写的是一个默认的图标Default和一个需要切换的图标Test&#xff0c;以及一个默认的首页面HomeActivity&#xff1a; <!-- 默认的图标--> <activity-aliasandroid:name".activity.Default"and…

C语言入门教程||C语言 运算符||C语言 判断

C语言 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算…

基于android的大学生图书管理系统app

需求信息&#xff1a; 1.学生用户端 查询图书。学生用户可以对馆内图书资料进行简单和高级的查询。 预约图书。当查询时发现要借阅的图书已被借阅&#xff0c;可以提前预约。 挂失图书。图书不慎丢失&#xff0c;可以在学生端实现挂失。 2.管理员端 学生用户管理。管理员可以对…

LeetCode——2309. 兼具大小写的最好英文字母

一、题目 给你一个由英文字母组成的字符串 s &#xff0c;请你找出并返回 s 中的最好英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母&#xff0c;则返回一个空字符串。 最好 英文字母的大写和小写形式必须 都 在 s 中出现。 英文字母 b 比另一个英文字母 a …

Python 操作pdf(pdfplumber读取PDF写入Exce)

1. Python 操作pdf(pdfplumber读取PDF写入Exce) 1.1 安装pdfplumber模块库: 安装pdfplumber: pip install pdfplumber 复制代码 pdfplumber.PDF类 pdfplumber.PDF类表示单个PDF ,并具有两个主要属性: 属性说明pdf.metadata从PDF的Info中获取元数据键/值对字典。通常包括&q…

【HBase——陌陌海量存储案例】4. Apache Phoenix 介绍与安装

5. 性能问题 Hbase默认只支持对行键的索引&#xff0c;那么如果要针对其它的列来进行查询&#xff0c;就只能全表扫描之前介绍的查询是使用scan filter组合来进行查询的&#xff0c;但查询地效率不高&#xff0c;因为要进行顺序全表扫描而没有其他索引。如果数据量较大&#…

51单片机学习笔记-8 DS1302实时时钟

8 DS1302实时时钟 [toc] 注&#xff1a;笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 8.1 芯片介绍&#xff1a;DS1302 RTC(Real Time Clock)实时时钟&#xff0c;是一种集成电路&#xff0c;通常称为时钟芯片。常见的时…

AIGC在营销图片生成技术综述

基于文本生成素材imagen分析用户输入的文本并使用T5-XXL进行编码。嵌入在 AI 中的文本首先被转换为分辨率为64x64像素的小图像。Imagen进一步利用文本条件超分辨率扩散模型对图像进行6464的上采样&#xff0c;然后这个图像继续增长并最终形成。Imagen 的开发者谷歌研究的大脑团…

剑指 Offer 第11天 第12天

目录 剑指 Offer 18. 删除链表的节点 剑指 Offer 22. 链表中倒数第k个节点 剑指 Offer 25. 合并两个排序的链表 剑指 Offer 52. 两个链表的第一个公共节点 剑指 Offer 18. 删除链表的节点 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。…

台式电脑怎么连wifi,1分钟轻松弄懂

电脑已经成为了各位小伙伴日常生活中经常会使用的工具。笔记本电脑连接wifi很简单&#xff0c;相信很多小伙伴都会&#xff0c;可是面对台式电脑&#xff0c;很多小伙伴就不知道怎么连wifi了。台式电脑怎么连wifi&#xff1f;别担心&#xff0c;1分钟教你轻松弄懂。 台式电脑怎…

MQ消息队列

mq1、什么是消息队列1.1 MQ基本框架1.2 消息队列的优点1.3 消息队列的缺点1.4 消息队列比对2、RabbitMQ2.1、RabbitMQ如何保证消息不被重复消费2.2、RabbitMQ如何保证消息不丢失2.2.1 生产者丢数据2.2.2 消息队列丢数据2.2.3 消费者丢数据2.3、RabbitMQ如何保证消息有序2.4、Ra…

基于蜣螂算法改进的随机森林分类算法-附代码

基于蜣螂算法改进的随机森林分类算法 - 附代码 文章目录基于蜣螂算法改进的随机森林分类算法 - 附代码1.数据集2.RF模型3.基于蜣螂算法优化的RF4.测试结果5.Matlab代码摘要&#xff1a;为了提高随机森林数据的分类预测准确率&#xff0c;对随机森林中的树木个数和最小叶子点数参…