当前位置: 首页 > 编程日记 > 正文

1-1 分配内存资源给容器和POD

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

开始之前

需要拥有一个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

相关文章:

Java的SPI机制

Dubbo等框架使用到必须掌握。 java.sql.Driver 是 Spi&#xff0c;com.mysql.jdbc.Driver 是 Spi 实现&#xff0c;其它的都是 Api。package org.hadoop.java;public interface IService {public String sayHello(); public String getScheme(); }package org.hadoop.java…

你不知道的对称密钥与非对称密钥

&#xff08;一&#xff09;对称加密&#xff08;Symmetric Cryptography&#xff09; 对称密钥加密&#xff0c;又称私钥加密&#xff0c;即信息的发送方和接收方用一个密钥去加密和解密数据。它的最大优势是加/解密速度快&#xff0c;适合于对大数据量进行加密&#xff0c;对…

linux sntp 代码,C语言window(linux)平台的SNTP实现

C语言实现window(linux)平台的SNTP&#xff0c;本程序功能主要是实现电脑(或者设备)时间同步。摘录部分代码&#xff1a;unsigned char liVnMode; /* LeapSecond(2bits:0), VersionNumber(3bits: 3), Mode(3bits: Client3, Server4) */unsigned char stratum; /* 时间层级 (0-1…

在typescript中导入第三方类库import报错

问题 最近开始折腾typescript&#xff0c;在使用第三方类库&#xff0c;比如最常见的lodash&#xff0c;采用常规方法导入 import * as _ from lodashvscode中报错提示lodash不是module。 原因 因为第三方类库并没有ts的声明文件&#xff0c;查阅网上资料&#xff0c;有typings…

JavaAgent 实现字节码注入

新建MyAgent项目 pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apach…

php打印中文乱码

php文档的文本格式都设置成 utf-8 格式 在代码中添加 header("content-type:text/html; charsetutf-8"); 转载于:https://www.cnblogs.com/negro-guoguo/p/5421355.html

linux孤立cpu,Linux 抛弃旧款 CPU,一下子少 50 万行代码

IT 之家4 月 3 日消息 Linux 内核维护者已经决定在即将发布的新版本中抛弃对旧款 CPU 架构的支持&#xff0c;因此 Linux 4.17 内核将减少大约 500000 行代码&#xff0c;根据 Linux 统计器&#xff0c;目前它包含大约 2030 万行代码。IT 之家报道&#xff0c;将被弃用的体系架…

CSS3 从头捋

1.border-radius 边界半径 作用&#xff1a;该属性用来实现圆角 示例1实现圆角 div {border:2px solid red;width:300px;border-radius:25px; } 示例2实现圆 div {border: 1px solid red;height: 100px;width: 100px;border-radius: 50%; } 示例3 不规则圆 div {border: 1px s…

算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

算法&#xff1a;详解布隆过滤器的原理、使用场景和注意事项知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构&#xff0c;比较巧妙的概率型数据结构&#xff08;probabilistic data structure&#xff09;&#xff0c;特点是高效地插入和查询&#xff0c;可…

linux shell显示下载进度,shell脚本测试下载速度

在linux下用shell来测试下载速度&#xff0c;很实用的shell代码。代码&#xff1a;复制代码 代码示例:#!/bin/bash#date:20140210# edit: www.jquerycn.cn#used for test server download speedr_host"188.18.28.19"r_dir"/home/test0208/tmp"r_file"…

openStack调试

openStack调试 posted on 2016-04-23 22:07 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/ruiy/p/5425823.html

快应用开发常见问题以及解决方案【持续更新】

接触快应用也有一段时间了&#xff0c;踩过了大大小小的坑&#xff0c;让我活到了今天。准备在此立贴持续更新&#xff0c;记录遇到的问题以及解决方案&#xff0c;造福大众。css 方面 1、文字竖排不支持 目前官方还不支持writing-mode&#xff0c;除了等待官方支持这个api以外…

Java字节码研究

关于怎么查看字节码的五种方法参考本人另一篇文章《Java以及IDEA下查看字节码的五种方法》 1.String和常连池 先上代码&#xff1a; public class TestApp {public static void main(String[] args) {String s1 "abc";String s2 new String("abc");St…

在c语言中逗号的作用,关于c语言中的逗号运算符???

等下。。答错了。。还需要理解一下神马是逗号表达式。。我前面说的和uuyyhhjj与delta_charlie的意思一样&#xff0c;但其实我们都搞错了。你可以自己把我们的例子都运行一下&#xff0c;看看是不是这样。下面我感觉应该是我正确的理解。逗号表达式是所有运算符中优先级最低的&…

2018-2019-1 20165206 《信息安全系统设计基础》第4周学习总结

- 2018-2019-1 20165206 《信息安全系统设计基础》第4周学习总结 - 教材学习内容总结 程序员可见的状态&#xff1a;Y86-64程序中的每条指令都会读取或修改处理器状态的某些部分&#xff0c;这称为程序员可见状态。包括&#xff1a;程序寄存器、条件码、程序状态、程序计数器和…

PHP——图片上传

图片上传 Index.php文件代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title> </head> <body><form action"upload2.php" method"p…

IDEA实用插件和技巧

《解决lambda expressions are not supported at this language level的问题》 《Intellij Idea 代码格式化/保存时自动格式化》 一、安装google-java-format preferences -> plugins -> Browse repositories… 搜索google-java-format 还有阿里的代码规范插件也不…

c语言将字母与数字分开存放,2017年计算机二级《C语言》考前提分试题及答案9...

二、程序填空题(共18分)、下列给定程序中&#xff0c;函数flm的功能是&#xff1a;将s所指字符串中的所有数字字符移到所有非数字字符之后&#xff0c;并保持数字字符串和非数字字符串原有的次序。例如&#xff0c;s所指的字符串为“def35adh3kjsdt7”&#xff0c;执行后结果为…

学术青年如何克服拖延症——5条技巧助你前进

雷锋网 AI 科技评论按&#xff1a;「我准备好了就开始」&#xff08;或者说「拖延症」&#xff09;&#xff0c;以及「即便动起手来也觉得举步维艰」大概是每个现代人都逃不过的日常感受&#xff0c;不管是学习、在企业中工作&#xff0c;还是从事学术研究。我们可能都看过许多…

JDK源码研究Jstack,JMap,threaddump,dumpheap的原理

JDK最新bug和任务领取&#xff1a;https://bugs.openjdk.java.net/projects/JDK/issues 参加OpenJDK社区&#xff1a;https://bugs.openjdk.java.net/projects/JDK/issues openjdk源码地址&#xff1a; https://jdk.java.net/java-se-ri/8 https://download.java.net/openj…

C语言中regex_error,为什么这个C 11 std :: regex示例抛出一个regex_error异常?

参见英文答案 >Is gcc 4.8 or earlier buggy about regular expressions? 2尝试学习如何在C 11中使用新的std :: regex.但是我尝试的例子是抛出一个我不明白的regex_error异常.这是我的示例代码&#xff1a;#include #include int main…

如何删除mac通用二进制文件

通用二进制文件是什么&#xff1f; 计算机文件基本上分为二种&#xff1a;二进制文件和 ASCII&#xff08;也称纯文本文件&#xff09;&#xff0c;图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序…

约瑟夫环 猴子选大王

<? /*** 猴子选大王&#xff1a;一群猴子排成一圈&#xff0c;按1,2,…,n依次编号。* 然后从第1只开始数&#xff0c;数到第m只,把它踢出圈&#xff0c;从它后面再开始数&#xff0c;再数到第m只&#xff0c;在把它踢出去…&#xff0c;* 如此不停的进行下去&#xff0c;直…

Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现

关于怎么查看字节码的五种方法参考本人另一篇文章《Java以及IDEA下查看字节码的五种方法》 查看汇编语言汇编码 说要看汇编还是很有必要的&#xff0c;因为有些地方比如加锁其实还是通过汇编实现的&#xff0c;只看字节码不能看出底层实现。 其实就是利用使用hsdis与jitwat…

云计算读书笔记(五)

Hadoop&#xff1a;Google云计算的开源实现 Hadoop是Apache开源组织的一个分布式计算机框架&#xff0c;可以在大量廉价的硬件设备组成的集群上运行应用程序&#xff0c;为应用程序提供一组稳定可靠的接口&#xff0c;旨在构建一个具有高可靠性和良好扩展性的分布式系统。 Hado…

自动跟随小车c语言,基于OpenCV的智能小车运动轨迹跟踪方法研究

摘要&#xff1a;随着人工智能技术的快速发展,智能小车开发受到越来越多研究者的关注,也已经成为一个重要的研究方向,而解决智能小车在路径规划中行驶的运动故障重要手段是对其进行的视频监控,但是智能小车的视频监控只能看到智能小车的行进状况而不进行相对应的处理,所以对智能…

JXJJOI2018_T1_market

题目描述 某天Lemon去超市买柠檬&#xff0c;他发现货架上有N个柠檬&#xff0c;每个柠檬都有一个重量Wi和价格Ci。 Lemon身上只带了S元钱&#xff0c;因此他想要买一个价格不超过S的柠檬回家&#xff0c;另外&#xff0c;他希望他买的那个柠檬的性价比尽量高。 性价比的定义是…

更好的Java虚拟机Zing: 更好的性能,无停顿,更快的启动

Zing虚拟机文档Understanding Java Garbage Collection(了解Java垃圾收集) 首先说明这个Zing是收费的&#xff0c;但是他也是优秀的&#xff0c;我觉得我们可以研究下他的一些思想对于怎么提高JVM&#xff0c;以及目前的JVM有什么缺陷是非常有帮助的。 中文版简介&#xff1a;…

c语言将水仙花数放入一维数组a中,全国计算机等级考试C语言考试程序设计题(13)...

在考生目录下&#xff0c;要求程序PROG.C的功能是&#xff1a;将所有的水仙花数保存到一维数组a中。(所谓水仙花数是指一个三位数&#xff0c;其各位数字立方和等于该数本身。例如&#xff1a;1531*1*15*5*53*3*3)#includevoid main(){void NONO( );//函数声明int a[10]{0},i…