CKA备考实验 | 资源限制

书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:CKA备考实验 | 汇总-CSDN博客


在前面docker里讲资源限制时讲过,容器会把它所在物理机所有资源都认为是自己的。pod里包含的是容器,所以也会把整个物理机资源(内存、CPU等)当成是自己的。因此我们也可以限制pod里容器对资源的使用。

限制资源可以通过在pod里的resources字段、limitrange、resourcequota来限制。

利用容器里的resources

在定义pod的yaml文件里,可以通过设置resources选项来定义容器所需消耗的最多和最少的CPU和内存资源。

步骤1:创建pod的yaml文件,按以下内容修改。

##########实操验证##########
[root@vms10 ~]# cd role/
[root@vms10 role]# cat pod1.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null 
  labels:
    run: pod1
  name: pod1
spec:
  containers:
  - image: nginx 
    imagePullPolicy: IfNotPresent 
    name: pod1
    resources: 
      requests:         #requests设置的是pod所在worker的最低配置
        cpu: 50m 
        memory: 10Gi 
      limits:           #limits设置的是pod所能消耗的最多资源
        cpu: 100m 
        memory: 20Gi
[root@vms10 role]# 

这里requests设置的是,要运行此容器的话节点所需要的最低配置。limits设置的是,此容器最多能消耗多少资源。

这里对内存的限制很容易理解,那么CPU单位为m如何理解呢?在kubernetes系统中,一个核心(1core) CPU相当于1000个微核心(millicores),因此500m相当于是0.5个核心,即二分之一个核心。CPU的实验不好模拟,下面以内存来演示。

比如这个例子里,requests里memoy设置为10GB,即要运行此pod里的这个容器,节点至少要分配出10GB的内存,但是节点上的内存信息是:

##########实操验证##########
[root@vms10 role]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3774        2083         201          69        1489        1190
Swap:             0           0           0
[root@vms10 role]# 

总共就4GB内存,现在大概用了800MB左右,不过这里缓存占用了一部分。

步骤2:通过如下命令清理缓存。

##########实操验证##########
[root@vms10 role]# echo 3 > /proc/sys/vm/drop_caches 
[root@vms10 role]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3774        2048        1113          69         612        1255
Swap:             0           0           0
[root@vms10 role]# 

远远小于10GB,所以运行此pod的结果为Pending。

步骤3:创建pod。

##########实操验证##########
[root@vms10 role]# kubectl apply -f pod1.yaml 
pod/pod1 created
[root@vms10 role]# 
[root@vms10 role]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
pod1   0/1     Pending   0          5s
[root@vms10 role]# 

状态为Pending,因为节点不能满足容器运行的最低要求。

步骤4:删除此pod并修改yaml文件如下。

##########实操验证##########
[root@vms10 role]# kubectl delete pod pod1
pod "pod1" deleted
[root@vms10 role]# 
[root@vms10 role]# cat pod1.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null 
  labels:
    run: pod1
  name: pod1
spec:
  containers:
  - image: hub.c.163.com/library/centos:latest 
    command: ["sh", "-c", "sleep 10000"]
    imagePullPolicy: IfNotPresent 
    name: pod1
    resources:
      requests:
        cpu: 50m
        memory: 256Mi 
      limits:
        cpu: 100m 
        memory: 512Mi 
[root@vms10 role]# 

在limits里设置memoy的大小为512MB,即此容器里最多只能消耗512MB内存,验证下。

步骤5:创建pod,并查看pod在哪台机器上运行。

##########实操验证##########
[root@vms10 role]# kubectl get pods -o wide --no-headers
pod1   1/1   Running   0     6s    10.244.81.120   vms11.rhce.cc   <none>   <none>
[root@vms10 role]# 

此pod是在vms12上运行的。

步骤6:把内存测试工具拷贝到pod,并进入pod安装此工具。

[root@vms10 role]# kubectl cp memload-7.0-1.r29766.x86_64.rpm pod1:/opt/
[root@vms10 role]# kubectl exec -it pod1 --bash
[root@pod1 /]# rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm 
Preparing...                  ################################# [100%]
Updating/installing...
   1:memload-7.0-1.r29766   #################################[100%]
[root@pod1 /]#

开始测试,先查看下vms12的内容使用情况。

步骤7:在vms12的终端上清除缓存。

部建战全管kub 户请订建k

[root@vms12 ~]# echo 3 > /proc/sys/vm/drop_caches 
[root@vms12 ~]# free -m
              total       used      free     ...
Mem:          3935        724       2593     ...
Swap:         0           0         0      
[root@vms12 ~]#

可以看到这里大概还有2.6GB内存可用。

步骤8:切换到pod所在终端,在pod里消耗400MB内存。

[root@pod1 /]# memload 400
Attempting to allocate 400 Mebibytes of resident memory...

步骤9:再次到vms 12终端上查看内存使用情况。

[root@vms12 ~]# free -m
              total       used      free    
Mem:          3935        1132      2191    
Swap:         0           0         0
[root@vms12 ~]#

这里内存剩余2.2GB左右,说明400MB内存分配出去了。

步骤10:切换到pod所在终端,按【Ctrl+C】组合键终止memload,这样内存就会释放。

步骤11:在pod里申请600MB试试。

[root@pod1 /]# memload 600
Attempting to allocate 600 Mebibytes of resident memory...
Killed
[root@pod1 /]#

可以看到这里中断了memload的进程,显示为Killed,即申请不到600MB内存。

步骤12:退出并删除此pod。

[root@vms10 role]# kubectl delete pod pod1
pod "pod1" deleted 
[root@vms10 role]#

limitrange

limitrange的主要作用是限制pod或者容器里最多能运行的内存和CPU资源,每个pvc最多只能使用多少空间等。

步骤1:创建limit.yaml内容如下。

##########实操验证##########
[root@vms11 ~]# cat limit.yaml 
apiVersion: v1
kind: LimitRange 
metadata:
  name: mem-limit-range 
spec:
  limits:
  - max:
      memory: 512Mi
    min:
      memory: 256Mi
    type: Container 
[root@vms11 ~]# 

这里的意思是,limitrange的名字是mem-limit-range,规定每个容器最多只能运行512MB内存。

步骤2:创建此limitrange并查看现有的limitrange。

##########实操验证##########
[root@vms10 role]# kubectl apply -f limit.yaml
limitrange/mem-limit-range created
[root@vms10 role]# 
[root@vms10 role]# kubectl get limitrange 
NAME              CREATED AT
mem-limit-range   2023-09-27T08:52:01Z
[root@vms10 role]# 

步骤3:查看此limitrange的具体属性。

##########实操验证##########
[root@vms10 role]#  kubectl describe limitranges mem-limit-range
Name:       mem-limit-range
Namespace:  nsrole
Type        Resource  Min    Max    Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---    ---    ---------------  -------------  -----------------------
Container   memory    256Mi  512Mi  512Mi            512Mi          -
[root@vms10 role]# 

下面开始测试。

步骤4:创建一个pod的yaml,用于测试。

##########实操验证##########
[root@vms10 role]# cat pod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    purpose: demonstrate-envars 
spec:
  containers:
  - name: demo1
    image: hub.c.163.com/library/centos:latest
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'sleep 5000']
[root@vms10 role]# 

步骤5:创建pod并查看现有的pod。

##########实操验证##########
[root@vms10 role]# kubectl apply -f pod2.yaml 
pod/demo created
[root@vms10 role]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          12s
[root@vms10 role]# 

步骤6:把测试包memload拷贝到此容器,然后安装。

[root@vms10 role]# kubectl cp memload-7.0-1.r29766.x86_64.rpm demo:/opt 
[root@vms10 role]# kubectl exec demo -it bash
[root@demo /]# rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm 
Preparing...       ################################ [100%]
Updating / installing...
   1:memload-7.0-1.r29766   ####################### [100%]
[root@demo /]#

步骤7:测试消耗600MB的内存。

[root@demo /]# memload 600
Attempting to allocate 600 Mebibytes of resident memory...
Killed
[root@demo /]#

测试失败,因为最多只能消耗512MB的内存。

步骤8:删除此测试pod。

[root@demo /]# exit 
exit
command terminated with exit code 137
[root@vms10 role]# kubectl delete pod demo
pod "demo" deleted 
[root@vms10 role]#

步骤9:删除此limitrange。

[root@vms10 role]# kubectl delete -f limit.yaml 
limitrange "mem-limit-range" deleted 
[root@vms10 role]#

resourcequota

resourcequota的意思是,限制某个命名空间最多只能调用多少资源,比如最多能运行多少个svc、多少个pod等。

步骤1:创建一个deployment。

##########实操验证##########
[root@vms10 role]# kubectl create deployment nginx1 --image=nginx
deployment.apps/nginx1 created
[root@vms10 role]# 
[root@vms10 role]# 
[root@vms10 role]# kubectl get deployments
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
nginx1   1/1     1            1           6s
[root@vms10 role]# 

步骤2:查看是否有resource quota。

##########实操验证##########
[root@vms10 role]# kubectl get resourcequotas 
No resources found in nsrole namespace.
[root@vms10 role]# 

步骤3:创建resource.yaml,内容如下。

##########实操验证##########
[root@vms10 role]# cat resource.yaml 
apiVersion: v1
kind: ResourceQuota 
metadata:
  name: compute-resources 
spec:
  hard:
    pods: "4"
    services: "2"
[root@vms10 role]# 

这里最多只能创建4个pod、2个svc。

步骤4:创建resourcequota。

##########实操验证##########
[root@vms10 role]# kubectl apply -f resource.yaml 
resourcequota/compute-resources created
[root@vms10 role]# 

下面开始测试。

步骤5:把deployment升级到10个pod。

##########实操验证##########
[root@vms10 role]#  kubectl scale deployment nginx1 --replicas=10
deployment.apps/nginx1 scaled
[root@vms10 role]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx1-b97c459f7-2f8gv   0/1     ContainerCreating   0          6s
nginx1-b97c459f7-74rzs   1/1     Running             0          98s
nginx1-b97c459f7-dpb25   0/1     ContainerCreating   0          6s
nginx1-b97c459f7-n4gtx   1/1     Running             0          6s
[root@vms10 role]# 

这里显示还是4个pod,因为我们设置当前命名空间里最多只能运行4个pod。

步骤6:创建svc。

##########实操验证##########
[root@vms10 role]# kubectl expose deployment nginx1 --name=svc1 --port=80
service/svc1 exposed
[root@vms10 role]# 
[root@vms10 role]# kubectl expose deployment nginx1 --name=svc2 --port=80
service/svc2 exposed
[root@vms10 role]# 
[root@vms10 role]#  kubectl expose deployment nginx1 --name=svc3 --port=80
Error from server (Forbidden): services "svc3" is forbidden: exceeded quota: compute-resources, requested: services=1, used: services=2, limited: services=2
[root@vms10 role]# 

创建完两个svc之后,再创建第3个svc的时候,已经创建不出来了,因为我们限制在当前命名空间里最多只能创建2个service。

步骤7:删除此resourcequota。

##########实操验证##########
[root@vms10 role]# kubectl delete -f resource.yaml 
resourcequota "compute-resources" deleted
[root@vms10 role]# 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值