【k8s】资源限制管理:Namespace、Deployment与Pod的实践

news2024/11/27 6:06:06

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、什么是k8s

2、在k8s使用资源配额的作用

二、Kubernetes资源限制概述

1、资源请求的设定(Requests)

2、资源限制的设定(Limits)

三、Namespace层面的资源限制

1、资源配额支持的资源类型

2、示例:设置命名空间的资源配额

四、Deployment层面的资源限制

1、如何在 Deployment 中设置资源请求和限制

2、资源请求与限制的影响

1. 资源调度:

2. 资源管理:

3. 容器的生命周期:

五、Pod层面的资源限制

1、如何在 Pod 中设置资源请求和限制

2、Pod 资源请求与限制的计算

1. 单个容器的资源:

2. Pod 层面资源请求和限制的总和:


一、引言

1、什么是k8s

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它最初由 Google 开发,并且现在由 Cloud Native Computing Foundation (CNCF) 维护。Kubernetes 提供了高效的工具和 API,使得在大规模的集群环境中管理容器变得更加容易。

2、在k8s使用资源配额的作用

  1. 限制资源使用: 资源配额可以帮助管理和限制在特定 命名空间(Namespace) 中可用的资源总量。例如,你可以限制一个命名空间内最大能使用的 CPU 或内存总量,以及可以创建的 Pod 数量等。这样可以防止某个团队或应用无节制地消耗集群资源,导致集群中其他应用无法获得足够的资源。
  2. 避免资源争抢: 在一个多租户环境中(例如多团队共享同一个 Kubernetes 集群),资源配额可以确保每个团队在命名空间内有公平的资源分配。没有资源配额的情况下,某个团队可能会消耗整个集群的资源,影响到其他团队的应用。
  3. 防止资源过度分配: 资源配额有助于防止某些应用或用户请求过多资源,超出了集群的总资源容量。通过设置资源配额,可以确保集群的资源不会被过度占用,从而避免因资源过载导致的系统崩溃或性能下降。
  4. 提高集群的可管理性和可预测性: 资源配额帮助集群管理员清晰地了解每个命名空间的资源使用情况,并能够预测和控制集群的资源需求。这样可以更好地规划集群的容量,并防止资源不足的情况。

 

二、Kubernetes资源限制概述

1、资源请求的设定(Requests)

在 Kubernetes 中,资源请求(Requests) 是指容器启动时所需要的最小资源量。当 Kubernetes 调度器将容器调度到某个节点时,它会检查节点是否有足够的资源来满足容器的请求。如果节点上的资源不足,调度器将不会将容器调度到该节点,直到有足够的资源可用。

  • CPU 请求(requests.cpu):表示容器启动时需要的最小 CPU 资源量。它是容器能够正常运行所必需的最低 CPU 配额。
  • 内存请求(requests.memory):表示容器启动时需要的最小内存资源量。它是容器能够正常运行所必需的最低内存配额。

Kubernetes 使用 资源请求(requests) 来决定哪些节点有足够的资源来运行容器。当容器运行时,它不会使用超过请求量的资源(除非节点有剩余资源),但是它保证可以使用请求量的资源。

2、资源限制的设定(Limits)

在 Kubernetes 中,资源限制(Limits) 是指容器可以使用的最大资源量。资源限制确保容器不会超出节点或集群的资源限制,从而避免资源滥用或过度消耗影响其他容器的稳定性。

  • CPU 限制(limits.cpu):表示容器可以使用的最大 CPU 资源。容器无法使用超过该限制的 CPU 资源。
  • 内存限制(limits.memory):表示容器可以使用的最大内存资源。如果容器超出内存限制,Kubernetes 可能会终止该容器并将其重新调度(即 OOMKill)。

与 资源请求(Requests) 配合使用,资源请求表示容器启动时所需的最小资源量,而资源限制则是容器在运行时可以使用的最大资源量。

三、Namespace层面的资源限制

在 Kubernetes 中,Namespace 层面的资源限制 通过 资源配额(ResourceQuotas) 来实现,允许管理员在不同的命名空间(Namespace)中定义资源的使用限制。资源配额限制了每个命名空间中可以使用的资源总量,帮助确保集群中的资源在多个命名空间之间得到公平分配。

1、资源配额支持的资源类型

在 Kubernetes 中,资源配额可以控制以下几种类型的资源:

  1. CPU 和内存(requests 和 limits): 限制命名空间内所有容器的 CPU 和内存使用总量。可以限制请求(requests)和限制(limits)。
  2. Pod 数量: 限制命名空间中创建的 Pod 的最大数量。
  3. 服务、复制控制器、副本集等资源数量: 限制每种资源(如 Service、Deployment、ReplicaSet、StatefulSet 等)的数量。
  4. 持久卷(Persistent Volumes, PV): 限制命名空间内持久卷的使用数量和存储量。
  5. Ingress 资源数量: 限制命名空间内 Ingress 资源的数量。
  6. 其他对象: 如 ConfigMap、Secret、Endpoints 等资源的数量和大小。

 

2、示例:设置命名空间的资源配额

资源配额是通过创建 ResourceQuota 资源对象来配置的。以下是一个简单的 ResourceQuota YAML 配置文件示例,演示了如何设置命名空间的资源配额。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: example-resource-quota
  namespace: mynamespace
spec:
  hard:
    requests.cpu: "2"                    
    requests.memory: "4Gi"              
    limits.cpu: "4"                     
    limits.memory: "8Gi"               
    pods: "10"                          
    services: "5"                       
    persistentvolumeclaims: "5"        
    configmaps: "10"                    
    secrets: "10"                       
  • requests.cpu:指定命名空间内所有容器 CPU 请求的总和不能超过 2 核。
  • requests.memory:指定命名空间内所有容器内存请求的总和不能超过 4 Gi。
  • limits.cpu:指定命名空间内所有容器 CPU 限制的总和不能超过 4 核。
  • limits.memory:指定命名空间内所有容器内存限制的总和不能超过 8 Gi。
  • pods:限制命名空间内最多可以创建 10 个 Pod。
  • services:限制命名空间内最多可以创建 5 个服务(Service)。
  • persistentvolumeclaims:限制命名空间内最多可以创建 5 个持久卷声明(PVC)。
  • configmaps:限制命名空间内最多可以创建 10 个 ConfigMap。
  • secrets:限制命名空间内最多可以创建 10 个 Secret。

 

四、Deployment层面的资源限制

在 Kubernetes 中,Deployment 资源是管理和部署一组无状态的 Pods 的一种方式。通常,Deployment 会指定一组 Pods 的副本,并管理它们的更新、扩展和回滚。与命名空间级别的资源配额不同,Deployment 层面的资源限制 是在 Pod 级别进行配置的,目的是为了限制和管理部署的容器(Pod)使用的资源(CPU 和内存)。


在 Deployment 中,资源请求(Requests)和资源限制(Limits)通常在 Pod 的容器定义中进行设置。每个容器都可以设置自己的资源请求和限制,Kubernetes 会根据这些设置来进行资源调度。

1、如何在 Deployment 中设置资源请求和限制

在 Deployment 的 YAML 文件中,容器的资源请求和限制是通过 resources 字段来配置的。下面是一个完整的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp-container
          image: myapp:latest
          resources:
            requests:
              memory: "512Mi"  # 请求 512MB 内存
              cpu: "500m"      # 请求 0.5 个 CPU 核心
            limits:
              memory: "1Gi"    # 限制最大内存为 1GB
              cpu: "1"         # 限制最大 CPU 为 1 核
  • requests:是容器在启动时请求的资源量,Kubernetes 会确保调度容器时,节点至少有这些资源可用。比如在上面的示例中,容器请求了 512MB 内存和 0.5 个 CPU 核心。
  • limits:是容器能够使用的资源最大值。如果容器的资源消耗超过了这个值,Kubernetes 会对其进行限制。比如示例中限制了容器最多可以使用 1GB 内存和 1 个 CPU 核心。

 

 

2、资源请求与限制的影响

1. 资源调度:

  • Kubernetes 调度器会根据 requests 来决定 Pod 可以在哪个节点上运行。请求的资源越大,Kubernetes 就会把该 Pod 调度到资源更多的节点上。如果节点的资源不足,Pod 可能会无法调度。

2. 资源管理:

  • 如果没有设置资源限制(limits),容器可能会无限制地使用资源,这可能会影响同一节点上的其他 Pod。
  • 设置资源限制可以防止单个容器消耗过多资源,影响其他容器或 Pod 的运行。例如,如果没有内存限制,当容器消耗大量内存时,可能会导致 OOM(Out of Memory)错误,从而导致容器崩溃。

3. 容器的生命周期:

  • 当容器的资源使用超过限制时,Kubernetes 会对其进行限制。例如,CPU 的限制通常会导致容器的 CPU 被限制(throttling),内存的限制可能会导致容器被杀死(OOM)。Kubernetes 会根据设置的策略重启容器,或者在资源消耗恢复正常后重新分配资

 

五、Pod层面的资源限制

在 Kubernetes 中,Pod 是一组容器的集合,这些容器共享相同的网络和存储资源。Pod 是 Kubernetes 中的最小调度单元,它可以包含一个或多个容器。Pod 层面的资源限制 是针对 Pod 中所有容器的资源请求(requests)和资源限制(limits)进行配置的。

虽然 Kubernetes 中的资源限制通常在容器级别进行设置,但 Pod 也可以设置一些资源限制,这些限制是针对 Pod 中所有容器的资源请求和限制进行的总和计算。如果你有多个容器在同一个 Pod 内,那么容器级别的资源请求和限制会一起影响 Pod 层面的资源调度。

1、如何在 Pod 中设置资源请求和限制

在 Kubernetes 中,你可以在 Pod 的 YAML 文件中为容器设置资源请求和限制。在多容器的 Pod 中,Pod 的所有容器都会共享这些资源,但每个容器可以有自己独立的资源请求和限制。

以下是一个带有资源请求和限制配置的 Pod 示例:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: default
spec:
  containers:
  - name: container1
    image: myimage:v1
    resources:
      requests:
        memory: "256Mi"  # 请求 256MB 内存
        cpu: "500m"      # 请求 0.5 个 CPU 核
      limits:
        memory: "512Mi"  # 限制最大内存为 512MB
        cpu: "1"         # 限制最大 CPU 为 1 核
  - name: container2
    image: myimage:v2
    resources:
      requests:
        memory: "128Mi"  # 请求 128MB 内存
        cpu: "250m"      # 请求 0.25 个 CPU 核
      limits:
        memory: "256Mi"  # 限制最大内存为 256MB
        cpu: "500m"      # 限制最大 CPU 为 0.5 核
  • 资源请求(Requests):表示容器运行时所需的最小资源。Kubernetes 调度器会根据容器的请求值决定容器在哪个节点上运行,确保节点具有足够的资源以满足这些请求。
  • 资源限制(Limits):表示容器可以使用的最大资源量。容器在运行时,Kubernetes 会确保容器的资源使用不超过该限制。如果容器的资源消耗超过限制(比如内存),它可能会被杀死并重启;如果是 CPU,它可能会被限制,导致其执行变慢。 

2、Pod 资源请求与限制的计算

1. 单个容器的资源:

上面的示例中,Pod 中有两个容器 container1 和 container2,每个容器都分别设置了资源请求和限制。

  • container1 的请求是 256Mi 内存和 0.5 个 CPU 核心,限制是 512Mi 内存和 1 个 CPU 核心。
  • container2 的请求是 128Mi 内存和 0.25 个 CPU 核心,限制是 256Mi 内存和 0.5 个 CPU 核心。

2. Pod 层面资源请求和限制的总和:

虽然 Kubernetes 是按照容器级别来分配资源的,但 Pod 层面的资源管理通常会将 Pod 中所有容器的资源请求和限制进行汇总。因此,在 Pod 层面,你可以考虑 Pod 的资源请求和限制是所有容器资源的总和。

  • 资源请求总和:Pod 中所有容器请求资源的总和。
    •  Pod 请求的内存总量 = 256Mi (container1) + 128Mi (container2) = 384Mi
    •  Pod 请求的 CPU 总量 = 0.5 核 (container1) + 0.25 核 (container2) = 0.75 核
  • 资源限制总和:Pod 中所有容器限制资源的总和。
    •  Pod 限制的内存总量 = 512Mi (container1) + 256Mi (container2) = 768Mi
    •  Pod 限制的 CPU 总量 = 1 核 (container1) + 0.5 核 (container2) = 1.5 核

   

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

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

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

相关文章

lua除法bug

故事背景,新来了一个数值,要改公式。神奇的一幕出现了,公式算出一个非常大的数。排查是lua有一个除法bug,1除以大数得到一个非常大的数。 function div(a, b)return tonumber(string.format("%.2f", a/b)) end print(1/73003) pri…

微信小程序学习指南从入门到精通

🗽微信小程序学习指南从入门到精通🗽 🔝微信小程序学习指南从入门到精通🔝✍前言✍💻微信小程序学习指南前言💻一、🚀文章列表🚀二、🔯教程文章的好处🔯1. ✅…

《基于FPGA的便携式PWM方波信号发生器》论文分析(三)——数码管稳定显示与系统调试

一、论文概述 基于FPGA的便携式PWM方波信号发生器是一篇由任青颖、庹忠曜、黄洵桢、李智禺和张贤宇 等人发表的一篇期刊论文。该论文主要研究了一种新型的信号发生器,旨在解决传统PWM信号发生器在移动设备信号调控中存在的精准度低和便携性差的问题 。其基于现场可编…

计算机操作系统——进程控制(Linux)

进程控制 进程创建fork()函数fork() 的基本功能fork() 的基本语法fork() 的工作原理fork() 的典型使用示例fork() 的常见问题fork() 和 exec() 结合使用总结 进程终止与$进程终止的本质进程终止的情况正常退出(Exit)由于信号终止非…

【贪心算法第四弹——376.摆动序列】

目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码解析 本题还可以使用动态规划的解法来解决,不过动态规划的时间复杂度为O(N^2),而贪心解法的时间复杂度为O(N),动态规划方法的博客链接: 动态规划-子序列问题——376.摆动…

我谈离散傅里叶变换的补零

有限序列的零延拓——零延拓不会改变离散傅里叶变换的形状的续篇。 L点序列可以做N点傅里叶变换,当 L ⩽ N L\leqslant N L⩽N时不会产生混叠。这部分内容在Rafael Gonzalez和Richard Woods所著的《数字图像处理》完全没有提到。 补零是序列末尾补零,不…

day18 结构体

有参宏和函数的区别 1.展开时机:有参宏而言,在预处理阶段展开,而函数在调用时才展开 2.内存使用:有参宏而言,占用的是所在函数的空间,而函数在调用时会单独开辟空间 3.效率上:有参宏的效率比…

C嘎嘎探索篇:栈与队列的交响:C++中的结构艺术

C嘎嘎探索篇:栈与队列的交响:C中的结构艺术 前言: 小编在之前刚完成了C中栈和队列(stack和queue)的讲解,忘记的小伙伴可以去我上一篇文章看一眼的,今天小编将会带领大家吹奏栈和队列的交响&am…

Postman设置接口关联,实现参数化

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…

大模型的RAG微调与Agent:提升智能代理的效率与效果

目录 ​编辑 引言 RAG模型概述 检索阶段 生成阶段 RAG模型的微调 数据集选择 损失函数设计 微调策略 超参数调整 RAG模型在智能代理中的应用 客户服务 信息检索 内容创作 决策支持: 结论 引言 在人工智能的快速发展中,大型预训练模型&a…

前端---CSS(部分用法)

HTML画页面--》这个页面就是页面上需要的元素罗列起来,但是页面效果很差,不好看,为了让页面好看,为了修饰页面---》CSS CSS的作用:修饰HTML页面 用了CSS之后,样式和元素本身做到了分离的效果。---》降低了代…

【R语言管理】Pycharm配置R语言及使用Anaconda管理R语言虚拟环境

目录 使用Anaconda创建R语言虚拟环境1. 安装Anaconda2. 创建R语言虚拟环境 Pycharm配置R语言1. 安装Pycharm2. R Language for IntelliJ插件 参考 使用Anaconda创建R语言虚拟环境 1. 安装Anaconda Anaconda的安装可参见另一博客-【Python环境管理工具】Anaconda安装及使用教程…

互联网视频推拉流EasyDSS视频直播点播平台视频转码有哪些技术特点和应用?

视频转码本质上是一个先解码再编码的过程。在转码过程中,原始视频码流首先被解码成原始图像数据,然后再根据目标编码标准、分辨率、帧率、码率等参数重新进行编码。这样,转换前后的码流可能遵循相同的视频编码标准,也可能不遵循。…

Linux Shell 脚本题目集

1、执行 ping 命令对指定主机进行测试,以确定该主机是否处于存活状态并输出相应结果。 #!/bin/bashread -p "请输入主机号:" pc # 读取用户输入的主机号if [ -z "$pc" ];then # 检查用户输入是否为空echo "主…

使用ENSP实现默认路由

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…

【vue3实现微信小程序】每日专题与分页跳转的初步实现

快速跳转: 我的个人博客主页👉:Reuuse博客 新开专栏👉:Vue3专栏 参考文献👉:uniapp官网 免费图标👉:阿里巴巴矢量图标库 ❀ 感谢支持!☀ 前情提要 &#x…

小程序-基于java+SpringBoot+Vue的网上花店微信小程序设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Opencv+ROS实现颜色识别应用

目录 一、工具 二、原理 概念 本质 三、实践 添加发布话题 主要代码 四、成果 五、总结 一、工具 opencvros ubuntu18.04 摄像头 二、原理 概念 彩色图像:RGB(红,绿,蓝) HSV图像:H&#xff0…

解决 java -jar 报错:xxx.jar 中没有主清单属性

问题复现 在使用 java -jar xxx.jar 命令运行 Java 应用程序时,遇到了以下错误: xxx.jar 中没有主清单属性这个错误表示 JAR 文件缺少必要的启动信息,Java 虚拟机无法找到应用程序的入口点。本文将介绍该错误的原因以及如何通过修改 pom.xm…

JavaWeb——SpringBoot原理

10.1. 配置优先级 10.1.1. 配置文件 properties > yml(推荐) > yaml 10.1.2. Java系统属性、命令行参数 命令行参数 > Java系统属性 > 配置文件 10.2. Bean管理 10.2.1. 手动获取bean ApplicationContext,IOC容器对象 10.2.2. bean作用域 10.2.3.…