书籍来源:《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]#