容器资源管理
定义 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