资源配额(Resource Quotas)是用来限制用户资源用量的一种机制。

它的工作原理为

  • 资源配额应用在 Namespace 上,并且每个 Namespace 最多只能有一个 ResourceQuota 对象
  • 开启计算资源配额后,创建容器时必须配置计算资源请求或限制(也可以用 LimitRange 设置默认值)
  • 用户超额后禁止创建新的资源

开启资源配额功能

  • 首先,在 API Server 启动时配置准入控制 --admission-control=ResourceQuota
  • 然后,在 namespace 中创建一个 ResourceQuota 对象

资源配额的类型

  • 计算资源,包括 cpu 和 memory

    • cpu, limits.cpu, requests.cpu
    • memory, limits.memory, requests.memory
  • 存储资源,包括存储资源的总量以及指定 storage class 的总量

    • requests.storage:存储资源总量,如 500Gi
    • persistentvolumeclaims:pvc 的个数
    • .storageclass.storage.k8s.io/requests.storage
    • .storageclass.storage.k8s.io/persistentvolumeclaims
    • requests.ephemeral-storage 和 limits.ephemeral-storage (需要 v1.8+)
  • 对象数,即可创建的对象的个数

    • pods, replicationcontrollers, configmaps, secrets
    • resourcequotas, persistentvolumeclaims
    • services, services.loadbalancers, services.nodeports

计算资源示例

  1. apiVersion: v1
  2. kind: ResourceQuota
  3. metadata:
  4. name: compute-resources
  5. spec:
  6. hard:
  7. pods: "4"
  8. requests.cpu: "1"
  9. requests.memory: 1Gi
  10. limits.cpu: "2"
  11. limits.memory: 2Gi

对象个数示例

  1. apiVersion: v1
  2. kind: ResourceQuota
  3. metadata:
  4. name: object-counts
  5. spec:
  6. hard:
  7. configmaps: "10"
  8. persistentvolumeclaims: "4"
  9. replicationcontrollers: "20"
  10. secrets: "10"
  11. services: "10"
  12. services.loadbalancers: "2"

LimitRange

默认情况下,Kubernetes 中所有容器都没有任何 CPU 和内存限制。LimitRange 用来给 Namespace 增加一个资源限制,包括最小、最大和默认资源。比如

  1. apiVersion: v1
  2. kind: LimitRange
  3. metadata:
  4. name: mylimits
  5. spec:
  6. limits:
  7. - max:
  8. cpu: "2"
  9. memory: 1Gi
  10. min:
  11. cpu: 200m
  12. memory: 6Mi
  13. type: Pod
  14. - default:
  15. cpu: 300m
  16. memory: 200Mi
  17. defaultRequest:
  18. cpu: 200m
  19. memory: 100Mi
  20. max:
  21. cpu: "2"
  22. memory: 1Gi
  23. min:
  24. cpu: 100m
  25. memory: 3Mi
  26. type: Container
  1. $ kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/limits.yaml --namespace=limit-example
  2. limitrange "mylimits" created
  3. $ kubectl describe limits mylimits --namespace=limit-example
  4. Name: mylimits
  5. Namespace: limit-example
  6. Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
  7. ---- -------- --- --- --------------- ------------- -----------------------
  8. Pod cpu 200m 2 - - -
  9. Pod memory 6Mi 1Gi - - -
  10. Container cpu 100m 2 200m 300m -
  11. Container memory 3Mi 1Gi 100Mi 200Mi -

配额范围

每个配额在创建时可以指定一系列的范围

范围 说明
Terminating podSpec.ActiveDeadlineSeconds>=0 的 Pod
NotTerminating podSpec.activeDeadlineSeconds=nil 的 Pod
BestEffort 所有容器的 requests 和 limits 都没有设置的 Pod(Best-Effort)
NotBestEffort 与 BestEffort 相反