确认[Kubernetes] PriorityClass的行为
首先
PriorityClass是用于设置Pod优先级的字段。PriorityClass的特点是可以根据优先级,对已部署的Pod进行撤退隔离。
创建PriorityClass
首先,创建PriorityClass。这次我们将创建以下两个PriorityClass。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 100 #10億以下の整数値。大きいほど優先度が高い
globalDefault: false #trueにすると、PriorityClassを指定しないPodのデフォルト値になる
description: "This priority class should be used for XYZ service pods only." #任意の文字列
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: low-priority
value: 10
globalDefault: false
description: "This priority class should be used for ABC service pods only."
我将应用这份宣言。
$ kubectl apply -f .
priorityclass.scheduling.k8s.io/high-priority created
priorityclass.scheduling.k8s.io/low-priority created
$ kubectl get priorityclasses.scheduling.k8s.io
NAME VALUE GLOBAL-DEFAULT AGE
high-priority 100 false 56s
low-priority 10 false 56s
system-cluster-critical 2000000000 false 109d
system-node-critical 2000001000 false 109d
Pod的部署和运行验证
优先级:通过三个Pod来确认操作,可以是高优先级/低优先级/未设定。
apiVersion: v1
kind: Pod
metadata:
name: nginx-high
spec:
containers:
- name: nginx-high
image: nginx:latest
resources:
requests:
cpu: 1500m
priorityClassName: high-priority
apiVersion: v1
kind: Pod
metadata:
name: nginx-low
spec:
containers:
- name: nginx-low
image: nginx:latest
resources:
requests:
cpu: 1500m
priorityClassName: low-priority
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: 1500m
每个Pod无法同时共存,因为CPU的请求(下限)已被设置为1.5个内核,而worker节点的CPU是2个内核。
按照优先级从低到高的顺序
首先,按照优先级从低到高的顺序(没有设置 -> 低优先级 -> 高优先级)进行apply。同时,在另一个终端窗口中确认Pod的状态转换。
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 22s
nginx-low 0/1 Pending 0 0s #kubectl apply -f nginx-low.yaml 実行
nginx-low 0/1 Pending 0 0s
nginx-low 0/1 Pending 0 0s
nginx 1/1 Terminating 0 27s
nginx 0/1 Terminating 0 28s
nginx 0/1 Terminating 0 33s
nginx 0/1 Terminating 0 33s
nginx-low 0/1 Pending 0 6s
nginx-low 0/1 ContainerCreating 0 6s
nginx-low 0/1 ContainerCreating 0 7s
nginx-low 1/1 Running 0 11s
nginx-high 0/1 Pending 0 0s #kubectl apply -f nginx-high.yaml 実行
nginx-high 0/1 Pending 0 0s
nginx-high 0/1 Pending 0 0s
nginx-low 1/1 Terminating 0 45s
nginx-low 0/1 Terminating 0 46s
nginx-low 0/1 Terminating 0 47s
nginx-low 0/1 Terminating 0 47s
nginx-high 0/1 Pending 0 2s
nginx-high 0/1 ContainerCreating 0 2s
nginx-high 0/1 ContainerCreating 0 3s
nginx-high 1/1 Running 0 7s
每当一个优先级高的Pod被apply,低优先级的Pod会被暂停,然后高优先级的Pod被部署。最终,只会保留优先级最高的nginx-high Pod。
按优先级排序
这次将按高到低的顺序进行申请。同时,在另一个终端上确认Pod的状态转换。
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
nginx-high 0/1 Pending 0 0s
nginx-high 0/1 Pending 0 0s
nginx-high 0/1 ContainerCreating 0 0s
nginx-high 0/1 ContainerCreating 0 1s
nginx-high 1/1 Running 0 6s
nginx-low 0/1 Pending 0 0s #kubectl apply -f nginx-low.yaml実行
nginx-low 0/1 Pending 0 0s
nginx-high 1/1 Terminating 0 53s #kubectl delete -f nginx-high.yaml実行
nginx-high 0/1 Terminating 0 54s
nginx-high 0/1 Terminating 0 64s
nginx-high 0/1 Terminating 0 64s
nginx-low 0/1 Pending 0 49s
nginx-low 0/1 ContainerCreating 0 49s
nginx-low 0/1 ContainerCreating 0 50s
nginx-low 1/1 Running 0 55s
当高优先级的Pod处于运行状态时,如果尝试部署低优先级的Pod而资源不足,则无法进行调度,因此会处于挂起状态。
在这种情况下,如果停止高优先级的Pod,则会调度和部署低优先级的Pod。
总结
我已经确认了几次关于Kubernetes调度控制功能的内容。
cordon
ノードをスケジューリング対象から外す
nodeSelector/Node Affinity/Inter-Pod Affinityなど
Podデプロイ時にスケジューリングするノードを決める
Taints/Tolerations
ノードに設定したTaintsを許容できるPodのみをノードが許可する
PriorityClass(今回)
優先度に応じてスケジューリングできるPodを決定する
我觉得它的功能很强大,做得很好,但我只是确认了其操作,还没涉及到实际的使用情景。我希望通过设计和运营,来考虑实际的使用情况。