配置Pods和containers--为Containers和Pods分配内存资源

指定内存请求和内存限制

要为容器指定内存请求,在容器的资源清单中使用resources:requests字段。要指定内存限制,使用resources:limits。

memory-request-limit.yaml
 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: memory-demo
 5   namespace: mem-example
 6 spec:
 7   containers:
 8   - name: memory-demo-ctr
 9     image: polinux/stress
10     resources:
11       limits:
12         memory: "200Mi"
13       requests:
14         memory: "100Mi"
15     command: ["stress"]
16     args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

配置文件中的args部分在容器启动时为其提供参数。“-vm bytes”、“150M”参数告诉容器尝试分配150 MiB的内存。

创建Pod:

kubectl apply -f memory-request-limit.yaml --namespace=mem-example

确认POD容器正在运行:

kubectl get pod memory-demo --namespace=mem-example

查看有关POD的详细信息:

kubectl get pod memory-demo --output=yaml --namespace=mem-example

输出显示pod中的一个容器具有100 MiB的内存请求和200 MiB的内存限制。

...
resources:
  limits:
    memory: 200Mi
  requests:
    memory: 100Mi
...

运行kubectl top获取pod的度量:

kubectl top pod memory-demo --namespace=mem-example

输出显示POD使用了大约162900000字节的内存,大约是150MiB。这大于POD的100MiB请求,但在POD的200 MiB限制内。

NAME                        CPU(cores)   MEMORY(bytes)
memory-demo                 <something>  162856960

删除POD:

kubectl delete pod memory-demo --namespace=mem-example

超过容器的内存限制

如果节点有可用内存,则容器可以超出其内存请求。但是一个容器不允许使用超过其内存限制。如果容器分配的内存超过其限制,则该容器将成为终止的候选对象。如果容器继续消耗超出其限制的内存,则容器将终止。如果终止的容器可以重新启动,kubelet将重新启动它,就像任何其他类型的运行时失败一样。

memory-request-limit-2.yaml
 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: memory-demo-2
 5   namespace: mem-example
 6 spec:
 7   containers:
 8   - name: memory-demo-2-ctr
 9     image: polinux/stress
10     resources:
11       requests:
12         memory: "50Mi"
13       limits:
14         memory: "100Mi"
15     command: ["stress"]
16     args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]

在配置文件的args部分,可以看到容器将尝试分配250 MiB的内存,这远远高于100 MiB的限制。

创建Pod:

kubectl apply -f memory-request-limit-2.yaml --namespace=mem-example

查看有关POD的详细信息:

kubectl get pod memory-demo-2 --namespace=mem-example

此时,容器可能正在运行或被终止。重复上述命令,直到容器被终止:

NAME            READY     STATUS      RESTARTS   AGE
memory-demo-2   0/1       OOMKilled   1          24s

获取容器状态的更详细视图:

kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example

输出显示容器因内存不足(OOM)而被终止:

lastState:
   terminated:
     containerID: docker://65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10f
     exitCode: 137
     finishedAt: 2017-06-20T20:52:19Z
     reason: OOMKilled
     startedAt: null

容器可以重新启动,因此kubelet会重新启动它。多次重复此命令,以查看容器是否被重复终止和重新启动:

kubectl get pod memory-demo-2 --namespace=mem-example

输出显示容器被终止、重新启动、再次终止、再次重新启动,依此类推:

kubectl get pod memory-demo-2 --namespace=mem-example
NAME            READY     STATUS      RESTARTS   AGE
memory-demo-2   0/1       OOMKilled   1          37s
kubectl get pod memory-demo-2 --namespace=mem-example
NAME            READY     STATUS    RESTARTS   AGE
memory-demo-2   1/1       Running   2          40s

查看有关POD历史记录的详细信息:

kubectl describe pod memory-demo-2 --namespace=mem-example

输出显示容器重复启动和失败:

... Normal  Created   Created container with id 66a3a20aa7980e61be4922780bf9d24d1a1d8b7395c09861225b0eba1b1f8511
... Warning BackOff   Back-off restarting failed container

查看有关群集节点的详细信息:

kubectl describe nodes

输出包括由于内存不足而被终止的容器的记录:

Warning OOMKilling Memory cgroup out of memory: Kill process 4481 (stress) score 1994 or sacrifice child

删除Pod:

kubectl delete pod memory-demo-2 --namespace=mem-example

指定对节点来说太大的内存请求

内存请求和限制与容器相关,但将pod视为具有内存请求和限制是有用的。Pod的内存请求是pod中所有容器的内存请求的总和。同样,pod的内存限制是pod中所有容器的限制之和。

Pod调度基于请求。只有当节点有足够的可用内存来满足Pod的内存请求时,Pod才计划在节点上运行。

如下,创建一个Pod,该Pod的内存请求太大,超过集群中任何节点的容量。这是一个Pod的配置文件,其中有一个容器请求1000 GiB的内存,这可能超过集群中任何节点的容量。

 memory-request-limit-3.yaml

 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: memory-demo-3
 5   namespace: mem-example
 6 spec:
 7   containers:
 8   - name: memory-demo-3-ctr
 9     image: polinux/stress
10     resources:
11       limits:
12         memory: "1000Gi"
13       requests:
14         memory: "1000Gi"
15     command: ["stress"]
16     args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

创建Pod:

kubectl apply -f memory-request-limit-3.yaml --namespace=mem-example

查看POD状态:

kubectl get pod memory-demo-3 --namespace=mem-example

输出显示POD状态为挂起。也就是说,pod不计划在任何节点上运行,它将无限期地保持在挂起状态:

kubectl get pod memory-demo-3 --namespace=mem-example
NAME            READY     STATUS    RESTARTS   AGE
memory-demo-3   0/1       Pending   0          25s

查看有关POD的详细信息,包括事件:

kubectl describe pod memory-demo-3 --namespace=mem-example

输出显示,由于节点上的内存不足,无法计划容器:

Events:
  ...  Reason            Message
       ------            -------
  ...  FailedScheduling  No nodes are available that match all of the following predicates:: Insufficient memory (3).

内存单元

内存资源以字节为单位。您可以使用以下后缀之一将内存表示为普通整数或定点整数:E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki。例如,以下内容表示大致相同的值:

128974848, 129e6, 129M , 123Mi

如果未指定内存限制

如果未指定容器的内存限制,则下列情况之一适用:

- 容器使用的内存量没有上限。容器可以使用运行它的节点上的所有可用内存,而这些内存又可以调用OOM kill。此外,在OOM终止的情况下,没有资源限制的容器被终止的可能性更大。

- 容器正在具有默认内存限制的命名空间中运行,容器将自动分配默认限制。群集管理员可以使用LimitRange指定内存限制的默认值。

内存请求和限制的动机

通过为集群中运行的容器配置内存请求和限制,可以有效地利用集群节点上可用的内存资源。通过保持pod的内存请求较低,可以给pod很好的被调度的机会。通过具有大于内存请求的内存限制,您可以完成两件事:

- pod可以有突发的活动,在那里它利用的内存恰好是可用的。

- pod在突发期间可以使用的内存量被限制在某个合理的数量。

原文地址:https://www.cnblogs.com/UniqueColor/p/11606933.html

时间: 2024-10-30 15:40:51

配置Pods和containers--为Containers和Pods分配内存资源的相关文章

配置Pods和containers--为Containers和Pods分配CPU资源

指定CPU请求和CPU限制 要为容器指定CPU请求,在容器资源清单中使用resources:requests字段.要指定CPU限制,使用resources:limits. cpu-request-limit.yaml 1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: cpu-demo 5 namespace: cpu-example 6 spec: 7 containers: 8 - name: cpu-demo-ctr 9 image: vish

1-2 给容器和PODS 分配CPU资源

这一小节讲述 如何对容器分配CPU资源和对CPU资源使用做限制.一个容器被保证有足够的CPU资源可以被调用,但是也不允许使用超过CPU资源的限制. 创建一个命名空间 kubectl create namespace cpu-example 定义一个CPU资源请求和CPU资源限制 资源请求resources:requests 资源限制resources:limits 在这个练习中,你创建了一个POD拥有 0.5cpu和1cpu的限制apiVersion: v1kind: Podmetadata:n

Asp.Net配置不允许通过url方式访问目录下的资源

Asp.Net网站发布后,有部分文件为了安全性,是不能直接通过url访问获取 通常有2种做法: 1.将文件目录建立在 App_code 或者App_Data 等默认的隐藏目录下 2.将文件的目录添加到请求筛选的隐藏段里面,使文件不可直接通过url访问 在IIS配置是请求筛选--->添加隐藏段 ,在IIS里面的配置其实就是配置web.Config文件 也可以直接在web.Config文件里面配置,configuration/system.webServer/security/requestFilt

STL—内存的配置与释放

上一篇我们介绍了STL对象的构造与析构,这篇介绍STL内存的配置与释放. STL有两级空间配置器,默认是使用第二级.第二级空间配置器会在某些情况下去调用第一级空间配置器.空间配置器都是在allocate函数内分配内存,在deallocate函数内释放内存. 第一级空间配置器 第一级配置器只是对malloc函数和free函数的简单封装,在allocate内调用malloc,在deallocate内调用free.同时第一级配置器的oom_malloc函数,用来处理malloc失败的情况.如下所示:

2.SGI STL第二级空间配置器__default_alloc_template的chunk_alloc函数

SGISTL默认使用二级空间配置器,当需要配置的区块大于128 bytes时SGI STL调用一级空间配置器,一级空间配置器的allocate函数直接使用malloc分配内存,deallocate函数直接使用free释放内存.当需要配置的区块小于128 bytes时SGI STL调用二级空间配置器. 相比于一级空间配置器简单粗暴的内存使用方法,二级空间配置器对内存的使用显得精细很多. 二级空间配置器的具体用法请看书,我就不抄书了,只对二级空间配置器中容易糊涂的地方写一下我的理解. 内存池和fre

Kubernetes Pod概述

Pod简介 Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程. 一个Pod封装一个应用容器,Pod代表部署的一个单位. Pods提供两种共享资源:网络和存储. 网络:每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口. 存储:Pod可以指定一组共享存储volumes.Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据. Pod不会自愈.如果Pod运行的Node故障,或者是调度器本身

隐藏Console窗口无效(续1)

[2014/10/19  23:57 ] :通过端口远程控制主机.运行程序之后,程序自动开放本机的999端口,其他电脑便可以通过999端口对本机操作. 程序中使用的到的命令: telnet测试端口命令: telnet IP 端口 或者 telnet 域名 端口(若telnet不是内部命令,使用打开或关闭windows功能,启动Telnet服务) netstat 测试开放的端口号 使用ipconfig控制网络连接的一个命令行工具.它的主要功用,包括用来显示现时网络连接的设置(/all参数),或通过

求助(VC++) 隐藏Console窗口无效

[逝去的100~~ 2014/10/07 20: 20] 程序想要实现控制台窗口的隐藏,但是窗口每次运行总会弹出来.为什么呢? 代码如下: // Mini.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #pragma comment(lib,"ws2_32.lib") #include <winsock2.h> #include <windows.h> //#pragma comment(linker, &

数据库连接池的原理

这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. 一.早期我们怎么进行数据库操作        1.原理:一般来说,java应用程序访问数据库的过程是: ①装载数据库驱动程序: ②通过jdbc建立数据库连接: ③访问数据库,执行sql语句: ④断开数据库连接.        2.代码  // 查询所有用户 [java] view plain copy print? Public void FindAllUsers(){ //1.装载s