【Kubernetes】Pod学习(十)Pod调度:prioritylClass优先级调度

此文为学习《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          22s

Allocated 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

发布了27 篇原创文章 · 获赞 0 · 访问量 951

猜你喜欢

转载自blog.csdn.net/qq_38093301/article/details/103579824