9.6、资源配额(limits)

5.2.6 资源配额(dcoker类似)

容器中的程序要运行,肯定是要占用一定资源的,比如 cpu** 和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况,**kubernetes 提供了对内存和 cpu 的资源进行配额的机制,这种机制主要通过 resources 选项实现,他有两个子选项:

  • limits:用于限制运行时容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启
  • requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动

可以通过上面两个选项设置资源的上下限。

接下来,编写一个测试案例,创建 pod-resources.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
name: pod-resources
namespace: dev
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:nginx-latest # nginx:1.17.1
resources: # 资源配额
limits: # 限制资源(上限)
cpu: "2" # CPU限制,单位是core数
memory: "10Gi" # 内存限制
requests: # 请求资源(下限)
cpu: "1" # CPU限制,单位是core数
memory: "10Mi" # 内存限制

docker例子资源配额限制则为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3'
services:
openvpn:
image: kylemanna/openvpn
# registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:kylemanna_openvpn-v1
container_name: openvpn
ports:
- "21194:1194/udp"
restart: always
volumes:
- ./openvpn-data:/etc/openvpn
cap_add:
- NET_ADMIN
deploy:
resources:
limits:
cpus: "1"
memory: 100M
reservations:
cpus: '0.1'
memory: 100M

在这对cpu和memory的单位做一个说明:

  • cpu:core数,可以为整数或小数
  • memory: 内存大小,可以使用Gi、Mi、G、M等形式
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
# 运行Pod
kubectl create -f pod-resources.yaml
# 查看发现pod运行正常
kubectl get pod pod-resources -n dev

# 接下来,停止Pod
kubectl delete -f pod-resources.yaml

# 编辑pod,修改resources.requests.memory的值为10Gi
vim pod-resources.yaml

# 再次启动pod
kubectl create -f pod-resources.yaml


# 查看Pod状态,发现Pod启动失败
kubectl get pod pod-resources -n dev -o wide

NAME READY STATUS RESTARTS AGE
pod-resources 0/1 Pending 0 20s

# 查看pod详情会发现,如下提示
kubectl describe pod pod-resources -n dev
......
Warning FailedScheduling 35s default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 Insufficient memory.(内存不足)