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)定性。