容器编排技术 -- Kubernetes 给容器和Pod分配内存资源
容器编排技术 -- 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 |
---|
|
在这个配置文件里,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 |
---|
|
在配置文件里的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 |
---|
|
创建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分配内存资源相关推荐
- 容器编排技术 -- Kubernetes 给容器和Pod分配CPU资源
容器编排技术 -- Kubernetes 给容器和Pod分配CPU资源 1 Before you begin 2 创建一个命名空间 3 声明一个CPU申请和限制 4 CPU 单位 5 请求的CPU超出 ...
- 容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额
容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额 1 Before you begin 2 创建名字空间 3 创建ResourceQuota对象 4 练习环境的清理 5 ...
- 容器编排技术 -- Kubernetes 为 Namespace 配置CPU和内存配额
容器编排技术 -- Kubernetes 为 Namespace 配置CPU和内存配额 1 Before you begin 2 创建名字空间 3 创建ResourceQuota对象 4 创建一个Po ...
- 容器编排技术 -- Kubernetes 为 Namespace 配置默认的内存请求与限额
容器编排技术 -- Kubernetes 为 Namespace 配置默认的内存请求与限额 1 Before you begin 2 创建命名空间 3 创建 LimitRange 和 Pod 4 如果 ...
- 容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息
容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息 1 Before you begin 2 Downward API 3 使用 Pod 字段作为环境变量的值 4 使用容器 ...
- 容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍
容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍 1 介绍 2 怎样获取 DNS 名字? 3 支持的 DNS 模式 3.1 Service 3.1.1 A 记录 3. ...
- 容器编排技术 -- Kubernetes Pod 优先级和抢占
容器编排技术 -- Kubernetes Pod 优先级和抢占 1 怎么样使用优先级和抢占 2 启用优先级和抢占 3 PriorityClass 3.1 PriorityClass 示例 4 Pod ...
- 容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级
容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级 1 Before you begin 2 QoS 等级 3 创建一个命名空间 4 创建一个 Pod 并分配 QoS 等级为 Gu ...
- 容器编排技术 -- Kubernetes Pod概述
容器编排技术 -- Kubernetes Pod概述 1 了解Pod 1.1 Pods如何管理多个容器 1.1.1 网络 1.1.2 存储 2 使用Pod 2.1 Pod和Controller 3 P ...
最新文章
- 使用苹果版博客编辑器发布的文章
- 邮件 自动打印 linux,Linux打印文件和发送邮件
- Tunnels 状压DP+BFS
- width:100%与绝对定位同时存在,偏移出父级容器
- 华为云服务器怎样让网站显示不出来,云服务器网页不显示图片
- 基于fo-dicom 的 Worklist CStore 我的学习实现路线
- html中火星文字体样式,火星文对照表
- 在线计算机表格制作,excel表格制作,教您excel怎么制作表格
- 694.27公斤何登骥360搜索热头条 北方旱作国稻种芯功能水稻
- 基于Visual Studio 2017的opengl安装
- Infinite-former:无限记忆变换器
- 【英语:语法基础】C4.日常对话-餐饮专题
- 超大型3d打印机,FDM成型尺寸1800mm高,长,宽1200mm
- Ubuntu 日常系列:常用软件
- 微信公众号开发——现金红包、企业付款
- 在电脑上安装或更新Kindle阅读软件
- 00.Sublime汉化、默认代码块、代码提示教程
- office2007下载包
- 基于单片机的红外报警系统设计
- 重磅直播 | ACL 2021 预讲会