专栏名称: HULK一线技术杂谈
HULK是360的私有云平台,丰富的一线实战经验,为你带来最有料的技术分享
目录
相关文章推荐
厦门日报  ·  宁德时代,突传大消息! ·  昨天  
厦门网  ·  正式批复!厦门新机场名字定了! ·  昨天  
厦门日报  ·  《甄嬛传》女演员自曝!网友怒了 ·  2 天前  
厦门日报  ·  特朗普:吞并加拿大,我是认真的 ·  3 天前  
51好读  ›  专栏  ›  HULK一线技术杂谈

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

HULK一线技术杂谈  · 公众号  ·  · 2018-08-07 18:01

正文

女主宣言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

apiVersion: v1
kind: LimitRange
metadata:  name: resource-constraints-lr
spec:  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-demo
limitrange "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: v1
kind: Pod
metadata:  name: resource-constraints-pod
spec:  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-demo
pod "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: v1
kind: Pod
metadata:  name: resource-constraints-pod-2
spec:  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-demo
pod "resource-constraints-pod-2" created

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







请到「今天看啥」查看全文