Kubernetes 资源限制详解:原理、组件、最佳实践

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 资源分配合理,提高集群效率和稳定性。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容