时间:2025-05-25 13:18
人气:
作者:admin
官方文档:
在生产环境中,我们创建Pod时需要限制其相关的资源,核心目的是实现资源的合理管理、隔离和保障,具体原因如下:
资源隔离与稳定性保障
防止资源竞争:多个容器或 Pod 共享节点资源时,若不限制资源使用,可能导致 “资源抢占” 问题。例如:
1、某个高负载容器占用节点全部 CPU,导致其他容器因资源不足而卡顿或崩溃。
2、内存使用无限制可能引发节点 OOM(Out of Memory),导致 K8s 强制杀死进程甚至节点宕机。
确保服务可用性:通过设置资源下限(Request),保证关键应用至少获得必要的资源(如最低 CPU 和内存),避免因资源不足导致服务中断。
性能优化与可预测性
集群资源高效利用
K8s 通过资源请求(Request)和资源限制(Limit)管理 Pod或容器的资源使用,两者的区别如下:
说明:
示例:
# 定义资源清单文件
[root@master01 ~/pod]# cat cpu-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
resources:
requests:
# 容器启动时请求的最小内存
memory: "100Mi"
# 容器启动时请求的最小 CPU (0.5 核心)
cpu: "300m"
#也可以这样
#cpu: "0.5"
limits:
# 容器允许使用的最大内存
memory: "200Mi"
# 容器允许使用的最大 CPU (0.5 核心)
cpu: "500m
[root@master01 ~/pod]# kubectl apply -f cpu-pod.yaml
pod/nginx-pod created
# 查看pod
[root@master01 ~/pod]# kubectl get po nginx-pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 1/1 Running 0 12s 100.117.144.170 node01 <none> <none>
查看一下Pod的资源分配
# 查看详细信息
[root@master01 ~/pod]# kubectl describe po nginx-pod | grep -A 2 -E 'Limits|Requests'
Limits:
cpu: 500m
memory: 200Mi
Requests:
cpu: 300m
memory: 100Mi
重新创建一个Pod:
[root@master01 ~/pod]# cat cpu-pod-01.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-01
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
resources:
requests:
# 容器启动时请求的最小内存,设置为50G
memory: "50Gi"
# 容器启动时请求的最小 CPU,设置为50核心
cpu: "50"
#也可以这样
#cpu: "0.5"
limits:
# 容器允许使用的最大内存,设置为50G
memory: "200Gi"
# 容器允许使用的最大 CPU,设置为50核心
cpu: "50"
[root@master01 ~/pod]# kubectl apply -f cpu-pod-01.yaml
pod/nginx-pod-01 created
# 查看Pod,发现处于Pending状态
[root@master01 ~/pod]# kubectl get po nginx-pod-01 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod-01 0/1 Pending 0 11s <none> <none> <none> <none>
经过上述的验证,发现当Pod的资源请求超出节点的资源时,Pod会处于Pending状态
# 查看详细信息
[root@master01 ~/pod]# kubectl describe po nginx-pod-01
Name: nginx-pod-01
#...
Status: Pending
IP:
IPs: <none>
Containers:
nginx-container:
Image: nginx:latest
Port: <none>
Host Port: <none>
Limits:
cpu: 50
memory: 200Gi
Requests:
cpu: 50
memory: 50Gi
# ... 省略万字
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
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..
编辑对应的资源文件,重新应用即可
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极有可能会占满节点的资源
本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18859112,微信Vac6666666,欢迎交流
下一篇:K8s进阶之LimitRange
Ubuntu离线环境部署Kubernetes v1.31.3(ARM64)