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

  • 1 Before you begin
  • 2 创建一个命名空间
  • 3 配置内存申请和限制
  • 4 超出容器的内存限制
  • 5 配置超出节点能力范围的内存申请
  • 6 内存单位
  • 7 如果不配置内存限制
  • 8 内存申请和限制的原因
  • 9 清理

这篇教程指导如何给容器分配申请的内存和内存限制。我们保证让容器获得足够的内存 资源,但是不允许它使用超过限制的资源。

Before you begin

You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube.

你的集群里每个节点至少必须拥有300M的内存。

这个教程里有几个步骤要求Heapster , 但是如果你没有Heapster的话,也可以完成大部分的实验,就算跳过这些Heapster 步骤,也不会有什么问题。

检查看Heapster服务是否运行,执行命令:

kubectl get services --namespace=kube-system

如果Heapster服务正在运行,会有如下输出:

NAMESPACE    NAME      CLUSTER-IP    EXTERNAL-IP  PORT(S)  AGE
kube-system  heapster  10.11.240.9   <none>       80/TCP   6d

创建一个命名空间

创建命名空间,以便你在实验中创建的资源可以从集群的资源中隔离出来。

kubectl create namespace mem-example

配置内存申请和限制

给容器配置内存申请,只要在容器的配置文件里添加resources:requests就可以了。配置限制的话, 则是添加resources:limits。

本实验,我们创建包含一个容器的Pod,这个容器申请100M的内存,并且内存限制设置为200M,下面 是配置文件:

memory-request-limit.yaml 
apiVersion: v1
kind: Pod
metadata:name: memory-demo
spec:containers:- name: memory-demo-ctrimage: vish/stressresources:limits:memory: "200Mi"requests:memory: "100Mi"args:- -mem-total- 150Mi- -mem-alloc-size- 10Mi- -mem-alloc-sleep- 1s

在这个配置文件里,args代码段提供了容器所需的参数。-mem-total 150Mi告诉容器尝试申请150M 的内存。

创建Pod:

kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/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里的容器申请了100M的内存和200M的内存限制。

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

启动proxy以便我们可以访问Heapster服务:

kubectl proxy

在另外一个命令行窗口,从Heapster服务获取内存使用情况:

curl http://localhost:8001/api/v1/proxy/namespaces/kube-system/services/heapster/api/v1/model/namespaces/mem-example/pods/memory-demo/metrics/memory/usage

这个输出显示了Pod正在使用162,900,000字节的内存,大概就是150M。这很明显超过了申请 的100M,但是还没达到200M的限制。

{"timestamp": "2017-06-20T18:54:00Z","value": 162856960
}

删除Pod:

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

超出容器的内存限制

只要节点有足够的内存资源,那容器就可以使用超过其申请的内存,但是不允许容器使用超过其限制的 资源。如果容器分配了超过限制的内存,这个容器将会被优先结束。如果容器持续使用超过限制的内存, 这个容器就会被终结。如果一个结束的容器允许重启,kubelet就会重启他,但是会出现其他类型的运行错误。

本实验,我们创建一个Pod尝试分配超过其限制的内存,下面的这个Pod的配置文档,它申请50M的内存, 内存限制设置为100M。

memory-request-limit-2.yaml 
apiVersion: v1
kind: Pod
metadata:name: memory-demo-2
spec:containers:- name: memory-demo-2-ctrimage: vish/stressresources:requests:memory: 50Milimits:memory: "100Mi"args:- -mem-total- 250Mi- -mem-alloc-size- 10Mi- -mem-alloc-sleep- 1s

在配置文件里的args段里,可以看到容器尝试分配250M的内存,超过了限制的100M。

创建Pod:

kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/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

这个输出显示了容器被杀掉因为超出了内存限制。

lastState:terminated:containerID: docker://65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10fexitCode: 137finishedAt: 2017-06-20T20:52:19Zreason: OOMKilledstartedAt: null

本实验里的容器可以自动重启,因此kubelet会再去启动它。输入多几次这个命令看看它是怎么 被杀掉又被启动的:

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

这个输出显示了容器被杀掉,被启动,又被杀掉,又被启动的过程:

stevepe@sperry-1:~/steveperry-53.github.io$ kubectl get pod memory-demo-2 --namespace=mem-example
NAME            READY     STATUS      RESTARTS   AGE
memory-demo-2   0/1       OOMKilled   1          37s
stevepe@sperry-1:~/steveperry-53.github.io$ 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

这个输出显示了Pod一直重复着被杀掉又被启动的过程:

... 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,超过了集群里任何一个节点的可用内存资源。 这个容器申请了1000G的内存,这个应该会超过你集群里能提供的数量。

memory-request-limit-3.yaml 
apiVersion: v1
kind: Pod
metadata:name: memory-demo-3
spec:containers:- name: memory-demo-3-ctrimage: vish/stressresources:limits:memory: "1000Gi"requests:memory: "1000Gi"args:- -mem-total- 150Mi- -mem-alloc-size- 10Mi- -mem-alloc-sleep- 1s

创建Pod:

kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/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).

内存单位

内存资源是以字节为单位的,可以表示为纯整数或者固定的十进制数字,后缀可以是E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki.比如,下面几种写法表示相同的数值:alue:

128974848, 129e6, 129M , 123Mi

删除Pod:

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

如果不配置内存限制

如果不给容器配置内存限制,那下面的任意一种情况可能会出现:

  • 容器使用内存资源没有上限,容器可以使用当前节点上所有可用的内存资源。
  • 容器所运行的命名空间有默认内存限制,容器会自动继承默认的限制。集群管理员可以使用这个文档 LimitRange来配置默认的内存限制。

内存申请和限制的原因

通过配置容器的内存申请和限制,你可以更加有效充分的使用集群里内存资源。配置较少的内存申请, 可以让Pod跟任意被调度。设置超过内存申请的限制,可以达到以下效果:

  • Pod可以在负载高峰时更加充分利用内存。
  • 可以将Pod的内存使用限制在比较合理的范围。

清理

删除命名空间,这会顺便删除命名空间里的Pod。

kubectl delete namespace mem-example

译者:NickSu86 原文链接

容器编排技术 -- Kubernetes 给容器和Pod分配内存资源相关推荐

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

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

  2. 容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额

    容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额 1 Before you begin 2 创建名字空间 3 创建ResourceQuota对象 4 练习环境的清理 5 ...

  3. 容器编排技术 -- Kubernetes 为 Namespace 配置CPU和内存配额

    容器编排技术 -- Kubernetes 为 Namespace 配置CPU和内存配额 1 Before you begin 2 创建名字空间 3 创建ResourceQuota对象 4 创建一个Po ...

  4. 容器编排技术 -- Kubernetes 为 Namespace 配置默认的内存请求与限额

    容器编排技术 -- Kubernetes 为 Namespace 配置默认的内存请求与限额 1 Before you begin 2 创建命名空间 3 创建 LimitRange 和 Pod 4 如果 ...

  5. 容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息

    容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息 1 Before you begin 2 Downward API 3 使用 Pod 字段作为环境变量的值 4 使用容器 ...

  6. 容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍

    容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍 1 介绍 2 怎样获取 DNS 名字? 3 支持的 DNS 模式 3.1 Service 3.1.1 A 记录 3. ...

  7. 容器编排技术 -- Kubernetes Pod 优先级和抢占

    容器编排技术 -- Kubernetes Pod 优先级和抢占 1 怎么样使用优先级和抢占 2 启用优先级和抢占 3 PriorityClass 3.1 PriorityClass 示例 4 Pod ...

  8. 容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级

    容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级 1 Before you begin 2 QoS 等级 3 创建一个命名空间 4 创建一个 Pod 并分配 QoS 等级为 Gu ...

  9. 容器编排技术 -- Kubernetes Pod概述

    容器编排技术 -- Kubernetes Pod概述 1 了解Pod 1.1 Pods如何管理多个容器 1.1.1 网络 1.1.2 存储 2 使用Pod 2.1 Pod和Controller 3 P ...

最新文章

  1. 使用苹果版博客编辑器发布的文章
  2. 邮件 自动打印 linux,Linux打印文件和发送邮件
  3. Tunnels 状压DP+BFS
  4. width:100%与绝对定位同时存在,偏移出父级容器
  5. 华为云服务器怎样让网站显示不出来,云服务器网页不显示图片
  6. 基于fo-dicom 的 Worklist CStore 我的学习实现路线
  7. html中火星文字体样式,火星文对照表
  8. 在线计算机表格制作,excel表格制作,教您excel怎么制作表格
  9. 694.27公斤何登骥360搜索热头条 北方旱作国稻种芯功能水稻
  10. 基于Visual Studio 2017的opengl安装
  11. Infinite-former:无限记忆变换器
  12. 【英语:语法基础】C4.日常对话-餐饮专题
  13. 超大型3d打印机,FDM成型尺寸1800mm高,长,宽1200mm
  14. Ubuntu 日常系列:常用软件
  15. 微信公众号开发——现金红包、企业付款
  16. 在电脑上安装或更新Kindle阅读软件
  17. 00.Sublime汉化、默认代码块、代码提示教程
  18. office2007下载包
  19. 基于单片机的红外报警系统设计
  20. 重磅直播 | ACL 2021 预讲会

热门文章

  1. 如何使用Pinterest新推出的功能Rich Pin
  2. Perl 第二章 簡單變量
  3. DateFormat PHP Class (php 处理日期)
  4. Python爬取小说
  5. JVM—类加载过程学习
  6. 【Linux学习】linux源代码版本控制RCS
  7. 草稿 断开式绑定combobox
  8. chrome谷歌浏览器安装教程 20200701
  9. css3 背景属性与边框属性的新增 200303
  10. git-基本操作的小结