1. 资源限制的核心组件
Kubernetes 提供多个组件来管理 CPU、内存、存储等资源,确保集群稳定性和公平性。主要组件包括:
1.1 Namespace 级别
- ResourceQuota:限制命名空间 (Namespace) 内的 CPU、内存、Pod 数量等,防止单个 Namespace 过度占用资源。
- LimitRange:设置 Pod 或 Container 级别的最小/最大资源使用限制。
1.2 Pod 和容器级别
- Requests:容器运行时的 最低资源需求,用于调度决策。
- Limits:容器运行时的 最大可用资源,防止过量消耗。
1.3 节点级别
-
kubelet 资源管理
-
--kube-reserved:预留资源给 Kubernetes 组件,如 kubelet、kube-proxy。 -
--system-reserved:预留资源给 OS 进程,防止 K8s 占满节点。 -
--eviction-hard:设定资源阈值,超限时自动驱逐 Pod。
-
1.4 调度器(Scheduler)
- Pod 亲和性 (PodAffinity) 和反亲和性 (PodAntiAffinity):影响 Pod 在节点间的分布。
- NodeSelector & NodeAffinity:将 Pod 限制调度到特定节点。
1.5 资源自动管理
- Vertical Pod Autoscaler (VPA):自动调整 Pod 的 CPU 和内存请求。
- Horizontal Pod Autoscaler (HPA):根据负载动态扩展 Pod 副本。
- Cluster Autoscaler:动态调整集群节点数量。
2. 资源限制的工作原理
2.1 ResourceQuota 和 LimitRange
示例:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: my-namespace
spec:
hard:
pods: "10" # 限制该 Namespace 内最多运行 10 个 Pod
requests.cpu: "4" # 所有 Pod CPU 请求总和不能超过 4 核
requests.memory: "8Gi" # 所有 Pod 内存请求总和不能超过 8GiB
limits.cpu: "8" # 所有 Pod 的 CPU 限制总和不能超过 8 核
limits.memory: "16Gi" # 所有 Pod 的内存限制总和不能超过 16GiB
2.2 Pod 资源限制(Requests & Limits)
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "500m" # 申请 0.5 个 CPU 核心,确保调度时满足需求
memory: "256Mi" # 申请 256MiB 内存,调度时必须满足
limits:
cpu: "1" # 限制该容器最多使用 1 个 CPU 核心
memory: "512Mi" # 限制该容器最多使用 512MiB 内存,超出可能被 OOMKill
2.3 Kubelet 资源管理
--kube-reserved=cpu=500m,memory=500Mi # 预留 500m CPU 和 500Mi 内存给 Kubernetes 组件
--system-reserved=cpu=500m,memory=500Mi # 预留 500m CPU 和 500Mi 内存给系统进程
--eviction-hard=memory.available<500Mi,nodefs.available<5% # 可用内存低于 500Mi 或磁盘低于 5% 时驱逐 Pod
3. 资源管理最佳实践
3.1 设置合理的 Requests 和 Limits
-
requests设为实际负载的 平均值,limits设为 峰值。 - 避免
requests == limits,否则可能影响调度。
3.2 使用 Vertical Pod Autoscaler (VPA)
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/vpa-release-0.9/vpa-updater.yaml # 安装 VPA 组件
3.3 启用 Horizontal Pod Autoscaler (HPA)
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 2 # 最少运行 2 个副本
maxReplicas: 10 # 最多运行 10 个副本
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # 当 CPU 使用率超过 70% 时扩展 Pod
3.4 使用 ResourceQuota 和 LimitRange
- 限制 Namespace 资源消耗,防止资源争抢。
3.5 监控和优化
kubectl apply -f https://github.com/prometheus-operator/kube-prometheus/releases/download/main/kube-prometheus.yaml # 部署 Prometheus 监控
4. 选择合适的资源管理方案
| 方案 | 适用场景 |
|---|---|
| Requests & Limits | 控制单个 Pod 资源分配 |
| ResourceQuota | 限制 Namespace 资源消耗 |
| LimitRange | 设定 Pod/Container 级别限制 |
| VPA | 动态调整 requests,减少资源浪费 |
| HPA | 根据负载动态扩展 Pod |
| Eviction & kubelet 预留 | 防止节点资源耗尽 |
在实际使用中,应结合 监控、自动化扩缩、资源配额 进行综合管理,以确保 Kubernetes 资源分配合理,提高集群效率和稳定性。