# 作用域
# 按Scope设定ResourceQuota
当多个用户(团队)共享一个节点数量有限的集群时,如何在多个用户(团队)之间分配集群的资源就会变得非常重要。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
- 带有
Terminating
、NotTerminating
、NotBestEffort
的作用域关注点为: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:
low
、medium
、high
- 集群中为每个 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"]
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
输出结果如下所示
resourcequota/pods-high created
resourcequota/pods-medium created
resourcequota/pods-low created
2
3
执行如下命令验证 quota 的使用为 0
:
kubectl describe quota
输出结果如下所示:
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
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
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
验证 "high" priority 对应的 ResourceQuota pods-high
的 Used
统计结果,可以发现 pods-heigh
的配额已经被使用,而其他两个的配额则没有被使用。
执行命令
kubectl describe quota
输出结果如下所示:
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
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