K8s资源管理:高效管控CPU与内存
在 Kubernetes(k8s)中,资源管理是确保容器化应用高效、稳定运行的核心机制,主要通过对 CPU、内存等计算资源的分配、限制和调度进行管控,避免资源争抢、节点过载或资源浪费。
一、核心概念:资源请求(Requests)与资源限制(Limits)
Kubernetes 对容器的资源管理通过 resources
字段定义,包含两个关键配置:
1. 资源请求(Requests)
- 定义:容器运行时最低需求的资源量(如 CPU、内存),Kubernetes 调度器会根据此值将 Pod 调度到有足够空闲资源的节点上。
- 作用:确保 Pod 能获得运行所需的最小资源,避免被调度到资源不足的节点而无法启动。
- 示例:
cpu: 100m
(100 毫核,即 0.1 CPU 核心)、memory: 128Mi
(128 兆字节)。
2. 资源限制(Limits)
- 定义:容器运行时允许使用的最大资源量,防止单个容器过度占用资源,影响同一节点上的其他容器。
- 作用:避免资源滥用导致节点崩溃(如内存泄漏导致节点 OOM 杀死进程)。
- 示例:
cpu: 500m
(最多使用 0.5 CPU 核心)、memory: 512Mi
(最多使用 512MB 内存)。
二、配置示例:为容器设置资源请求与限制
在 Deployment、Pod 等资源的 YAML 配置中,通过 containers.resources
字段定义:
apiVersion: v1
kind: Pod
metadata:name: resource-demo
spec:containers:- name: resource-demo-containerimage: nginxresources:requests: # 资源请求(调度依据)cpu: "100m" # 最低需要 0.1 CPU 核心memory: "128Mi" # 最低需要 128MB 内存limits: # 资源限制(上限)cpu: "500m" # 最多使用 0.5 CPU 核心memory: "512Mi" # 最多使用 512MB 内存
三、资源类型与单位
1. CPU 资源
- 单位:
m
(毫核):1 核 = 1000m,例如500m
表示 0.5 核。- 直接写数字:如
1
表示 1 核。
- 特点:CPU 是 “可压缩资源”,当容器使用超过限制时,会被 “限流”(throttled),但不会被杀死。
2. 内存资源
- 单位:
Mi
(Mebibyte,2^20 字节,约 1.048MB)、Gi
(Gibibyte,2^30 字节)。M
(Megabyte,10^6 字节)、G
(Gigabyte,10^9 字节)(不推荐,易混淆)。
- 特点:内存是 “不可压缩资源”,当容器使用超过限制时,会被 OOM(Out Of Memory)杀死并重启(取决于重启策略)。
四、资源管理策略
1. 保证 QoS(服务质量等级)
Kubernetes 根据资源配置将 Pod 分为 3 类 QoS 等级,影响节点资源不足时的驱逐策略:
- Guaranteed(保证级):
- 所有容器的
requests
与limits
相等(且不为 0)。 - 优先级最高,节点资源不足时最后被驱逐。
- 所有容器的
- Burstable(可突发级):
- 至少一个容器设置了
requests
但requests < limits
。 - 优先级中等,资源不足时可能被驱逐(早于 Guaranteed)。
- 至少一个容器设置了
- BestEffort(尽力而为级):
- 未设置任何
requests
或limits
。 - 优先级最低,资源不足时最先被驱逐。
- 未设置任何
2. 命名空间资源配额(Resource Quota)
通过 ResourceQuota
资源限制整个命名空间的资源使用上限,防止单个命名空间占用集群过多资源:
apiVersion: v1
kind: ResourceQuota
metadata:name: namespace-quotanamespace: my-namespace
spec:hard:pods: "10" # 最多创建 10 个 Podrequests.cpu: "2" # 所有 Pod 的 CPU 请求总和 ≤ 2 核requests.memory: "2Gi" # 所有 Pod 的内存请求总和 ≤ 2Gilimits.cpu: "4" # 所有 Pod 的 CPU 限制总和 ≤ 4 核limits.memory: "4Gi" # 所有 Pod 的内存限制总和 ≤ 4Gi
3. 限制范围(LimitRange)
通过 LimitRange
为命名空间内未指定资源配置的容器设置默认的 requests
和 limits
,避免用户忘记配置资源:
apiVersion: v1
kind: LimitRange
metadata:name: default-resourcesnamespace: my-namespace
spec:limits:- default: # 默认的 limits(若容器未指定则生效)cpu: "500m"memory: "512Mi"defaultRequest: # 默认的 requests(若容器未指定则生效)cpu: "100m"memory: "128Mi"type: Container # 作用于容器
五、资源监控与调优
- 监控工具:
- Metrics Server:提供基础的 CPU / 内存指标(
kubectl top pod
命令依赖它)。 - Prometheus + Grafana:高级监控,可自定义资源使用仪表盘。
- Metrics Server:提供基础的 CPU / 内存指标(
- 调优原则:
- 避免
requests
过高:导致资源闲置,调度效率下降。 - 避免
limits
过低:导致应用因资源不足崩溃(如内存限制低于实际需求)。 - 对核心服务使用
Guaranteed
级 QoS,确保稳定性。
- 避免
总结
Kubernetes 的资源管理通过 “请求 - 限制” 机制、QoS 分级、命名空间配额等功能,实现了对容器资源的精细化管控。合理配置资源不仅能避免资源争抢和节点故障,还能提高集群整体的资源利用率,是保障应用稳定运行的关键实践。