写在前面
本文一起看下POD的资源限制配置和健康监测的相关内容。
1:资源限制
如果是不对POD设置资源限制的话,若任由其占用系统资源,可能会造成非常严重的后果,所以我们需要根据具体情况来设置资源限制,如使用多少内存,多少CPU,多少IOPS等,实现这些限制使用的是cgroup技术,而配置这些限制使用到属性是resources
。在看具体的例子之前需要先来看下cpu资源的表示方法,cpu标识的最小单位是0.001m
,这里的m是milli的意思,1000m就代表使用一个cpu,500m就代表0.5cpu,具体配置cpu限制的话使用Xm
,X
这种,后者是直接指定使用CPU的个数。如下yaml:
apiVersion: v1
kind: Pod
metadata:
name: ngx-pod-resources
spec:
containers:
- image: nginx:alpine
name: ngx
resources:
requests:
cpu: 10m
memory: 100Mi
limits:
cpu: 20m
memory: 200Mi
通过requests
配置初始时需要0.01cpu,100MB内存,通过limits
配置最多只能申请0.02cpu,200MB内存,如果超过最大限制则会被强制停止。配置了资源限制后,k8s会根据每个Node的剩余资源情况来将POD分配到合适的Node上,尽量的将Node的资源榨取干净。这个过程有些类似于俄罗斯方块,每个方块是分配到某Node上的POD,如下图:
如果我们申请的资源集群中所有的Node都无法满足会发生什么呢?比如定义如下申请10个CPU的yaml:
dongyunqi@mongodaddy:~/k8s$ cat appy-10-cpu.yml
apiVersion: v1
kind: Pod
metadata:
name: ngx-pod-resources
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
operator: Exists
containers:
- image: nginx:alpine
name: ngx
resources:
requests:
cpu: 10
memory: 100Mi
limits:
cpu: 20
memory: 200Mi
apply后查看:
dongyunqi@mongodaddy:~/k8s$ kubectl get pod | egrep 'NAME|ngx-pod-resources'
NAME READY STATUS RESTARTS AGE
ngx-pod-resources 0/1 Pending 0