限制pod内存资源的使用

参考官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-memory-resource/

将内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存

一.安装metrics-server

因为查看节点的资源使用情况需要用到kubectl top命令,但该命令需要提前安装metrics-server才能使用

1.下载metrics-server的yaml文件

[root@k8s-master ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

2.修改yaml文件,新增两行配置

[root@k8s-master ~]# vim components.yaml

yaml文件134行args指令处修改如下:

在这里插入图片描述

3.创建metrics-server的pod

[root@k8s-master ~]# kubectl apply -f components.yaml 

提醒:因为要去谷歌去下载镜像,很有可能会拉不下来,导致pod启动失败

建议:最好先准备好metrics-server的镜像,然后docker load -i 导入镜像

我这里就是直接使用准备好的镜像。

4.将metrics-server的镜像包上传到linux,docker load导入镜像包

在这里插入图片描述

[root@k8s-master ~]# docker load -i metrics-server-v0.6.3.tar

5.查看metrics-server的pod

[root@k8s-master ~]# kubectl apply -f components.yaml 
[root@k8s-master ~]# kubectl get pod -n kube-system

在这里插入图片描述

6.查看节点资源使用情况

[root@k8s-master ~]# kubectl top node
NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master   421m         10%    1135Mi          66%       
k8s-node-1   199m         4%     702Mi           40%       
k8s-node-2   254m         6%     671Mi           39% 
[root@k8s-master ~]# kubectl top pod
NAME                   CPU(cores)   MEMORY(bytes)   
quota-mem-cpu-demo-2   2m           1Mi 

发现kubectl可以正常使用了!

二、创建命名空间

[root@k8s-master ~]# kubectl create namespace mem-example
namespace/mem-example created

三、指定内存请求和限制

创建一个命名空间,以便将本练习中创建的资源与集群的其余部分隔离

1.创建pod

创建一个拥有一个容器的 Pod。 容器将会请求 100 MiB 内存,并且内存会被限制在 200 MiB 以内。 这是 Pod 的配置文件

[root@k8s-master ~]# kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit.yaml --namespace=mem-example

2.查看pod是否运行

[root@k8s-master ~]# kubectl get pod memory-demo -n mem-example
NAME          READY   STATUS    RESTARTS   AGE
memory-demo   1/1     Running   0          69s

3.查看pod详细信息

[root@k8s-master ~]# kubectl get pod memory-demo --output=yaml -n mem-example

在这里插入图片描述

申请了100M的内存,最大可以使用200M内存

4.kubectl top查看pod指标数据

[root@k8s-master ~]# kubectl top pod -n mem-example
NAME          CPU(cores)   MEMORY(bytes)   
memory-demo   61m          150Mi 

输出结果显示:Pod 正在使用的内存大约为 162,900,000 字节,约为 150 MiB。 这大于 Pod 请求的 100 MiB,但在 Pod 限制的 200 MiB之内。

5.删除pod

[root@k8s-master ~]# kubectl delete pod memory-demo -n mem-example

四、超出容器限制的内存

1.创建pod

创建一个 Pod,尝试分配超出其限制的内存。 这是一个 Pod 的配置文件,其拥有一个容器,该容器的内存请求为 50 MiB,内存限制为 100 MiB

[root@k8s-master ~]# kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit-2.yaml --namespace=mem-example

2.多次查看pod运行状态

[root@k8s-master ~]# kubectl get pod memory-demo-2 -n mem-example

在这里插入图片描述

在这里插入图片描述

发现pod在被反复的杀死和重启

3.查看pod运行的详细信息

[root@k8s-master ~]# kubectl describe pod memory-demo-2 -n mem-example

在这里插入图片描述

可以看到pod在被反复的杀死和重启!

4.删除pod

[root@k8s-master ~]# kubectl delete pod memory-demo-2 -n mem-example

五、超过整个节点容量的内存

1.创建pod

创建一个 Pod,其内存请求超过了你集群中的任意一个节点所拥有的内存。 这是该 Pod 的配置文件,其拥有一个请求 1000 GiB 内存的容器,这应该超过了你集群中任何节点的容量

[root@k8s-master ~]# kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit-3.yaml --namespace=mem-example
pod/memory-demo-3 create

2.查看pod状态

[root@k8s-master ~]# kubectl get pod memory-demo-3 -n mem-example
NAME            READY   STATUS    RESTARTS   AGE
memory-demo-3   0/1     Pending   0          60s

发现pod处于pending状态,挂起状态,代表申请的内存资源超过了节点的内存资源,处于被挂起状态

3.查看pod详细信息

[root@k8s-master ~]# kubectl describe pod memory-demo-3 -n mem-example

输出结果: Warning FailedScheduling 55s (x3 over 119s) default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 Insufficient memory.

由于节点内存不足,该容器无法被调度

4.删除pod

[root@k8s-master ~]# kubectl delete pod memory-demo-3 -n mem-example
pod "memory-demo-3" deleted

六、删除命名空间

[root@k8s-master ~]# kubectl delete namespace mem-example
namespace "mem-example" deleted
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐