此文为学习《Kubernetes权威指南》的相关笔记
学习笔记:
提高集群的资源利用率一直是中大规模集群追求的目标之一,而最常见的作法就是采用优先级方案。
与操作系统中的优先级方案相同,简而言之这种方案的做法就是:给负载以某种方式确定优先级权重,在资源不足时,优先驱逐权重较低者,在资源竞争时,优先给权重较高者让路,在K8s中,优先级抢占调度策略的核心行为为驱逐、抢占。
- 驱逐:资源不足时,综合考虑Pod的优先级、资源申请量与实际使用量等信息,确定驱逐目标。
- 抢占:当新的Pod因为资源不足而无法调度时,驱逐部分优先级较低的Pod来满足它的需求。
值得注意的事,当存在Pod互斥性的场合,调度器可以为了满足高优先级Pod的互斥性需求去驱逐其他节点上的Pod。
在本次实例中,先根据书上的内容,新建一个优先级priorityClass类型,再尝试新建一个Pod去使用它。
为了进一步实践,在后面的内容中尝试先部署一个低优先级Pod,再部署高优先级Pod去尝试抢占它的资源。
一、创建priorityClass并在Pod中使用
1、创建priorityClass配置文件priorityclass1.yaml
可以看到,PriorityClass所在的apiVersion为scheduling.k8s.io/v1beta1
除了资源对象都应该定义的apiVersion、kind、metadata外,一个PriorityClass需要定义value/globalDefault/description
apiVersion: scheduling.k8s.io/v1beta1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for XYZ service pods only"
# kubectl create -f priorityclass.yaml
priorityclass.scheduling.k8s.io/high-priority created
创建后,查看priorityClass列表
可以看到新建立的priorityclass:high-priority
优先级项列表中还存在这两个原生的系统优先级,具有很高的优先级权重
# kubectl get priorityclass
NAME VALUE GLOBAL-DEFAULT AGE
high-priority 1000000 false 26s
system-cluster-critical 2000000000 false 11d
system-node-critical 2000001000 false 11d
2、新建Pod,使用刚创建的优先级项
在.spec.priorityClassName域中指定优先级项的名称
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
priorityClassName: high-priority
创建Pod并查看详情,可以看到优先级权重和优先级项的名称都被写入了Pod中
# kubectl create -f priority-test.yaml
pod/nginx created# kubectl describe pod nginx
Name: nginx
Namespace: default
Priority: 1000000
Priority Class Name: high-priority.......
二、优先级抢占机制测试
1、再创建一个优先级项
创建一个优先级权重更小的项low-priority
# kubectl get priorityclass
NAME VALUE GLOBAL-DEFAULT AGE
high-priority 1000000 false 33m
low-priority 1000 false 9m55s
......
2、创建高低优先级的两个Pod
新建一个Pod,使用低权重的low-priority作为优先级
指定资源大小,给必需CPU资源指定一个比较大的量
注意:cpu资源的单位m是一个核心的千分之一,如果想计算占用节点cpu的总百分比,需要把cpu核心考虑在其中
此处,把最低CPU需求设置为1200m,超过了2核心cpu总算力的一半
apiVersion: v1
kind: Pod
metadata:
name: nginx2
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "64Mi"
cpu: "1200m" #CPU需求设置较大
limits:
memory: "128Mi"
cpu: "1300m"
priorityClassName: low-priority #使用低优先级
于此同时,给第一个Pod设置同样的资源需求,最低cpu需求也大于cpu总算力的一半
此时,两个Pod无法被调度到同一个节点上
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "64Mi"
cpu: "1200m"
limits:
memory: "128Mi"
cpu: "1300m"
priorityClassName: high-priority #使用高优先级
3、先创建低优先级Pod
可以看到该Pod已经成功运行,并消耗了超过一半的cpu
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx2 1/1 Running 0 22sAllocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 1220m (61%) 1300m (65%) #Node的CPU使用率已经过半
memory 64Mi (1%) 128Mi (3%)
ephemeral-storage 0 (0%) 0 (0%)
4、再创建高优先级Pod
可以看到低优先级Pod由于高优先级的资源抢占被驱逐,运行状态从Runing变为Terminating
最终,高优先级Pod成功完成了抢占,节点上只有它在运行
# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 7s
nginx2 0/1 Terminating 0 87s
# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 12s