资源管理
什么是资源管理?
Kubernetes是一个容器集群管理平台,Kubernetes需要统计整体平台的资源使用情况,合理地将资源分配给容器使用,并且要保证容器生命周期内有足够的资源来保证其运行。
为什么资源配额管理是必要的?
更进一步,如果资源发放是独占的,即资源已发放给了一个容器,同样的资源不会发放给另外一个容器,对于空闲的容器来说占用着没有使用的资源(比如CPU)是非常浪费的。
Kubernetes需要考虑如何在优先度和公平性的前提下提高资源的利用率。
资源配额管理有几种类型?
- 计算资源配额: CPU、内存
- 存储资源配额: PVC容量、PVC数量
- 对象数量配额:congfigmaps数量、pvc数量、pod数量、rc数量等等
requests、limit是什么?
- requests 资源基本需求
- limit 资源上限,硬限制
CPU资源计量单位?
1 Core = 1000 millioncores
所以,500m = 半个CPU核心
内存资源计量单位?
E、P、G、M、K Ei、Pi、Gi、Mi、Ki
QoS 类别有哪些?
- guaranteed: pod中limit和requests相同,
cpu.requests=cpu.limits
,memory.requests=memory.limits
,担保,高优先级 - burstable:
- besteffort: Pod中没有任何一个容器设置了limit或requests属性,尽力而为,最低优先级别
但Kubernetes集群资源吃紧时,会优先回收besteffort类型的容器资源,将资源优先给其他两类容器类别使用
回收逻辑
- 按照QoS优先级回收
- 按照已消耗需求的比例回头,优先回头第二种容器,因为它已经接近需求的上限制
- (1). 需求1G内存,消耗500M内存
- (2). 需求512M内存,消耗500M内存
示例
1. 限制只能用小于三分之一核的CPU、200M内存
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: ikubernetes/stress-ng
command: ["/usr/bin/stress-ng", "-m 1", "-c 1", "--metrics-brief"]
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "300m"
memory: "200Mi"
观察CPU使用情况
# kubectl exec myapp top
Mem: 1180312K used, 703412K free, 2628K shrd, 54148K buff, 798792K cached
CPU: 33% usr 58% sys 0% nic 0% idle 8% io 0% irq 0% sirq
Load average: 0.03 0.06 0.12 6/272 17
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
13 7 root RW 0 0% 0 33% [stress-ng-vm]
6 1 root R 6888 0% 0 25% {stress-ng-cpu} /usr/bin/stress-ng
1 0 root S 6244 0% 0 0% /usr/bin/stress-ng -m 1 -c 1 --met
7 1 root S 6244 0% 0 0% {stress-ng-vm} /usr/bin/stress-ng
14 0 root R 1500 0% 0 0% top