实验环境
完成初始化集群的环境:
(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