# 作用域

# 按Scope设定ResourceQuota

参考文档:Resource Quota (opens new window)

当多个用户(团队)共享一个节点数量有限的集群时,如何在多个用户(团队)之间分配集群的资源就会变得非常重要。Resource quota 的用途便在于此。本文主要探索通过 ResourceQuota 限定名称空间资源配额时的作用域。

每个 ResourceQuota 对象都可以绑定一组作用域,当 Kubernetes 对象与此 ResourceQuota 的作用域匹配(在作用域中)时,ResourceQuota 的限定才对该对象生效。

Scope(作用域) 描述
Terminating 包含所有 .spec.activeDeadlineSeconds >= 0 的 Pod
NotTerminating 包含所有 .spec.activeDeadlineSeconds is nil 的Pod
BestEffort 包含所有服务等级(quality of service)为 BestEffort 的 Pod
NotBestEffort 包含所有服务等级(quality of service)为 NotBestEffort 的 Pod
  • 带有 BestEffort 作用域的 ResourceQuota 关注点为: Pod
  • 带有 TerminatingNotTerminatingNotBestEffort 的作用域关注点为:
    • cpu
    • limits.cpu
    • limits.memory
    • memory
    • pods
    • requests.cpu
    • requests.memory

# 按PriorityClass设定ResourceQuota

FEATURE STATE Kubernetes 1.12 beta

创建 Pod 时,可以指定 priority (opens new window)。使用 ResourceQuota 的 .spec.scopeSelector 字段将 ResourceQuota 和 Pod 的 priority 关联,进而限定 Pod 的资源消耗。

只有当 ResourceQuota 的 .spec.scopeSelector 字段与 Pod 的 priorty 字段匹配时,ResourceQuota 才生效。

下面的例子创建了一个通过 priority 限定特定 Pod 的 ResourceQuota 对象,该例子的工作方式如下:

  • 假设集群中的 Pod 可以被指定三种 priority class: lowmediumhigh
  • 集群中为每个 Priority 都创建了一个 ResourceQuota 对象

定义 ResourceQuota 对象的文件如下所示:

apiVersion: v1
kind: List
items:
- apiVersion: v1
  kind: ResourceQuota
  metadata:
    name: pods-high
  spec:
    hard:
      cpu: "1000"
      memory: 200Gi
      pods: "10"
    scopeSelector:
      matchExpressions:
      - operator : In
        scopeName: PriorityClass
        values: ["high"]
- apiVersion: v1
  kind: ResourceQuota
  metadata:
    name: pods-medium
  spec:
    hard:
      cpu: "10"
      memory: 20Gi
      pods: "10"
    scopeSelector:
      matchExpressions:
      - operator : In
        scopeName: PriorityClass
        values: ["medium"]
- apiVersion: v1
  kind: ResourceQuota
  metadata:
    name: pods-low
  spec:
    hard:
      cpu: "5"
      memory: 10Gi
      pods: "10"
    scopeSelector:
      matchExpressions:
      - operator : In
        scopeName: PriorityClass
        values: ["low"]
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
36
37
38
39
40
41
42
43
44
45

执行命令以创建 ResourceQuota:

kubectl create -f https://kuboard.cn/statics/learning/policy/rq-scope-quota.yaml
1

输出结果如下所示

resourcequota/pods-high created
resourcequota/pods-medium created
resourcequota/pods-low created
1
2
3

执行如下命令验证 quota 的使用为 0

kubectl describe quota
1

输出结果如下所示:

Name:       pods-high
Namespace:  default
Resource    Used  Hard
--------    ----  ----
cpu         0     1k
memory      0     200Gi
pods        0     10


Name:       pods-low
Namespace:  default
Resource    Used  Hard
--------    ----  ----
cpu         0     5
memory      0     10Gi
pods        0     10


Name:       pods-medium
Namespace:  default
Resource    Used  Hard
--------    ----  ----
cpu         0     10
memory      0     20Gi
pods        0     10
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

创建 “high” priority Pod,YAML 文件如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: high-priority
spec:
  containers:
  - name: high-priority
    image: ubuntu
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello; sleep 10;done"]
    resources:
      requests:
        memory: "10Gi"
        cpu: "500m"
      limits:
        memory: "10Gi"
        cpu: "500m"
  priorityClassName: high
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

执行命令以创建

kubectl create -f https://kuboard.cn/statics/learning/policy/rq-scope-high-priority-pod.yaml
1

验证 "high" priority 对应的 ResourceQuota pods-highUsed 统计结果,可以发现 pods-heigh 的配额已经被使用,而其他两个的配额则没有被使用。

执行命令

kubectl describe quota
1

输出结果如下所示:

Name:       pods-high
Namespace:  default
Resource    Used  Hard
--------    ----  ----
cpu         500m  1k
memory      10Gi  200Gi
pods        1     10


Name:       pods-low
Namespace:  default
Resource    Used  Hard
--------    ----  ----
cpu         0     5
memory      0     10Gi
pods        0     10


Name:       pods-medium
Namespace:  default
Resource    Used  Hard
--------    ----  ----
cpu         0     10
memory      0     20Gi
pods        0     10
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

scopeSelector.matchExpressions.operator 字段中,可以使用如下几种取值:

  • In
  • NotIn
  • Exist
  • DoesNotExist
更新时间: 2019-10-20 23:33:25