这一小节讲解如何分配内存请求和对一个容器做内存限制。一个容器被保证拥有足够的内存可以处理请求,但是也不允许使用超过限制的内存。

开始之前

需要拥有一个k8s集群

需要安装好一个kubectl 工具,并且能够与集群通信。

如果没有准备好,你可以使用minikube或者使用以下的练习场地。

https://www.katacoda.com/courses/kubernetes/playground

http://labs.play-with-k8s.com/

可以使用以下命令,检测版本

kubectl version

集群中的每个节点,至少拥有300MB的内存。

本文中的一些步骤要求你在集群中有运行 metrics-server 的服务,如果你没有运行,你可以跳过这些步骤。

如果你使用的是minikube ,你可以使用以下命令来启用:

minikube addons enable metrics-server

检查 metrics-server是否运行,或者其它提供 metrics api 资源 (metrics.k8s.io),你可以使用以下的命令

kubectl get apiservices

如果 metrics api 资源是可用的,会响应以下内容:

NAME
v1beta1.metrics.k8s.io

创建命名空间

创建命名空间来保证当前的测试环境和集群的其它环境的隔离的。

定义一个内存请求和内存限制

定义一个内存请求:
resources:requests

定义一个内存限制:
resources:limits

在这个练习中,你创建了一个POD包含一个容器,容器申请了100MB的内存,并且设置了200MB内存限制。

apiVersion: v1
kind: Pod
metadata:
name: memory-demo
namespace: mem-example
spec:
containers:
name: memory-demo-ctr
image: polinux/stress
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

args是 提供容器启动的参数。

"--vm-bytes", "150M" 告诉容器分配多少内存

创建一个POD

kubectl create -f https://k8s.io/examples/pods/resource/memory-request-limit.yaml --namespace=mem-example

验证POD是否运行

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

查看POD的详细信息,并输出到yaml

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

获取POD的技术指标
kubectl top pod memory-demo --namespace=mem-example

显示的内存大小是 162,900,000 bytes ,大约是150MB,大于分配的100MB内存,小于200MB的内存限制。

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

删除POD

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

配置容器的内存限制

如果节点有足够的内存,那么容器就可以执行内存的分配请求。但是一个容器不允许使用
超出它的限制的内存。如果一个容器分配的内存超出了它的限制,该容器成为了被停止的候选人。
如果一个容器持续的使用超过自己内存限制的情况,该容器会被停止。如果一个停止的容器
能够被重启,和其它的运行错误一样,kubelet也会去重启它。

在这个练习中,你可以尝试创建一个POD,并且分配超出它限制的内存。
以下为创建一个POD,拥有一个容器,分配50MB的内存,并且设置了100MB的内存限制

apiVersion: v1
kind: Pod
metadata:
name: memory-demo-2
namespace: mem-example
spec:
containers:

  • name: memory-demo-2-ctr
    image: polinux/stress
    resources:
    requests:
    memory: "50Mi"
    limits:
    memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]

    在 args 选项,我们尝试分配了250MB的内存,超过了我们设置的100MB限制。

创建POD

kubectl create -f https://k8s.io/examples/pods/resource/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拥有一个容器,要求1000GB的内存,超过了集群中的任意节点的内存容量。

apiVersion: v1
kind: Pod
metadata:
name: memory-demo-3
namespace: mem-example
spec:
containers:

  • name: memory-demo-3-ctr
    image: polinux/stress
    resources:
    limits:
    memory: "1000Gi"
    requests:
    memory: "1000Gi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

创建POD
kubectl create -f https://k8s.io/examples/pods/resource/memory-request-limit-3.yaml --namespace=mem-example

查看POD状态

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

状态显示POD为 PENDING 。 意味着POD没有被调度到任何一个节点上面。它将会被无限期
停留在PENDING状态。

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).

内存单元

内存的资源是用bytes来衡量。你可以用普通整数或者带小数点的整数来表达内存容量。

后缀为E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki.

例如下面的值:

128974848, 129e6, 129M , 123Mi

删除POD
kubectl delete pod memory-demo-3 --namespace=mem-example

如果你没有定义内存限制

如果你没有设置内存限制,以下的情况将被适用:

  1. 容器没有内存的上限边界。容器能够使用节点的所有可用内存。
  2. 容器运行的命名空间有默认的内存限制,容器将被自动分配这个默认的限制。集群管理员
    可用使用 LimitRange 来定义内存限制的默认值。

内存请求和限制的动机

在运行的集群中对容器进行内存的分配和限制,可以使集群的内存资源使用效率更高。
保持POD的内存请求较低,这样POD可以有机会可以被调度。设置内存限制比内存分配更好,
你可以完成以下的两件事情:

    POD 可能存在对内存的爆发性需求POD内存容量的爆发可以被限制在合理的区间。

清除

清除命名空间。删除以上练习创建的所有POD

kubectl delete namespace mem-example

转载于:https://blog.51cto.com/binuu/2304902

1-1 分配内存资源给容器和POD相关推荐

  1. 容器编排技术 -- Kubernetes 给容器和Pod分配内存资源

    容器编排技术 -- Kubernetes 给容器和Pod分配内存资源 1 Before you begin 2 创建一个命名空间 3 配置内存申请和限制 4 超出容器的内存限制 5 配置超出节点能力范 ...

  2. 如何使用阿里云容器服务保障容器的内存资源质量

    作者:韩柔刚(申信) 背景 云原生场景中,应用程序通常以容器的形式部署和分配物理资源.以 Kubernetes 集群为例,应用工作负载以 Pod 声明了资源的 Request/Limit,Kubern ...

  3. VC++“内存资源不足,无法完成此操作”——解决的心路历程(User对象)

    在上周客户反馈了一个问题,大概意思是在他windows上安装的识别软件中,识别一百多张内容比较复杂的图片时,出现了"刚开始识别的没问题,但是识别到100来张时发现之后的图片都不识别了,没有识 ...

  4. 服务器安装虚拟机怎么分配内存,配置虚拟机的内存的方法

    很多情况下我们都会用到虚拟机,那么我们应该如何配置虚拟机的内存呢?不知道的话跟着学习啦小编一起来学习了解配置虚拟机的内存的方法. 配置虚拟机的内存的方法 可以使用以下过程指定主机上要为新虚拟机分配的内 ...

  5. 如何给docker容器分配内存和cpu

    如何给docker容器分配内存和cpu?默认情况下,容器使用的资源是不受限制的.也就是可以使用主机内核调度器所允许的最大资源.但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制,下面我们 ...

  6. linux docker 分配资源,Docker 容器资源限制

    Docker 容器资源限制 默认情况下,一个容器并没有资源限制,并且该容器可以使用内核调度的所有资源.Docke提供了在启动容器时设置一些参数来控制该容器使用的内存.cpu和IO. OOME:在lin ...

  7. Ubuntu查看系统任务管理器(cpu+内存资源占用)+查看虚拟机分配核心数

    Ubuntu查看系统任务管理器(cpu+内存资源占用) 命令: gnome-system-monitor 打开ubuntu下的任务管理器,启动桌面管理,显示系统cpu,内存占用情况. 参考:https ...

  8. 容器编排技术 -- Kubernetes 给容器和Pod分配CPU资源

    容器编排技术 -- Kubernetes 给容器和Pod分配CPU资源 1 Before you begin 2 创建一个命名空间 3 声明一个CPU申请和限制 4 CPU 单位 5 请求的CPU超出 ...

  9. W3wp.exe占用CPU及内存资源

    问题背景 最近使用一款系统,但是经常出现卡顿或者用户账号登录不了系统.后来将问题定位在了服务器中的"w3wp.exe"这个进程.在我们的用户对系统进行查询.修改等操作后,该进程占用 ...

最新文章

  1. Tengine AIFramework框架
  2. mybatis plus 日志打印_mybatis升级为mybatis-plus踩到的坑
  3. python 新建一列_python – 如何处理列名称和创建新列
  4. JSONObject、JSONArray区别
  5. 【C++】Visual studio样式定制
  6. 从零搭建 dubbogo
  7. 主流Java学习路线
  8. Linux Tomcat8 启动堆内存溢出
  9. c语言函数大全 chm,【oeasy丨c语言丨函数】C语言库函数使用大全CHM版
  10. mysql和python先学哪个_Python数据库操作 初识mysql和mysql基本操作#学习猿地
  11. SpringBoot 使用Class.forName方法返回java.lang.ClassNotFoundException
  12. truecrypt linux用法,TrueCrypt介绍及入门使用讲解【翻译】
  13. 电脑连接SONY蓝牙耳机没有声音
  14. 转:用AutoCAD 系统变量编程
  15. 移动云mas 通过HTTP请求发送普通短信和 模板短信
  16. python中运用django_【Django】在项目中使用python
  17. 用python放烟花咯
  18. Redhat_rhel_linux镜像下载,持续更新......
  19. 使用Youtube官方API订阅功能的实现
  20. Linux环境下安装Oracle 11g R2完整图文教程

热门文章

  1. 【DocFX文档翻译】DocFX 入门 (Getting Started with DocFX)
  2. Rushcrm:企业部署CRM系统做什么
  3. CentOS 6.5 下Vim 配置图解
  4. UIScrollView offset in UINavigationController
  5. JSTL 读取数组 和 字符串连接
  6. 远程安装oracle 10.2.1 for redhat 5.0 2.6.18-53.el5xen
  7. SpringMVC之请求参数的获取方式
  8. 小巧的日志记录组件 - 开源研究系列文章
  9. 201621123075作业12-流与文件
  10. Linux I2C工具查看配置I2C设备【转】