K8S资源限制之resources

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)
相关推荐
年薪丰厚1 小时前
如何在K8S集群中查看和操作Pod内的文件?
docker·云原生·容器·kubernetes·k8s·container
zhangj11251 小时前
K8S Ingress 服务配置步骤说明
云原生·容器·kubernetes
岁月变迁呀1 小时前
kubeadm搭建k8s集群
云原生·容器·kubernetes
墨水\\1 小时前
二进制部署k8s
云原生·容器·kubernetes
Source、1 小时前
k8s-metrics-server
云原生·容器·kubernetes
KubeSphere 云原生1 小时前
云原生周刊:利用 eBPF 增强 K8s
云计算·k8s·容器平台·kubesphere
颜淡慕潇2 小时前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
大熊程序猿4 小时前
K8s证书过期
云原生·容器·kubernetes
Karoku06613 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes