在 k8s 中,资源限制是保证集群稳定性和高效运行的关键。资源限制不仅帮助管理节点资源的分配,还能有效地控制不同容器、Pod 和命名空间的资源使用。
资源需求(requests)
定义需要系统预留给该容器使用的资源最小可用值
容器运行时可能用不到这些额度的资源,但用到时必须确保有相应数量的资源可用
资源需求的定义会影响调度器的决策
资源限制(limits)
定义该容器可以申请使用的资源最大可用值,超出该额度的资源使用请求将被拒绝
该限制需要大于等于requests的值,但系统在其某项资源紧张时,会从容器那里回收其使用的超出其requests值的那部分
三种常用的资源限制方式:
容器资源限制(Resources)
资源配额(ResourceQuota)
限制范围(LimitRange)
容器的期望资源和资源上限(Resources)
k8s 允许为每个容器配置期望的资源和资源上限,这些配置通过 requests 和 limits 来实现。
requests:表示容器调度时期望的资源量。调度时,Kubernetes 会根据 requests 的资源需求将容器调度到合适的节点。
limits:表示容器能够使用的最大资源量。容器不能超过这个限制,否则可能会被杀死并重新调度
资源清单配置
apiVersion: v1
kind: Pod
metadata:
name: stress-resources
spec:
containers:
- image: harbor.oldboyedu.com/oldboyedu-troubleshooting/stress:v0.1
name: stress
stdin: true
imagePullPolicy: Always
resources:
requests:
cpu: 200m # 期望使用 CPU 0.2 核
memory: 300Mi # 期望使用内存 300Mi
limits:
cpu: 0.5 # 最大使用 CPU 0.5 核
memory: 500Mi # 最大使用内存 500Mi说明:
requests.cpu 表示容器期望使用 0.2 核 CPU。
limits.cpu 表示容器的最大 CPU 使用为 0.5 核。
requests.memory 和 limits.memory 分别表示容器期望使用和最大可用的内存。
ResourceQuota(资源配额)
ResourceQuota 用于在命名空间级别限制资源的使用量,可以限制 CPU、内存、存储资源的总量以及特定资源的对象数量(如 Pod、Deployment 和 Service)。
计算资源限制(CPU 和 Memory)
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: kube-public
spec:
hard:
requests.cpu: "1" # 限制总 CPU 请求为 1 核
limits.cpu: "2" # 限制总 CPU 使用为 2 核
requests.memory: 2Gi # 限制总内存请求为 2Gi
limits.memory: 3Gi # 限制总内存使用为 3Gi对象数量限制(Pod、Deployment、Service)
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
namespace: kube-public
spec:
hard:
pods: "10" # 限制 Pod 数量为 10
count/deployments.apps: "3" # 限制 Deployments 数量为 3
count/services: "3" # 限制 Services 数量为 3说明:
requests.cpu 和 limits.cpu 限制命名空间内所有 Pod 总共使用的 CPU 资源。
pods 限制命名空间内最多可以有 10 个 Pod。
LimitRange(限制范围)
LimitRange 用于限制单个 Pod 容器的资源请求和限制的最小值、最大值和默认值,确保容器的资源不会过度申请,避免对节点资源的过度消耗。
限制容器的最大值和最小值
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-memory-min-max
namespace: kube-public
spec:
limits:
- max:
cpu: 2 # 限制容器最大使用 CPU 2 核
memory: 4Gi # 限制容器最大使用内存 4Gi
min:
cpu: 200m # 限制容器最小使用 CPU 200m(即 0.2 核)
memory: 100Mi # 限制容器最小使用内存 100Mi
type: Container # 限制类型为容器设置默认资源请求和限制
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-memory-min-max-default
namespace: kube-public
spec:
limits:
- max:
cpu: 2 # 限制容器最大使用 CPU 2 核
memory: 4Gi # 限制容器最大使用内存 4Gi
min:
cpu: 200m # 限制容器最小使用 CPU 200m(即 0.2 核)
memory: 100Mi # 限制容器最小使用内存 100Mi
type: Container # 限制类型为容器
defaultRequest:
cpu: 200m # 设置默认请求 CPU 为 200m
memory: 500Mi # 设置默认请求内存为 500Mi
default:
cpu: 1 # 设置默认限制 CPU 为 1 核
memory: 2Gi # 设置默认限制内存为 2Gi说明:
max 和 min 分别设置了容器的最大和最小资源限制。
defaultRequest 和 default 设置了默认的请求和限制值。