如何理解K8S中cpu和内存的资源requests与limits

How to understand the resource requests and limits of cpu and memory in K8S

Posted by alovn on November 20, 2020

容器资源管理

定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存(RAM)大小。

当为 Pod 中的 Container 指定了资源请求时,调度器就利用该信息决定将 Pod 调度到哪个节点上。 当还为 Container 指定了资源约束时,kubelet 就可以确保运行的容器不会使用超出所设约束的资源。 kubelet 还会为容器预留所请求数量的系统资源,供其使用。

reuqests 和 limit (请求和约束)

  • requests: 代表容器为了启动而请求的资源,如果Kubernetes无法满足指定分配资源的最低要求,如果没有达到条件则不启动。
  • limits: 代表容器最多可以使用的资源。超出其内存限制的容器将被杀死,并可能会将整个Pod从节点移走,Kubernetes将重新调度Pod。如果一个容器超出其CPU限制,它不会被杀死,因为CPU更容易控制,它可能不会得到所有的CPU请求而保持资源内。

通常情况下,将请求指定为限制是最好的方法。需要注意的是,一个Pod内可能会有多个容器,这时就要考虑整个Pod的总资源请求。这是因为Kubernets是将Pod作为一个单元进行调度的。

内存的单位

内存的单位比较容易理解,它的单位有:K, M, G, T, P, E,你可能也见过这样的单位:Ki, Mi, Gi等, 那么这两种写法的是等价的吗?我们以 1M 和 1Mi举例:

1
2
M表示:1M = 1000 x 1000
Mi表示:1Mi = 1024 x 1024

CPU单位

CPU 表达的是计算处理能力,Kubernetes中的一个cpu等同于CPU上的1个超线程。

CPU的计量单位叫毫核(m)。一个节点的CPU核心数量乘以1000得到的就是节点的CPU总量。假如一个节点有两个核,那么该节点的CPU总量就是2000m。也可以用小数表示 CPU 的请求:

1
0.1 等价于表达式 100m, 可以看作 100 millicpu

举个例子

下面的例子中:一个Pod有两个Container,每个 Container 的请求为 0.5 cpu 和 512MiB内存, 每个容器的资源约束为 1 cpu 和 1GiB 内存。 可以认为该 Pod 的资源请求为 1 cpu 和 1024 MiB 内存,资源限制为 1 2cpu 和 2GiB 内存。

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
apiversion: apps/v1
kinde: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
    template:
      metadata:
        labels:
          app: nginx
        spec:
          containers:
          - name: app
            image: lab.org/app:v1
            ports:
            - containerPort: 81
            resources:
              requests:
                cpu: 500m
                memory: 512Mi
              limits:
                cpu: 1000m
                memory: 1Gi
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            resources:
              requests:
                cpu: 500m
                memory: 512Mi
              limits:
                cpu: 1000m
                memory: 1Gi

参考文档

Kubernetes官方文档-资源管理