16.9.4 资源配额与成本优化

资源配额与成本优化#

在生产集群中,资源配额与成本优化要做到“可控、可量化、可回溯”。核心方法是建立配额边界、合理设定 requests/limits、结合监控与弹性策略进行持续校准,并辅以成本归集与治理流程。

文章图片

1. 资源配额与默认限制配置示例

  • 为 Namespace 设置配额与对象数量限制
  • 为容器设置默认 requests/limits,避免“无约束”部署
# 文件: /etc/k8s/quotas/prod-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: prod-quota
  namespace: prod
spec:
  hard:
    requests.cpu: "20"
    requests.memory: "40Gi"
    limits.cpu: "40"
    limits.memory: "80Gi"
    persistentvolumeclaims: "50"
    pods: "200"
---
apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
  namespace: prod
spec:
  limits:
  - type: Container
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
    default:
      cpu: "1000m"
      memory: "1Gi"
# 创建 namespace
kubectl create ns prod

# 应用配额与限制
kubectl apply -f /etc/k8s/quotas/prod-quota.yaml

# 查看配额使用情况
kubectl -n prod describe quota prod-quota

命令解释
- requests.* 用于调度预留,直接影响可调度节点
- limits.* 约束最大使用,防止单容器抢占
- pods/persistentvolumeclaims 防止对象数量失控

2. Requests/Limits 校准与示例工作负载

# 文件: /etc/k8s/apps/api-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  namespace: prod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: nginx:1.25
        resources:
          requests:
            cpu: "200m"
            memory: "256Mi"
          limits:
            cpu: "800m"
            memory: "512Mi"
# 部署示例工作负载
kubectl apply -f /etc/k8s/apps/api-deploy.yaml

# 查看 Pod QoS 等级
kubectl -n prod get pod -l app=api -o jsonpath='{.items[0].status.qosClass}{"\n"}'
# 预期输出: Burstable

3. 成本归集与利用率分析示例

# 按 Namespace 汇总资源申请(需 metrics-server)
kubectl top pod -n prod --containers

# 统计请求总量(简单示例)
kubectl -n prod get pod -o jsonpath='{range .items[*]}{.spec.containers[*].resources.requests.cpu}{"\n"}{end}'
# 文件: /etc/k8s/labels/cost-labels.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: prod
  labels:
    cost-center: "biz-A"
    env: "prod"
kubectl apply -f /etc/k8s/labels/cost-labels.yaml

4. 节点与集群层优化示例(自动扩缩容)

# 部署 metrics-server(如已安装可跳过)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 为工作负载创建 HPA
kubectl -n prod autoscale deployment api --cpu-percent=60 --min=3 --max=10

# 查看 HPA 状态
kubectl -n prod get hpa

5. 排错与常见问题

# 1) Pod 无法创建,提示超出配额
kubectl -n prod describe quota prod-quota

# 2) Pod Pending,资源不足
kubectl -n prod describe pod <pod-name> | sed -n '/Events/,$p'

# 3) requests 过大导致调度失败
kubectl get node -o wide
kubectl describe node <node-name> | sed -n '/Allocatable/,$p'

排错要点
- 配额不足:提升配额或回收无效工作负载
- Pending:查看 Events 是否 “Insufficient cpu/memory”
- 资源碎片:降低 requests 或调整 Pod 亲和性

6. 练习与实践

  1. test 命名空间设置 requests.cpu=2 的配额并尝试创建 3 个 500m 的 Pod,观察第 5 个 Pod 是否被拒绝。
  2. 为一个 Deployment 设置 requests/limits,并通过 kubectl top 观察实际使用与申请差异。
  3. requests 降低 20%,观察集群可调度 Pod 数变化与节点利用率。
  4. 为低优先级作业设置 PriorityClass,制造资源紧张后观察抢占行为。
# 文件: /etc/k8s/priority/low-priority.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: low-priority
value: 1000
preemptionPolicy: PreemptLowerPriority
globalDefault: false
description: "Low priority for batch jobs"

通过配额约束、requests/limits 校准、自动扩缩容与成本归集,形成可持续的资源治理闭环,实现稳定性与成本效率的平衡。