写点什么

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

2019 年 11 月 21 日

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

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


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


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


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


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


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


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


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


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


为名称空间设置最小和最大资源约束


在这个例子中,我们将为命名空间创建资源约束。这些约束本质上是容器可以在资源请求和限制中使用的最小和最大资源量。让我们看看它是如何工作的!


与前面的例子一样,首先创建名称空间:


kubectl create namespace resource-constraints-demonamespace "resource-constraints-demo" created
复制代码


接下来,我们将为这个名称空间创建一个限制范围:


apiVersion: v1kind: LimitRangemetadata:  name: resource-constraints-lrspec:  limits:  - max:      memory: 1Gi      cpu: 0.8    min:      memory: 500Mi      cpu: 0.3    type: Container
复制代码


保存 LimitRange 为 limit-range-2.yaml 并创建它:


kubectl create -f limit-range-2.yaml --namespace resource-constraints-demolimitrange "resource-constraints-lr" created
复制代码


在创建了限制范围之后,让我们看看我们的最小和最大资源约束是否应用于名称空间:


kubectl get limitrange resource-constraints-lr --namespace resource-constraints-demo --output=yaml 
复制代码


响应如下:


spec:  limits:  - default:      cpu: 800m      memory: 1Gi    defaultRequest:      cpu: 800m      memory: 1Gi    max:      cpu: 800m      memory: 1Gi    min:      cpu: 300m      memory: 500Mi    type: Container
复制代码


正如你所看到的,你的名称空间的默认资源请求和限制被自动设置为在 LimitRange 内指定的最大资源约束。现在,当我们在 resource-constraints-demo 名称空间中创建容器时,下面的规则将自动应用:


  • 如果容器没有指定它的资源请求和限制,则应用默认的资源请求和限制。

  • 名称空间中的所有容器都需要有大于或等于 3 亿的资源请求,用于 CPU 和 500 Mi 内存。

  • 名称空间中的所有容器都需要资源限制小于或等于 8 亿,用于 CPU 和 1 Gi 内存。


让我们创建一个 pod 来说明如何将名称空间资源约束应用到容器中:


apiVersion: v1kind: Podmetadata:  name: resource-constraints-podspec:  containers:  - name: resource-constraints-ctr    image: httpd:2.4    resources:      limits:        memory: "900Mi"        cpu: 0.7      requests:        memory: "600Mi"        cpu: 0.4
复制代码


该规范请求 600 Mi RAM 和 0.4 CPU,并为这个 pod 中的 httpd 容器设置 900 Mi RAM 和 0.7 CPU 的限制。这些资源需求满足了名称空间的最小和最大约束。


我们保存为 default-resources-demo-pod-3.yaml 并在我们的名称空间中创建 pod:


kubectl create -f resource-constraints-pod.yaml --namespace resource-constraints-demopod "resource-constraints-pod" created
复制代码


接下来,检查分配给 pod 中的容器的资源:


kubectl get pod resource-constraints-pod --namespace resource-constraints-demo --output=yaml
复制代码


你应该得到以下输出:


containers:  - image: httpd:2.4    imagePullPolicy: IfNotPresent    name: resource-constraints-ctr    resources:      limits:        cpu: 700m        memory: 900Mi      requests:        cpu: 400m        memory: 600Mi
复制代码


之所以成功创建 pod,是因为容器的请求和限制在名称空间的最小和最大约束范围内。


现在,让我们看看如果我们指定的请求和限制超出了为名称空间定义的最小值和最大值,会发生什么。让我们用新的请求和限制来创建一个新的 pod:


apiVersion: v1kind: Podmetadata:  name: resource-constraints-pod-2spec:  containers:  - name: resource-constraints-ctr-2    image: httpd:2.4    resources:      limits:        memory: "1200Mi"        cpu: 1.2      requests:        memory: "200Mi"        cpu: 0.2
复制代码


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


kubectl create -f resource-constraints-pod-2.yaml --namespace resource-constraints-demopod "resource-constraints-pod-2" created
复制代码


由于资源请求低于最小 LimitRange 的值,并且资源限制超出了这个名称空间的最大值,所以 pod 不会像预期的那样被创建:


Error from server (Forbidden): error when creating "resource-constraints-pod-2.yaml": pods "resource-constraints-pod-2" is forbidden: [minimum memory usage per Container is 500Mi, but request is 200Mi., minimum cpu usage per Container is 300m, but request is 200m., maximum cpu usage per Container is 800m, but limit is 1200m., maximum memory usage per Container is 1Gi, but limit is 1200Mi.]
复制代码


清理


在这个例子完成之后,让我们清理一下。


删除名称空间:


kubectl delete namespace resource-constraints-demonamespace "resource-constraints-demo" deleted
复制代码


总结


在本篇文章中,我们将向大家展示了为名称空间设置最小和最大资源约束。后续系列文章将会继续展示:为名称空间中的所有容器设置资源配额。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/y5hA6tvw8RosCxozxaayrw


2019 年 11 月 21 日 17:39139

评论

发布
暂无评论
发现更多内容

第五周课后作业

iHai

极客大学架构师训练营

架构师训练营第五周总结

跨域刀

极客大学架构师训练营

架构师训练营:第五周总结

zcj

极客大学架构师训练营

多线程获取结果还在使用Future轮询获取结果吗?CompletionService快来了解下吧。

java金融

Java 多线程 Feature CompletionService

架构师训练营 week05 作业 -- 一致性 Hash 算法

尔东雨田

极客大学架构师训练营

一致性hash算法实现

stars

一致性Hash算法

走过路过飞过

架构师训练营-作业5

进击的炮灰

架构师训练营-第五周-作业1

A Matt

week5.学习总结

个人练习生niki

架构师训练营week5 总结+作业

林毋梦

第五周

Geek_2b3614

极客大学架构师训练营

架构师训练营第五周

跨域刀

极客大学架构师训练营

负载均衡概述及优缺点对比

破晓_dawn

【架构思维学习】 week05

chun1123

算法 一致性哈希

架构师训练营 第五周 总结

CR

【架构思维 - 学习总结】week05

chun1123

缓存 学习

架构师训练营-第五周-作业2

A Matt

架构培训 -05 学习总结 缓存、消息和负载均衡

刘敏

Week5-总结

龙7

架构师训练营week05 homework

Nick

极客大学架构师训练营

缓存技术-分布式Redis

阿飞

架构

架构师训练营第 0 期 - 第 5 周 - 学习总结

week05 小结

Geek_196d0f

一致性hash原理及实现(python版)

破晓_dawn

技术选型 - 第五周(初稿)

X﹏X

week5总结

分布式一致性hash算法

_MISSYOURLOVE

极客大学架构师训练营 第五周

第五周·命题作业·一致性hash

刘璐

Week5 作业一

Coder

Week5 总结

Coder

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

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