1 资源限制介绍
K8S设计资源限制的原因主要是为了确保集群的稳定运行、防止资源争用和过载,同时提高应用程序的可靠性和性能。资源限制通过Cgroups等机制控制Pod使用节点资源(CPU、内存、存储)。
假设1个节点上有多个pod,其中一个pod使用了所有的资源,那么肯定会影响到到其他pod的运行。
2 resources介绍
resources作用:
-
resources
用于定义容器的计算资源请求和限制。这些资源包括 CPU 和内存。即保证pod有足够的资源使用,但又不会超出限制。 -
如果没有配置资源限制,pod就会使用宿主机的全部资源。配置了显示的话,pod资源请求超过限制会被K8S杀死或重新调度
关于请求和限制的详细解释
请求(Requests):
- 请求是容器启动时需要的最低资源量,K8S 会根据请求来调度容器到合适的节点。如果节点上没有足够的资源,容器就无法调度到该节点。那么pod就会处于pending状态。
- 请求用于确保容器始终有足够的资源可以使用。
限制(Limits):
- 限制是容器能够使用的最大资源量。如果容器超过限制,K8S 会采取措施限制容器使用的资源(如 CPU 限制时会降低容器的 CPU 使用,内存限制时如果容器超过内存限制则可能会被 OOM Killer(Out Of Memory Killer)杀死)。可以限制防止容器无限制地使用资源,避免影响其他容器和节点上的负载。
- 资源换算单位
- cpu:1core = 1000m
- memary:0.5Mi = 500MB内存
3 resources配置案例
01 request不满足无法完成调度
1.创建1个pod,宿主机是2核,4GB内存。肯定是不满足资源期望的
yaml
cat > 04-资源限制之-resources.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: stress-resources
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/wzy01-aliyun/apps:v3
name: stress
stdin: true
# 配置容器的资源限制
resources:
# 定义资源期望,没有足够资源的话不会调度成功
requests:
cpu: 16
memory: 16G
# 配置资源的使用上限
limits:
cpu: 20
memory: 20G
EOF
2.运行后查看事件:kubectl describe pods stress-resources
提示污点存在和内存、CPU不足
Warning FailedScheduling 52s (x3 over 3m16s) 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 cpu, 2 Insufficient memory.
02 使用超过限制会杀掉进程
stress
是一个用于对 Linux 系统进行压力测试的工具。它可以对 CPU、内存、磁盘 I/O 和网络带宽等各种系统资源进行测试,使用stress模拟性能开销。
1.运行以下配置
yaml
cat > cat 01-compute-resources.yaml <<EOF
apiVersion: v1
kind: pod
metadata:
name: stress-resources
spec:
containers:
- image: harbor.zhiyong18.com/zhiyong18-troubleshooting/stress:v0.1
name: stress
stdin: true
# 配置容器的资源限制
resources:
# 定义资源期望,没有足够资源的话不会调度成功
requests:
cpu: 200m
memory: 300Mi
# 配置资源的使用上限
limits:
cpu: 0.5
memory: 500Mi
EOF
2.查看未压测时的性能指标
bash
[root@worker233~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07fa36e3d76c harbor.zhiyong18.com/zhiyong18-troubleshooting/stress "/bin/sh" 13 seconds ago Up 12 seconds k8s_stress_stress-resources_default_6225323f-c599-4f2d-9648-f161dcceafd0_0
[root@worker233~]# docker stats 07fa36e3d76c
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
07fa36e3d76c k8s_stress_stress-resources_default_6225323f-c599-4f2d-9648-f161dcceafd0_0 0.00% 232KiB / 500MiB 0.05% 0B / 0B 0B / 0B 1
[root@worker233~]# docker exec -it 07fa36e3d76c sh
/usr/local/stress # free -h
total used free shared buff/cache available
Mem: 3.8G 571.7M 2.4G 2.6M 806.5M 3.0G
Swap: 0 0 0
/usr/local/stress #
3.进入pod进行压测。当pod内存资源使用超过限制时,stress进程被杀死。
bash
/usr/local/stress # stress --cpu 8 --io 4 --vm 200 --vm-bytes 256M --timeout 1000s
stress: info: [16] dispatching hogs: 8 cpu, 4 io, 200 vm, 0 hdd
stress: FAIL: [16] (415) <-- worker 228 got signal 9
stress: WARN: [16] (417) now reaping child worker processes
stress: FAIL: [16] (451) failed run completed in 14s
/usr/local/stress #
: WARN: [16] (417) now reaping child worker processes
stress: FAIL: [16] (451) failed run completed in 14s
/usr/local/stress #
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/758a29b469c64a4094a7cae32334e261.png#pic_center)