女主宣言

众所周知,Kubernetes是允许指定CPU和RAM的请求和限制的,这一特性对于单独的pod的资源消耗管理非常有用。在本系列文章中,我们将向大家展示集群资源的高效管理的三种策略。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

众所周知,Kubernetes是允许指定CPU和RAM的请求和限制的,这一特性对于单独的pod的资源消耗管理非常有用。

但是,如果你是Kubernetes集群管理员,你可能还希望控制集群中资源的全局性消耗,并/或配置所有容器的默认资源需求。

值得高兴的是,Kubernetes支持名称空间级别的集群资源管理。正如你可能已经知道的,Kubernetes的名称空间提供了名称和资源配额的范围,这允许在多个用户、项目和团队之间有效地划分集群资源。在Kubernetes中,你可以定义缺省资源请求和限制、资源约束(最小和最大资源请求和限制),以及在给定名称空间中运行的所有容器的资源配额。这些特性使得集群中的应用程序能够高效地利用资源,并在不同的团队之间有效地分配资源。例如,使用名称空间的资源约束允许你控制生产和开发工作负载如何使用资源,从而允许它们消耗有限的集群资源的公平份额。这可以通过为生产和开发工作负载创建单独的名称空间来实现,并为它们分配不同的资源约束。

在系列文章中,我们将向你展示集群资源的高效管理的三种策略:

  1. 设置默认的资源请求和容器的限制

  2. 定义最小和最大的资源约束

  3. 为名称空间中的所有容器设置资源配额

这些策略将帮助你解决各种各样的用例,利用Kubernetes名称空间和资源管理的全部功能。

为名称空间设置内存和CPU配额

在前面的例子中,我们为运行在名称空间中的单个容器设置了资源约束。但是,也可以限制资源请求,并限制在名称空间中运行的所有容器的总数。这可以很容易地通过为名称空间定义的 ResourceQuota 资源对象来实现。

为了说明资源配额是如何工作的,让我们首先创建一个新的名称空间,以便在这个练习中创建的资源与集群的其他部分隔离:

kubectl create namespace resource-quota-demo
namespace "resource-quota-demo" created

接下来,让我们创建一个 ResourceQuota 对象,为我们的名称空间提供资源配额:

apiVersion: v1
kind: ResourceQuota
metadata:name: resource-quota
spec:hard:requests.cpu: "1.4"requests.memory: 2Gilimits.cpu: "2"limits.memory: 3Gi

这种 ResourceQuota 为名称空间设置了以下要求:

  • ResourceQuota 强制每个容器定义它的内存和CPU请求和限制。

  • 所有容器的内存请求总数不得超过2 Gi。

  • 名称空间中所有容器的CPU请求总数不应超过1.4 CPU。

  • 名称空间中所有容器的内存限制不应超过3 Gi。

  • 名称空间中所有容器的CPU限制总数不应该超过2个CPU。

将这个规范保存在 resource-quota.yaml 并通过以下命令创建 ResourceQuota:

kubectl create -f resource-quota.yaml --namespace resource-quota-demo
resourcequota "resource-quota" created

ResouceQuota 对象是在我们的名称空间中创建的,并准备好控制该名称空间中的所有容器的总请求和限制。让我们看看 ResourceQuota 的描述:

kubectl get resourcequota --namespace resource-quota-demo --output=yaml

响应如下:

hard:limits.cpu: "2"limits.memory: 3Girequests.cpu: 1400mrequests.memory: 2Gistatus:hard:limits.cpu: "2"limits.memory: 3Girequests.cpu: 1400mrequests.memory: 2Giused:limits.cpu: "0"limits.memory: "0"requests.cpu: "0"requests.memory: "0"kind: List

这个输出表明在名称空间中还没有消耗内存和CPU。让我们创建两个pod来改变这种情况。

第一个pod将请求1.3 Gi RAM和0.8个CPU,并拥有1.2个CPU和2 Gi RAM的资源限制。

apiVersion: v1
kind: Pod
metadata:name: resource-quota-pod-1
spec:containers:- name: resource-quota-ctr-1image: httpd:2.4resources:limits:memory: "2Gi"cpu: 1.2requests:memory: "1.3Gi"cpu: 0.8

我们保存为 resource-quota-pod-1.yaml 并在我们的名称空间中创建pod:

kubectl create -f resource-quota-pod-1.yaml --namespace resource-quota-demo
pod "resource-quota-pod-1" created

pod之所以成功创建,是因为容器的请求和限制都在名称空间的资源配额中。让我们通过检查 ResourceQuota 对象的当前使用量来验证这一点:

kubectl get resourcequota --namespace resource-quota-demo --output=yaml

响应如下:

status:hard:limits.cpu: "2"limits.memory: 3Girequests.cpu: 1400mrequests.memory: 2Giused:limits.cpu: 1200mlimits.memory: 2Girequests.cpu: 800mrequests.memory: 1395864371200m

如你所见,第一个pod已经消耗了 ResourceQuota 中的一些资源。让我们创建另一个pod,以进一步增加可用资源的消耗:

apiVersion: v1
kind: Pod
metadata:name: resource-quota-pod-2
spec:containers:- name: resource-quota-ctr-2image: httpd:2.4resources:limits:memory: "1.3Gi"cpu: 0.9requests:memory: "1Gi"cpu: 0.8

我们保存为 resource-quota-pod-2.yaml 并创建pod:

kubectl create -f resource-quota-pod-2.yaml --namespace resource-quota-demo

运行此命令将导致以下错误:

Error from server (Forbidden): error when creating "resource-quota-pod-2.yaml": pods "resource-quota-pod-2" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=900m,limits.memory=1395864371200m,requests.cpu=800m,requests.memory=1Gi, used: limits.cpu=1200m,limits.memory=2Gi,requests.cpu=800m,requests.memory=1395864371200m, limited: limits.cpu=2,limits.memory=3Gi,requests

如上所见,Kubernetes不允许我们创建这个pod,因为容器的CPU和RAM请求和限制超出了这个名称空间的 ResourceQuota 要求。

清理

这个例子已经完成了,让我们来清理一下:
删除名称空间:

kubectl delete namespace resource-quota-demo
namespace "resource-quota-demo" deleted

总结

我们已经讨论了如何设置默认的资源请求和限制,以及如何在Kubernetes名称空间中为容器创建资源约束和资源配额。

如你所见,通过设置名称空间中的容器的默认请求和限制,我们可以在没有人工指定的资源请求和限制的情况下,强制使用名称空间范围的资源政策。

此外,我们还了解了如何使用资源约束来限制容器在名称空间中消耗的资源数量。该特性有助于不同应用程序类和团队有效地管理资源,并确保集群中空闲资源的持续可用性。同样的效果(但在更大的范围内)可以通过资源配额来实现,这允许定义名称空间中所有容器的资源总消耗的资源约束。

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

利用Kubernetes名称空间来管理内存和CPU资源(三)相关推荐

  1. 利用Kubernetes名称空间来管理内存和CPU资源(二)

    女主宣言 众所周知,Kubernetes是允许指定CPU和RAM的请求和限制的,这一特性对于单独的pod的资源消耗管理非常有用.在本系列文章中,我们将向大家展示集群资源的高效管理的三种策略. PS:丰 ...

  2. 利用Kubernetes名称空间来管理内存和CPU资源(一)

    女主宣言 众所周知,Kubernetes是允许指定CPU和RAM的请求和限制的,这一特性对于单独的pod的资源消耗管理非常有用.在本系列文章中,我们将向大家展示集群资源的高效管理的三种策略. PS:丰 ...

  3. Kubernetes基本入门-名称空间资源(三)

    名称空间级资源 名称空间在kubernetes中主要的作用是做资源隔离,因此名称空间级别的资源只在当前名称空间下有效. 工作负载型资源 工作负载(workload)是在Kubernetes上运行的应用 ...

  4. C++ Primer Plus学习(九)——内存模型和名称空间

    内存模型和名称空间 单独编译 存储持续性.作用域和链接性 名称空间 单独编译 程序一般可以分为三部分: 头文件:包含结构声明和使用这些结构的函数的原型: 源代码文件:包含与结构有关的函数的代码: 源代 ...

  5. C++ Primer Plus 第九章答案 内存模型和名称空间

    9.5复习题 //1 homer将自动成为自动变量 在一个文件中将secret定义为外部变量,并在第二个文件中使用extern声明它 在外部定义前加上关键字static,将topsecret定义为一个 ...

  6. 【C++】C++PrimerPlus(第6版)中文版 第9章 内存模型和名称空间 编程练习 参考答案

    自己编写的参考答案,在VS2019中都可以编译通过,不是标准答案,也不是最优答案,仅供参考 1.下面是一个头文件 //golf.h – for pr9-1.cpp const int Len = 40 ...

  7. 托管非托管_如何利用Kubernetes的力量来优化您的托管成本

    托管非托管 by Daniele Polencic 由Daniele Polencic 如何利用Kubernetes的力量来优化您的托管成本 (How to leverage the power of ...

  8. Linux内存管理内存映射以及通过反汇编定位内存错误问题

    提到C语言,我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的! 我们需要知道--变量,其实是内存地址的一个抽像名字罢了.在静态编译的程序中,所有的变量名都会在编译时被转成内存地址.机器 ...

  9. 函数对象 函数嵌套 名称空间与作用域

    函数对象: 函数是第一类对象,即函数可以当做数据传递 1 可以被引用 2 可以当做参数传递 3 返回值可以是函数  (函数名 不带() 就是函数名的内存地址,带括号就是执行函数) 4 可以当做容器类型 ...

最新文章

  1. 多线程之synchronized
  2. Java数据结构和算法(四)——栈
  3. Visual Studio 2019 + Visual C++——创建Visual C++ Hello World! 程序
  4. 【Tools】TortoiseGit安装图解
  5. ASP.NET Web Game 架构设计1--服务器基本结构
  6. ICCV2019 Workshop—VisDrone2019 Challenge 无人机视觉挑战赛
  7. HTML页面打印分页标签样式
  8. sql数据表改为自动递增显示与其他表关联_MySQL萌新第一季 第四话-数据表的基本操作...
  9. 探秘Spring AOP(下)
  10. 关于CMS的那点事 I
  11. sql服务器显示error,SQL server 2008 登陆服务器时提示错误233
  12. [病毒木马] LSP劫持
  13. mac快捷键大全超清示意图动态壁纸
  14. VMware中Linux网络配置
  15. 关于python搜题的软件哪个好_搜题用哪个软件好?
  16. 穿膜肽TAT修饰载荧光探针香豆素-6脂质体
  17. Android 仿淘宝京东等我的订单界面及任意列表拓展
  18. 使用普通打印机打印条码标签
  19. 常用的行列式和矩阵的性质
  20. USACO--Milking Cows (C语言)挤奶牛

热门文章

  1. [note]抽象类和接口的相同点和不同点
  2. Struts2中动态的指定返回的结果集
  3. 动态SQL及SQL片段、_parameter、#{}和${}的区别
  4. JS:正则表达式详细语法基础
  5. mysql配置master_mysql 主从配置(master/slave)
  6. java enum类探索
  7. 解决linux删除文件后空间没有释放问题
  8. 中国程序员的最后归宿
  9. Hive UDAF开发
  10. ASP.NET部署与安装_MSI制作图文教程.