Kubernetes 資源限制詳解:原理、組件、最佳實踐

1. 資源限制的核心組件

Kubernetes 提供多個組件來管理 CPU、內(nèi)存、存儲等資源,確保集群穩(wěn)定性和公平性。主要組件包括:

1.1 Namespace 級別

  • ResourceQuota:限制命名空間 (Namespace) 內(nèi)的 CPU、內(nèi)存、Pod 數(shù)量等,防止單個 Namespace 過度占用資源。
  • LimitRange:設(shè)置 Pod 或 Container 級別的最小/最大資源使用限制。

1.2 Pod 和容器級別

  • Requests:容器運行時的 最低資源需求,用于調(diào)度決策。
  • Limits:容器運行時的 最大可用資源,防止過量消耗。

1.3 節(jié)點級別

  • kubelet 資源管理
    • --kube-reserved:預(yù)留資源給 Kubernetes 組件,如 kubelet、kube-proxy。
    • --system-reserved:預(yù)留資源給 OS 進程,防止 K8s 占滿節(jié)點。
    • --eviction-hard:設(shè)定資源閾值,超限時自動驅(qū)逐 Pod。

1.4 調(diào)度器(Scheduler)

  • Pod 親和性 (PodAffinity) 和反親和性 (PodAntiAffinity):影響 Pod 在節(jié)點間的分布。
  • NodeSelector & NodeAffinity:將 Pod 限制調(diào)度到特定節(jié)點。

1.5 資源自動管理

  • Vertical Pod Autoscaler (VPA):自動調(diào)整 Pod 的 CPU 和內(nèi)存請求。
  • Horizontal Pod Autoscaler (HPA):根據(jù)負載動態(tài)擴展 Pod 副本。
  • Cluster Autoscaler:動態(tài)調(diào)整集群節(jié)點數(shù)量。

2. 資源限制的工作原理

2.1 ResourceQuota 和 LimitRange

示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: my-namespace
spec:
  hard:
    pods: "10" # 限制該 Namespace 內(nèi)最多運行 10 個 Pod
    requests.cpu: "4" # 所有 Pod CPU 請求總和不能超過 4 核
    requests.memory: "8Gi" # 所有 Pod 內(nèi)存請求總和不能超過 8GiB
    limits.cpu: "8" # 所有 Pod 的 CPU 限制總和不能超過 8 核
    limits.memory: "16Gi" # 所有 Pod 的內(nèi)存限制總和不能超過 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 核心,確保調(diào)度時滿足需求
        memory: "256Mi" # 申請 256MiB 內(nèi)存,調(diào)度時必須滿足
      limits:
        cpu: "1" # 限制該容器最多使用 1 個 CPU 核心
        memory: "512Mi" # 限制該容器最多使用 512MiB 內(nèi)存,超出可能被 OOMKill

2.3 Kubelet 資源管理

--kube-reserved=cpu=500m,memory=500Mi # 預(yù)留 500m CPU 和 500Mi 內(nèi)存給 Kubernetes 組件
--system-reserved=cpu=500m,memory=500Mi # 預(yù)留 500m CPU 和 500Mi 內(nèi)存給系統(tǒng)進程
--eviction-hard=memory.available<500Mi,nodefs.available<5% # 可用內(nèi)存低于 500Mi 或磁盤低于 5% 時驅(qū)逐 Pod

3. 資源管理最佳實踐

3.1 設(shè)置合理的 Requests 和 Limits

  • requests 設(shè)為實際負載的 平均值limits 設(shè)為 峰值。
  • 避免 requests == limits,否則可能影響調(diào)度。

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 監(jiān)控和優(yōu)化

kubectl apply -f https://github.com/prometheus-operator/kube-prometheus/releases/download/main/kube-prometheus.yaml # 部署 Prometheus 監(jiān)控

4. 選擇合適的資源管理方案

方案 適用場景
Requests & Limits 控制單個 Pod 資源分配
ResourceQuota 限制 Namespace 資源消耗
LimitRange 設(shè)定 Pod/Container 級別限制
VPA 動態(tài)調(diào)整 requests,減少資源浪費
HPA 根據(jù)負載動態(tài)擴展 Pod
Eviction & kubelet 預(yù)留 防止節(jié)點資源耗盡

在實際使用中,應(yīng)結(jié)合 監(jiān)控、自動化擴縮、資源配額 進行綜合管理,以確保 Kubernetes 資源分配合理,提高集群效率和穩(wěn)定性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容