当用多个团队和用户共用同一集群的时候那难免会有资源竞争的情况发生,这时候就需要对不同团队或用户的资源使用配额做出限制

GkCpNV.jpg

资源类型

资源配额分为三种类型:

  • 计算资源配额
  • 存储资源配额
  • 对象数量配额

详细信息请参考kubernetes官方文档资源配额

计算资源配置

可以在一个给定的命名空间限制可以请求的计算资源的总量

资源名称 描述
cpu 非终止态的所有pod,cpu请求值总量不能超出此值
limits.cpu 非终止态的所有pod,cpu限制总量不能超出此值
limits.memory 非终止态的所有pod,内存限制总量不能超出此值
memory 非终止态的所有pod,内存请求总量不能超出此值
requests.cpu 非终止态的所有pod,cpu请求总量不能超出此值
requests.memory 非终止态的所有pod,内存请求总量不能超出此值
  • 示例yaml文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
  namespace: rq
spec:
  hard:
    pods: "20"
    requests.cpu: "20"
    requests.memory: 100Gi
    limits.cpu: "40"
    limits.memory: 200Gi

存储资源的配额

可以在一个给定的命名空间中限制可以请求的存储资源的总量

资源名称 描述
requests.storage 所有PVC,存储请求总量不能超出此值
persistentvolumeclaims 命名空间中可以存在的PVC总数
.storageclass.storage.k8s.io/requests.storage 和该存储嘞关联的所有PVC,存储请求总和不能超出此值
.storageclass.storage.k8s.io/persistentvolumeclaims 和该存储类关联的所有PVC,命名空间中可以存在的PVC总数

示例

  • gold.storageclass.storage.k8s.io/requests.storage: 500Gi
  • bronze.storageclass.storage.k8s.io/requests.storage: 100Gi

对象数量的配额

一个给定类型的对象的数量可以限制。

资源名称 描述
congfigmaps 命名空间可以存在的配置映射的总数
persistentvolumeclaims 命名空间中可以存在的PVC总数
pods 命名空间中可以存在的非终止态的pod总数。如果一个pod的status.phase是failed,Succeeded,则该pod处于终止态
replicationcontrollers 命名空间中可以存在的rc总数
resourcequotas 命名空间中可以存在的资源配额总数
services 命名空间中可以存在的服务总量
services.loadbalancers 命名空间中可以存在的服务的负载均衡的总数量
servces.nodeports 命名空间中可以存在的服务的主机接口的总数量
secrets 命名空间中可以存在的secrets的总数量
  • 示例yaml文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
spec:
  hard:
    configmaps: "10"
    persistentvolumeclaims: "4"
    replicationcontrollers: "20"
    secrets: "10"
    services: "10"
    services.loadbalancers: "2"

限额的作用域

每个配额可以有一组关联的作用域。如果一个限额匹配枚举的作用的交集,它将只衡量一个资源的利用率。当一个作用域被添加到配额时,它将会限制它支持的涉及到该作用域的资源的数量。在不允许的限额上指定资源将会导致一个验证做错误

作用域 描述
Terminating 匹配spec.activeDeadLineSeconds >= 0 的pod
NotTerminating 匹配spec.activeDeadLineSeconds is nil 的pod
BestEffort 匹配具有最佳服务质量的pod
NotBestEffort 匹配具有非最佳服务质量的pod

BestEffort作用域禁止限制跟踪以下的资源:

  • pods

Terminating、NotTerminating和NotBestEffort作用域禁止限额跟踪以下的资源:

  • cpu
  • limits.cpu
  • limits.memory
  • memory
  • pods
  • requests.cpu
  • requests.memory

注意:当命名空间开启了ResourceQuota但没有设置LimitRange时,用户创建pod,必须指定cup,内存的requests和limits,否则会创建失败。resourceQuota搭配 limitRanges效果更好

deployment示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  labels:
    app: nginx
spec:
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.1
        imagePullPolicy: Always
        resources:
         limits: #最大资源限制
           cpu: 30m
           memory: 20Mi
         requests: #最小资源请求
           cpu: 20m
           memory: 10Mi
        ports:
          - containerPort: 80

设置资源限制需要在spec.template.spec下添加resources内容

request

  • 容器使用的最小资源需求, 作为容器调度时资源分配的判断依赖。
  • 只有当前节点上可分配的资源量 >= request 时才允许将容器调度到该节点。
  • request参数不限制容器的最大可使用资源

limit

  • 容器能使用资源的最大值
  • 设置为0表示对使用的资源不做限制, 可无限的使用