【CKA考试笔记】十六、资源限制

实验环境

完成初始化集群的环境:
(vms21)192.168.26.21——master1
(vms22)192.168.26.22——worker1
(vms23)192.168.26.23——worker2

一、在pod里通过resources来限制

pod的yaml文件中,spec.containers.resources下
(1)可以使用requests来配置运行该容器的系统需求(若系统不满足要求,则pod运行不起来,一直处于Pending状态)
例如:配置内存(memory)至少要10Gi、cpu至少要4000m(四核)

...
spec:
  terminationGracePeriodSeconds: 0
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    resources:
      requests:
        memory: 10Gi
        cpu: 4000m
  dnsPolicy: ClusterFirst
...

(2)可以使用limits配置该容器占用系统资源的限制
例如:配置内存(memory)最多只能消耗500Mi

...
spec:
  terminationGracePeriodSeconds: 0
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    resources:
      limits:
        memory: 500Mi
  dnsPolicy: ClusterFirst
...

实验:
(1)删除环境中之前创建的pod
(2)使用centos镜像创建一个没有资源限制的pod
若环境里没有centos镜像,先拉取
worker1、worker2上拉取centos镜像

nerdctl pull hub.c.163.com/library/centos

master上通过yaml来创建pod,创建一个没有资源限制的pod,yaml如下:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  terminationGracePeriodSeconds: 0
  containers:
  - image: hub.c.163.com/library/centos
    command: ["sh","-c","sleep 1d"]
    imagePullPolicy: IfNotPresent
    name: pod1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

创建这个pod

kubectl apply -f pod1.yaml

(3)查看这个pod运行在哪个节点上

kubectl get pods -o wide
#输出:
NAME   READY   STATUS    RESTARTS   AGE   IP             NODE            NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          20s   10.244.70.67   vms23.rhce.cc   <none>           <none>

(4)运行在vms23节点上,来到vms23查看这个pod对内存的消耗

free -m

#输出:
              total        used        free      shared  buff/cache   available
Mem:           3935         454        1882          17        1599        3148
Swap:             0           0           0

used=454,消耗了454兆内存
(4)使用memload内存工具来进行进一步演示
下载memload-7.0-1.r29766.x86_64.rpm软件包,传输至master上
在master上,将memload-7.0-1.r29766.x86_64.rpm复制到pod1容器中/opt下

kubectl cp memload-7.0-1.r29766.x86_64.rpm pod1:/opt/

进入容器,安装momload

kubectl exec -it pod1 -- bash
rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm

在容器中,使用memload命令

#使容器增加消耗1Gi的内存
memload 1000

#vms23上查看内存消耗,此时内存占用增加了1Gi
free -m
#输出:
              total        used        free      shared  buff/cache   available
Mem:           3935        1440        1363          17        1131        2194
Swap:             0           0           0

#使容器增加消耗500Mi的内存
memload 500

#vms23上查看内存消耗,此时内存占用增加了500Mi
free -m
#输出:
              total        used        free      shared  buff/cache   available
Mem:           3935         935        1868          17        1131        2699
Swap:             0           0           0

从演示中证实,对于pod1占有系统资源并没有任何限制
(5)现在删除pod1

kubectl delete pods pod1

(6)修改pod1的yaml,配置resources.litmit资源限制,内存最多消耗500Mi
yaml如下:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  terminationGracePeriodSeconds: 0
  containers:
  - image: hub.c.163.com/library/centos
    command: ["sh","-c","sleep 1d"]
    imagePullPolicy: IfNotPresent
    name: pod1
    resources:
      limits:
        memory: 500Mi
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

创建pod1

kubectl apply -f pod1.yaml

(7)查看pod运行在哪个节点上

kubectl get pods -o wide

#输出:
NAME   READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          18s   10.244.7.5   vms22.rhce.cc   <none>           <none>

(8)同样的,使用memload进行测试

#master上复制momload安装包到容器中
kubectl cp memload-7.0-1.r29766.x86_64.rpm pod1:/opt/

#进入容器安装
kubectl exec -it pod1 -- bash
rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm

#使容器增加消耗200Mi的内存
memload 200
#vms22上查看内存消耗,此时内存占用增加了200Mi
free -m
#输出:
              total        used        free      shared  buff/cache   available
Mem:           3935         641        2169          17        1124        2995
Swap:             0           0           0

#使容器增加消耗500Mi的内存
memload 500
#此时就会内存溢出,进程被killed(OOM killed:out of memory killed)
Attempting to allocate 500 Mebibytes of resident memory...
Killed

二、通过limitrange来限制

通过yaml创建limitrange
mylimit.yaml如下:

apiVersion: v1
kind: LimitRange
metadata:
  name: mylimit
spec:
  limits:
  - max:
      memory: 1Gi
    min:
      memory: 512Mi
    type: Container

metadata下也可以配置命名空间namespace,不指定则默认当前命名空间
(limitrange也是基于命名空间的,只对指定的命名空间有效)
spec.limits下:
max——配置最大的资源占用限制
min——配置最低的系统需求
type——可以配置基于容器(Container)或基于pod,若基于容器,那么假设一个容器的资源消耗限制是1Gi,那么一个pod中有两个容器(一个主容器、一个sidecar),这个pod的资源限制就是2Gi,若是基于pod,假设资源限制是1Gi,那么pod里所有的容器的资源消耗总和不得超过1Gi

实验:
(1)根据上述mylimit.yaml,创建这个limitrange

kubectl apply -f mylimit.yaml

(2)查看limitrange列表,检查是否创建成功

kubectl get limitrange

#输出:
NAME      CREATED AT
mylimit   2022-08-17T04:05:11Z

(3)查看mylimit属性,可以查看最低资源需求和最高资源限制

kubectl describe limitranges mylimit

#输出:
Name:       mylimit
Namespace:  default
Type        Resource  Min    Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---    ---  ---------------  -------------  -----------------------
Container   memory    512Mi  1Gi  1Gi              1Gi            -

(4)可以再次利用momload工具进行验证,在pod的yaml中不对resources作资源配置,此时,同一个命名空间下,pod的资源限制会根据mylimit中的设置
(5)注意:
若配置了limitrange,同时又在pod的yaml中通过resources配置资源限制,则resources下定义的值必须在limitrange定义的值的范围内,否则pod无法创建成功
在这里插入图片描述

三、通过resourcequota来限制

resourcequota简称为quota——限制某个命名空间里,最多只能创建多少个资源

通过yaml文件创建resourcequota

apiVersion: v1
kind: ResourceQuota
metadata:
  name: myquota
spec:
  hard:
    pods: "4"
    services: "3"
    configmaps: 3

spec.hard——硬限制,可以配置各种资源最多多少个(数字有没有引号都可),如上配置了pod最多4个、svc最多3个、configmaps最多3个

实验:
(1)创建如上yaml这个quota

kubectl apply -f myquota.yaml

(2)查看resourcequota

kubectl get resourcequota

#输出:
NAME      AGE   REQUEST                                     LIMIT
myquota   6s    configmaps: 1/3, pods: 1/4, services: 1/3   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴陵FL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值