Kubernetes 资源配额管理

资源的配额管理功能主要用于对集群中可用的资源进行分配和限制。为了开启配额管理,需要设置 kube-apiserver 的 –admission_control 参数,使之家在这两个准入控制器。

1
kube-apiserver ... --admission_control=LimitRanger,ResourceQuota...

指定容器配额

对指定容器实施配额管理非常简单,只要在 Pod 或 ReplicationController 的定义文件中设定 resources 属性即可为某个容器指定配额。目前容器支持 CPU 和 Memory 两类资源的配额限制。

在下面这个 RC 定义文件中增加了 redis-master 的资源配额声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: kubenetes/redis-master
ports:
- containerPort: 6379
resources:
limits:
cpu: 0.5
memory: 128Mi

以上配置表示,系统将对名为 master 的容器限制 CPU 为 0.5(也可以写为500m),可用内存限制为 128MiB字节。

1 KB(kilobyte) = 1000 bytes = 8000 bits

1 KiB(kibibyte) = 2^10 bytes = 1024 bytes = 8192 bits

全局默认配额

除了可以直接在容器(或 RC)的定义文件中给指定的容器增加资源配额参数,我们还可以通过创建 LimitRange 对象来定义一个全局默认配额模版。这个默认配额模版会加载到集群中的每个 Pod 及容器上,这样就不用为每个 Pod 和容器重复设置了。

我们定义一个名为 limit-range-1 的 LimitRange:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: v1
kind: LimitRange
metadata:
name: limit-range-1
spec:
limits:
- type: " Pod "
max:
cpu: " 2 "
memory: 1Gi
min:
cpu: 250m
memory: 32Mi
- type: " Container "
max:
cpu: " 2 "
memory: 1Gi
min:
cpu: 250m
memory: 32Mi
default:
cpu: 250m
memory: 64Mi

上述设置表明:

  • 任意 Pod 内所有容器的 CPU 使用限制在 0.25~2;
  • 任意 Pod 内所有容器的内存使用限制在 32Mi~1Gi;
  • 任意容器的 CPU 使用限制在 0.25~2,默认值为 0.25;
  • 任意容器的内存使用限制在 32Mi~1Gi,默认值为 64Mi。

多租户配额管理

多租户在 Kubernetes 中以 Namespace 来体现,这里的多租户可以是多个租户、多个业务系统或者相互隔离的多种作业环境。一个集群中的资源总是有限的,当这个集群被多个租户的应用同时使用时,为了更好地使用这种有限的共有资源,我们需要将资源配额的管理单元提升到租户级别,只需要在不同租户对应的 Namespace 上加载对应的 ResourceQuota 配置即可达到目的。

假设我们集群拥有的总资源为:CPU 共有 128core;内存总量为 1024GiB;有两个租户,分别是开发组和测试组,开发组的资源配额为 32core CPU 及 256GiB 内存,测试组的资源配额为 96core CPU 及 768GiB 内存。

首先,创建开发组对应的命名空间:

1
2
3
4
apiVersion: v1
kind: Namespace
metadata:
name: development

接着,创建用于限定开发组的 ResourceQuota 对象,注意 metadata.namespace 属性被设定为开发组的命名空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota-development
namespace: development
spec:
hard:
cpu: " 32 "
memory: 256Gi
persistentvolumeclaims: " 10 "
pods: " 100 "
replicationcontrollers: " 50 "
resourcequotas: " 1 "
secrets: " 20 "
services: " 50 "

测试组相应的 namespace 与 ResourceQuota 同上,略。