Kubernetes 容器资源管理Resources和探针Probe

资源配额 Resources

在 Kubernetes 中,resources 配置用于设置容器的资源请求和限制,以确保集群中的资源(如 CPU 和内存)得到合理分配和使用。

在之前的pod中,不写 resources 字段。就意味着 Pod 对运行的资源要求“既没有下限,也没有上限”,Kubernetes 不用管 CPU 和内存是否足够,可以把 Pod 调度到任意的节点上,而且后续 Pod 运行时也可以无限制地使用 CPU 和内存。

Pod 可能会因为资源不足而运行缓慢,或者是占用太多资源而影响其他应用,所以我们应当合理评估 Pod 的资源使用情况,尽量为 Pod 加上限制。

Pod 容器的描述部分添加一个新字段 resources 进行资源限额

ngx-pod-resources.yml

apiVersion: v1
kind: Pod
metadata:name: ngx-pod-resourcesspec:containers:- image: nginx:alpinename: ngxresources:requests:cpu: 10mmemory: 100Milimits:cpu: 20mmemory: 200Mi

containers.resources,它下面有两个字段:

  • “requests”,意思是容器要申请的资源,也就是说要求 Kubernetes 在创建 Pod 的时候必须分配这里列出的资源,否则容器就无法运行。
  • “limits”,意思是容器使用资源的上限,不能超过设定值,否则就有可能被强制停止运行。

cpu 和 memory 资源表达方式

  • 内存的写法和磁盘容量一样,使用 Ki、Mi、Gi 来表示 KB、MB、GB,比如 512Ki、100Mi、0.5Gi 等。
  • kubernetes 里 CPU 的最小使用单位是 0.001,为了方便表示用了一个特别的单位 m,也就是“milli”“毫”的意思,比如说 500m 就相当于 0.5。

ngx-pod-resources.yml 向系统申请的是 1% 的 CPU 时间和 100MB 的内存,运行时的资源上限是 2%CPU 时间和 200MB 内存。有了这个申请,Kubernetes 就会在集群中查找最符合这个资源要求的节点去运行 Pod。

Kubernetes 会根据每个 Pod 声明的需求,像搭积木或者玩俄罗斯方块一样,把节点尽量“塞满”,充分利用每个节点的资源,让集群的效益最大化。

运行命令

vim ngx-pod-resources.ymlkubectl apply -f ngx-pod-resources.ymlkubectl get pod

在这里插入图片描述

如果pod资源配额不够,会是什么情况
修改 ngx-pod-resources.yml cpu为10个cpu

apiVersion: v1
kind: Pod
metadata:name: ngx-pod-resourcesspec:containers:- image: nginx:alpinename: ngxresources:requests:cpu: 10memory: 100Milimits:cpu: 20memory: 200Mi

执行命令

kubectl delete -f ngx-pod-resources.yml
kubectl get pod
vim ngx-pod-resources.yml
kubectl apply -f ngx-pod-resources.yml 
kubectl get pod
# 获取pod详情
kubectl describe pod ngx-pod-resources 

在这里插入图片描述
使用 kubectl apply 创建这个 Pod,你可能会惊奇地发现,虽然我们的 Kubernetes 集群里没有足够的 CPU,但 Pod 也能创建成功。不过我们再用 kubectl get pod 去查看的话,就会发现它处于“Pending”状态,实际上并没有真正被调度运行:
在这里插入图片描述
kubectl describe 来查看具体原因,会发现有这么一句提示:

集群中没有足够的可用 CPU 资源来调度新的 Pod,同时有一个节点(master 节点)存在污点 (taint),导致 Pod 无法被调度到该节点上。

检查探针 Probe

探针 Probe

Kubernetes 为了能更细致地监控 Pod 的状态,除了保证崩溃重启,还必须要能够探查到 Pod 的内部运行状态,定时给应用做“体检”,让应用时刻保持“健康”,能够满负荷稳定工作。

Kubernetes 在应用的“检查口”里提取点数据,就可以从这些信息来判断应用是否“健康”了,这项功能被称为“探针”(Probe),也可以叫“探测器”。

探针类型:

  • Startup,启动探针,用来检查应用是否已经启动成功,适合那些有大量初始化工作要做,启动很慢的应用。
  • Liveness,存活探针,用来检查应用是否正常运行,是否存在死锁、死循环。
  • Readiness,就绪探针,用来检查应用是否可以接收流量,是否能够对外提供服务。

三种探针的递进关系:

  • 应用程序先启动,加载完配置文件等基本的初始化数据就进入了 Startup 状态
  • 之后如果没有什么异常就是 Liveness 存活状态,但可能有一些准备工作没有完成,还不一定能对外提供服务
  • 只有到最后的 Readiness 状态才是一个容器最健康可用的状态。

在这里插入图片描述
如果一个 Pod 里的容器配置了探针,Kubernetes 在启动容器后就会不断地调用探针来检查容器的状态:

  • 如果 Startup 探针失败,Kubernetes 会认为容器没有正常启动,就会尝试反复重启,当然其后面的 Liveness 探针和 Readiness 探针也不会启动。
  • 如果 Liveness 探针失败,Kubernetes 就会认为容器发生了异常,也会重启容器。
  • 如果 Readiness 探针失败,Kubernetes 会认为容器虽然在运行,但内部有错误,不能正常提供服务,就会把容器从 Service 对象的负载均衡集合中排除,不会给它分配流量。
    在这里插入图片描述

容器中使用状态探针

开发应用时预留出“检查口

nginx-config-cm.yml

apiVersion: v1
kind: ConfigMap
metadata:name: ngx-confdata:default.conf: |server {listen 80;location = /ready {return 200 'I am ready';}}

执行命令

vim nginx-config-cm.yml 
kubectl apply -f nginx-config-cm.yml

Pod 定义探针:

ngx-pod-probe.yml

apiVersion: v1
kind: Pod
metadata:name: ngx-pod-probespec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:alpinename: ngxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-volstartupProbe:periodSeconds: 1exec:command: ["cat", "/var/run/nginx.pid"]livenessProbe:periodSeconds: 10tcpSocket:port: 80readinessProbe:periodSeconds: 5httpGet:path: /readyport: 80

startupProbe、livenessProbe、readinessProbe 这三种探针的配置方式都是一样的,关键字段:

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

Kubernetes 支持 3 种探测方式:Shell、TCP Socket、HTTP GET ,它们也需要在探针里配置:

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

ngx-pod-probe.yml配置解析

  • StartupProbe 使用了 Shell 方式,使用 cat 命令检查 Nginx 存在磁盘上的进程号文件(/var/run/nginx.pid),如果存在就认为是启动成功,它的执行频率是每秒探测一次。
  • LivenessProbe 使用了 TCP Socket 方式,尝试连接 Nginx 的 80 端口,每 10 秒探测一次。
  • ReadinessProbe 使用的是 HTTP GET 方式,访问容器的 /ready 路径,每 5 秒发一次请求。

执行命令

vim ngx-pod-probe.yml
kubectl apply -f ngx-pod-probe.yml
kubectl get pod
kubectl logs ngx-pod-probe

在这里插入图片描述
Kubernetes ReadinessProbe 探针以大约 5 秒一次的频率,向 URI /ready 发送 HTTP 请求,不断地检查容器是否处于就绪状态。

验证StartupProbe 探针失败情况

修改ngx-pod-probe.yml的startupProbe

    startupProbe:exec:command: ["cat", "nginx.pid"]  #错误的文件

执行命令

kubectl delete -f ngx-pod-probe.yml
kubectl get pod
vim ngx-pod-probe.yml
kubectl apply -f ngx-pod-probe.yml 
kubectl get pod
kubectl logs ngx-pod-probe 

在这里插入图片描述
StartupProbe 探测失败的时候,Kubernetes 就会不停地重启容器,现象就是 RESTARTS 次数不停地增加,而 livenessProbe 和 readinessProbePod 没有执行,Pod 永远不会 READY。

修改ngx-pod-probe.yml的livenessProbe(startupProbe内容要还原)

 livenessProbe:tcpSocket:port: 8080                     #错误的端口号

执行命令

kubectl delete -f ngx-pod-probe.yml
kubectl get pod
vim ngx-pod-probe.yml
kubectl apply -f ngx-pod-probe.yml 
kubectl get pod
kubectl logs ngx-pod-probe 

在这里插入图片描述
因为 failureThreshold 的次数默认是三次,所以 Kubernetes 会连续执行三次 livenessProbe TCP Socket 探测,每次间隔 10 秒,30 秒之后都失败才重启容器。

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

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

相关文章

Java面试八股之AQS对资源的共享方式

AQS对资源的共享方式 AQS设计了一套灵活的机制,不仅支持独占(Exclusive)锁模式,也支持共享(Shared)锁模式,使得资源可以被一个或者多个线程以不同的方式访问。这两种模式通过控制一个内部的vol…

技术速递|宣布 Java on Azure 开发工具支持 Azure Functions Flex Consumption

作者:Jialuo Gan 排版:Alan Wang Azure Functions Flex Consumption 刚刚在微软 Build 2024大会期间发布(详情请参见本博客)。我们很高兴地与大家分享,Azure Functions 的 IntelliJ Azure Toolkit 和 Maven 插件现在也…

pyqt QTableView表格控件

pyqt QTableView表格控件 QTableView效果代码 QTableView QTableView 是 PyQt中的一个控件,用于显示表格数据。它通常与 QAbstractItemModel 或其子类(如 QStandardItemModel)一起使用,以提供和管理表格中的数据。 效果 代码 i…

wordpress主题 ACG美化插件v3.4.2支持zibll主题7b2主题美化

独具一格的二次元风格,打造全新的子比美化方向 大部分代码均为CSS、JS做成插件只是为了方便懒人小白站长 后台全功能一览,大部分美化均为网上通用流传,

2.冒泡排序

样例输入 5 8 3 6 4 9 样例输出 3 4 6 8 9 以下是解题答案&#xff1a; class demo1{public static void main(String[] args) {Scanner scnnew Scanner(System.in);int[] array new int[scn.nextInt()];if(array.length>0&&array.length<200){for(int…

python列表访问的深入解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、正向索引与负索引的奥秘 二、切片&#xff1a;高效访问多个元素 切片示例 三、切片的…

MIT6.828 Lab2-3 Sysinfo

目录 一、实验内容二、实验过程2.1 已有的代码2.2 需补充内容/kernel/kalloc.c修改&#xff08;剩余内存计算的函数&#xff09;/kernel/proc.c修改&#xff08;统计进程数量的函数&#xff09;/kernel/defs.h修改添加/kernel/sysinfo.c文件/kernel/syscall.h修改/kernel/sysca…

Java 文件操作和输入输出流

在 Java 编程中&#xff0c;文件操作和输入输出流是非常常见和重要的任务&#xff0c;它们允许你读取和写入文件、处理数据流等。 文件操作概述 文件操作是指对文件进行创建、读取、写入、删除等操作的过程。在 Java 中&#xff0c;文件操作通常涉及到使用文件对象、输入输出…

OpenBayes 一周速览|TripoSR 开源:1 秒即 2D 变 3D、经典 GTZAN 音乐数据集上线

公共资源速递 This Weekly Snapshots &#xff01;5 个数据集&#xff1a; FER2013 面部表情识别数据集 GTZAN 音乐流派分类数据集 MVTec-AD 工业异常检测数据集 UCAS-AOD 遥感目标检测数据集 Oxford 102 Flowers 花卉图片数据集 3 个教程&#xff1a; Latte 全球首个开…

利用ArcGIS Python批量拼接遥感影像(arcpy batch processing)

本篇文章将说明如何利用ArcGIS 10.1自带的Python IDLE进行遥感影像的批量拼接与裁剪。 1.运行环境&#xff1a;ArcGIS10.1 (安装传送门)、Python IDLE 2.数据来源&#xff1a;地理空间数据云 GDEMV2 30M分辨率数字高程数据 3.解决问题&#xff1a;制作山西省的DEM影像 如下…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第30课-门的移动动画

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第30课-门的移动动画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

服务器端口转发,服务器端口转发的作用、好处与坏处

服务器端口转发&#xff0c;服务器端口转发的作用、好处与坏处。 服务器端口转发是一种关键的网络技术&#xff0c;它在网络安全和通信中发挥着不可替代的作用。其主要功能是将来自一个端口的网络流量转发到另一个端口&#xff0c;从而实现内外网之间的流量交互。这种技术通常…

雷军-2022.8小米创业思考-8-和用户交朋友,非粉丝经济;性价比是最大的诚意;新媒体,直播离用户更近;用真诚打动朋友,脸皮厚点!

第八章 和用户交朋友 2005年&#xff0c;为了进一步推动金山的互联网转型&#xff0c;让金山的同事更好地理解互联网的精髓&#xff0c;我推动了一场向谷歌学习的运动&#xff0c;其中一个小要求就是要能背诵“谷歌十诫”。 十诫的第一条就令人印象深刻&#xff1a;以用户为中…

基于Cortex的MCU设计

基于Cortex的MCU设计 今日更新的存货文档&#xff0c;发现日更文章还是很花时间的。保证一周更新三篇文章就行啦&#xff0c;本篇文章的内容起始主要取自于《Cortex-M3 权威指南》和知网下载的论文。写的不详细&#xff0c;想进一步了解的就去看这篇文档或网上找别的资料&#…

数据治理与提取:未来科技发展的双引擎

在数字化浪潮席卷全球的今天&#xff0c;数据已成为推动科技进步的新石油。无论是人工智能、机器学习还是物联网&#xff0c;都离不开数据的支撑。然而&#xff0c;数据的海量增长也带来了新的挑战&#xff1a;如何有效地管理和利用这些数据&#xff1f;答案在于数据治理和数据…

Lightdm设置自动登录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、设置自动登录总结 前言 熟悉嵌入式系统的人都不陌生lightdm&#xff0c;这个轻桌面管理器曾经是Ubuntu等一众发行版默认的桌面&#xff0c;自从Ubuntu-18.…

Divisibility Part2(整除理论2)

Divisibility Part2 本节内容是Part1的进阶内容&#xff0c;主要讲的是整除在竞赛中的一些常用的技巧。 数的分解 一、带余除法 对于任意两个整数 a 、 b ( b ≠ 0 ) a、b(b\neq 0) a、b(b0)&#xff0c;都有唯一确定的整数 q , r q,r q,r&#xff0c; 满足 a q b r (…

Oracle 序列-SEQUENCE

文章目录 序列-SEQUENCE创建序列访问序列序列的修改和删除查询序列信息 序列-SEQUENCE 创建序列 访问序列 序列的修改和删除 DROP SEQUENCE SEQ_EKPO;查询序列信息 可以通过视图 dba/all/user_sequences 查询序列的相关信息 SELECT SEQUENCE_NAME FROM DBA_SEQUENCES WHERE …

LLM提示工程的技巧

1. 从简单开始&#xff08;Start Simple&#xff09; 避免在一开始就增加太多的复杂性。 从简单的提示开始&#xff0c;然后在后续提示中添加更多信息和上下文。 这样&#xff0c;提示就是一个迭代过程&#xff0c;提示在此过程中进一步发展。 从简单的开始&#xff0c;就有足…

第十二章:C# 循环

0. 简介 循环语句用于重复执行代码块,直到满足特定条件。C#提供了多种循环语句,包括for循环、while循环和do-while循环。掌握这些循环语句有助于编写高效和简洁的代码。 1. for 循环 for循环用于在已知迭代次数的情况下重复执行代码块。for循环的语法包括初始化语句、条件…