指定内存请求和内存限制

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

  1. 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", "", "--vm-bytes", "150M", "--vm-hang", ""]

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

创建Pod:

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

确认POD容器正在运行:

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

查看有关POD的详细信息:

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

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

  1. ...
  2. resources:
  3. limits:
  4. memory: 200Mi
  5. requests:
  6. memory: 100Mi
  7. ...

运行kubectl top获取pod的度量:

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

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

  1. NAME CPU(cores) MEMORY(bytes)
  2. memory-demo <something>

删除POD:

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

超过容器的内存限制

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

  1. memory-request-limit-2.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. requests:
  12. memory: "50Mi"
  13. limits:
  14. memory: "100Mi"
  15. command: ["stress"]
  16. args: ["--vm", "", "--vm-bytes", "250M", "--vm-hang", ""]

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

创建Pod:

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

查看有关POD的详细信息:

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

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

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

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

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

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

  1. lastState:
  2. terminated:
  3. containerID: docker://65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10f
  4. exitCode:
  5. finishedAt: --20T20::19Z
  6. reason: OOMKilled
  7. startedAt: null

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

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

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

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

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

  1. kubectl describe pod memory-demo- --namespace=mem-example

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

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

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

  1. kubectl describe nodes

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

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

删除Pod:

  1. kubectl delete pod memory-demo- --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-
  5. namespace: mem-example
  6. spec:
  7. containers:
  8. - name: memory-demo--ctr
  9. image: polinux/stress
  10. resources:
  11. limits:
  12. memory: "1000Gi"
  13. requests:
  14. memory: "1000Gi"
  15. command: ["stress"]
  16. args: ["--vm", "", "--vm-bytes", "150M", "--vm-hang", ""]

创建Pod:

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

查看POD状态:

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

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

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

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

  1. kubectl describe pod memory-demo- --namespace=mem-example

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

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

内存单元

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

  1. , 129e6, 129M , 123Mi

如果未指定内存限制

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

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

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

内存请求和限制的动机

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

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

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

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

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

    指定CPU请求和CPU限制 要为容器指定CPU请求,在容器资源清单中使用resources:requests字段.要指定CPU限制,使用resources:limits. cpu-request-li ...

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

    Asp.Net网站发布后,有部分文件为了安全性,是不能直接通过url访问获取 通常有2种做法: 1.将文件目录建立在 App_code 或者App_Data 等默认的隐藏目录下 2.将文件的目录添加到 ...

  3. 配置AD RMS及SharePoint 2013 IRM问题解决及相关资源

    最近配置AD RMS及SharePoint 2013 IRM遇到几个问题: 1. RMS配置好后,client端连不上, 一直要求输入用户名和密码. 后来换了台不是SP的机器,并用内部DB,搞定.   ...

  4. MySQL5.7.19 免安装配置 + Navicat for MySQL安装和破解(附全部资源)

    近段时间因为工作原因安装了好多次本地MySQL,安装过程也是时有曲折,索性记录一下. 环境: Win10 家庭版 MySQL5.7.19   (链接:https://pan.baidu.com/s/1 ...

  5. IDEA maven 配置,运行比较慢,加截本地仓库资源数据

    在 Runner 配置了参数: -DarchetypeCatalog=internal

  6. mysql 分配内存大小配置

    优化 innodb_buffer_pool_size  = 10*1024*1024*1024

  7. idea配置tomcat运行参数,防止中文乱码和内存问题

    点击选择 Edit Configurations... 修改 VM options ,参数在最后可直接复制 -Xms550m -Xmx1250m -Dfile.encoding=UTF-8

  8. STL—内存的配置与释放

    上一篇我们介绍了STL对象的构造与析构,这篇介绍STL内存的配置与释放. STL有两级空间配置器,默认是使用第二级.第二级空间配置器会在某些情况下去调用第一级空间配置器.空间配置器都是在allocat ...

  9. STL源码剖析(空间配置器)

    前言 在STL中,容器的定义中都带一个模板参数,如vector template <class T, class Alloc = alloc> class vector {...} 其中第 ...

随机推荐

  1. Appium中wait_activity的使用以及XPATH定位

    # -*- coding:utf-8 -*- from appium import webdriver from time import sleep desired_caps ={ 'platform ...

  2. 【转】Linux 网络工具详解之 ip tuntap 和 tunctl 创建 tap/tun 设备

    原文:https://www.cnblogs.com/bakari/p/10449664.html -------------------------------------------------- ...

  3. 20180527模拟赛T1——新田忌赛马

    [问题描述] (注:此题为d2t2-难度) 田忌又在跟大王van赛马的游戏 田忌与大王一共有2n匹马,每个马都有一个能力值x,1<=x<=2n且每匹马的x互不相同.每次田忌与大王放出一匹马 ...

  4. Spring AOP 知识点入门

    一.基本知识点 1.AOP概念 AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对 ...

  5. 【大数据】HBase启动

    zkServer.sh start start-dfs.sh start-yarn.sh start-hbase.sh hbase shell exit http://192.168.1.180:16 ...

  6. 51nod1803 森林直径

    [传送门] 考虑计算直径的 dp 方法. $d[u]$ 表示以 $u$ 为根的子树能 $u$ 能走到的最远距离 $dp[u]$ 表示以 $u$ 为根的子树的直径那么每次dfs一个子节点后$dp[u] ...

  7. Cyclical Quest CodeForces - 235C (后缀自动机)

    Cyclical Quest \[ Time Limit: 3000 ms\quad Memory Limit: 524288 kB \] 题意 给出一个字符串为 \(s\) 串,接下来 \(T\) ...

  8. chart.xkcd 可绘制粗略,开通,手绘样式的图表库

    chart.xkcd 可以用来绘制手绘样式的图表,使用简单,样式也挺好看 简单使用 代码 index.html <!DOCTYPE html> <html lang="en ...

  9. webpack打包vue单文件组件

    一.vue单文件组件 ①文件扩展名为 .vue 的 就是single-file components(单文件组件) ②参考文档:单文件组件 二.webpack加载第三方包 ①项目中,如果需要用到一些第 ...

  10. 构造方法(_ _construct) 和析构方法(__destruct)

    构造方法,是一个特殊的方法: 1,名字是固定的:_ _construct: 2,该方法通常都不要我们自己调用,而是在new一个对象的时候会自动调用. 3,该方法主要的目的是为了在new一个对象的时候, ...