K8s新手系列之为Pod中的容器分配内存和CPU资源

打印 上一主题 下一主题

主题 1955|帖子 1955|积分 5869

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
概述

官方文档:
在生产情况中,我们创建Pod时需要限制其相关的资源,核心目的是实现资源的公道管理、隔离和保障,具体缘故原由如下:

  • 资源隔离与稳定性保障

    • 防止资源竞争:多个容器或 Pod 共享节点资源时,若不限制资源使用,可能导致 “资源抢占” 问题。例如:
      1、某个高负载容器占用节点全部 CPU,导致其他容器因资源不足而卡顿或瓦解。
      2、内存使用无穷制可能引发节点 OOM(Out of Memory),导致 K8s 强制杀死进程甚至节点宕机。
    • 确保服务可用性:通过设置资源下限(Request),包管关键应用至少得到必要的资源(如最低 CPU 和内存),避免因资源不足导致服务中断。

  • 性能优化与可预测性

    • 限制资源上限(Limit):为高负载容器设置 CPU / 内存上限,避免其无节制消耗资源,影响节点上的其他服务(如 K8s 体系组件)。
    • 资源可预测性:明确资源配额后,可通过监控和主动扩缩容(如 HPA)提前规划资源,确保应用在流量颠簸时保持稳定性能。

  • 集群资源高效利用

    • 调度优化:K8s 调度器(Scheduler)根据 Pod 的资源请求(Request)进行节点选择,确保资源均衡分配,避免节点过载或闲置。

K8s资源分配的核心概念

K8s 通过资源请求(Request)和资源限制(Limit)管理 Pod或容器的资源使用,两者的区别如下:

  • Request:容器正常运行所需的最小资源,用于调度时的节点资源匹配。
  • limit:容器允许使用的最大资源,超过时会被 K8s 限制(CPU)或强制终止(内存)。
说明:

  • CPU 单位:以核心(Core)为单位,支持小数(如0.5表示半个核心)或毫核(m,如100m=0.1 核心)。
  • 内存单位:支持字节(Byte)或常见单位(如1Gi=1024^3 字节,1Mi=1024^2 字节,注意与 GB/MB 的区别)。
实战案例-为Pod的容器设置内存和CPU

示例:
  1. # 定义资源清单文件
  2. [root@master01 ~/pod]# cat cpu-pod.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: nginx-pod
  7.   labels:
  8.     app: nginx
  9. spec:
  10.   containers:
  11.   - name: nginx-container
  12.     image: nginx:latest
  13.     resources:
  14.       requests:
  15.         # 容器启动时请求的最小内存
  16.         memory: "100Mi"
  17.         # 容器启动时请求的最小 CPU (0.5 核心)
  18.         cpu: "300m"
  19.         #也可以这样
  20.         #cpu: "0.5"
  21.       limits:
  22.         # 容器允许使用的最大内存
  23.         memory: "200Mi"
  24.         # 容器允许使用的最大 CPU (0.5 核心)
  25.         cpu: "500m
  26. [root@master01 ~/pod]# kubectl apply -f cpu-pod.yaml
  27. pod/nginx-pod created
  28. # 查看pod
  29. [root@master01 ~/pod]# kubectl get po nginx-pod -o wide
  30. NAME        READY   STATUS    RESTARTS   AGE   IP                NODE     NOMINATED NODE   READINESS GATES
  31. nginx-pod   1/1     Running   0          12s   100.117.144.170   node01   <none>           <none>
复制代码
检察一下Pod的资源分配
  1. # 查看详细信息
  2. [root@master01 ~/pod]# kubectl describe po nginx-pod | grep -A 2 -E 'Limits|Requests'
  3.     Limits:
  4.       cpu:     500m
  5.       memory:  200Mi
  6.     Requests:
  7.       cpu:        300m
  8.       memory:     100Mi
复制代码
当Pod创建时请求的资源负载超出节点资源,会发生什么?

重新创建一个Pod:
  1. [root@master01 ~/pod]# cat cpu-pod-01.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: nginx-pod-01
  6.   labels:
  7.     app: nginx
  8. spec:
  9.   containers:
  10.   - name: nginx-container
  11.     image: nginx:latest
  12.     resources:
  13.       requests:
  14.         # 容器启动时请求的最小内存,设置为50G
  15.         memory: "50Gi"
  16.         # 容器启动时请求的最小 CPU,设置为50核心
  17.         cpu: "50"
  18.         #也可以这样
  19.         #cpu: "0.5"
  20.       limits:
  21.         # 容器允许使用的最大内存,设置为50G
  22.         memory: "200Gi"
  23.         # 容器允许使用的最大 CPU,设置为50核心
  24.         cpu: "50"
  25. [root@master01 ~/pod]# kubectl apply -f cpu-pod-01.yaml
  26. pod/nginx-pod-01 created
  27. # 查看Pod,发现处于Pending状态
  28. [root@master01 ~/pod]# kubectl get po nginx-pod-01 -o wide
  29. NAME           READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
  30. nginx-pod-01   0/1     Pending   0          11s   <none>   <none>   <none>           <none>
复制代码
经过上述的验证,发现当Pod的资源请求超出节点的资源时,Pod会处于Pending状态
  1. # 查看详细信息
  2. [root@master01 ~/pod]# kubectl describe po nginx-pod-01
  3. Name:             nginx-pod-01
  4. #...
  5. Status:           Pending
  6. IP:
  7. IPs:              <none>
  8. Containers:
  9.   nginx-container:
  10.     Image:      nginx:latest
  11.     Port:       <none>
  12.     Host Port:  <none>
  13.     Limits:
  14.       cpu:     50
  15.       memory:  200Gi
  16.     Requests:
  17.       cpu:        50
  18.       memory:     50Gi
  19. # ... 省略万字
  20. Events:
  21.   Type     Reason            Age    From               Message
  22.   ----     ------            ----   ----               -------
  23.   Warning  FailedScheduling  2m42s  default-scheduler  0/3 nodes are available: 1 Insufficient cpu, 1 Insufficient memory, 1 node(s) had untolerated taint {app: }, 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/3 nodes are available: 1 No preemption victims found for incoming pod, 2 Preemption is not helpful for scheduling..
复制代码
怎样修改指定Pod的资源限制

方式一:直接修改其资源清单文件

编辑对应的资源文件,重新应用即可
方式二:使用kubectl edit命令进行修改

直接使用kubectl edit命令进行修改
注意事项


  • 如果为Pod设置了CPU和内存限制,当Pod运行中的资源负载超出了限制,那么Pod的状态会发生OOM,kubelet会重启当前的Pod
  • 如果你为容器指定了 CPU 限制值但未为其设置 CPU 请求,Kubernetes 会主动为其 设置与 CPU 限制相同的 CPU 请求值。
  • 如果你为容器指定了 memory 限制值但未为其设置 memory 请求,Kubernetes 会主动为其 设置与 memory 限制相同的 memory 请求值。
  • 如果没有为Pod设置 CPU 和 memory 限制,那么Pod极有可能会占满节点的资源

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表