确认[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を決定する

我觉得它的功能很强大,做得很好,但我只是确认了其操作,还没涉及到实际的使用情景。我希望通过设计和运营,来考虑实际的使用情况。

bannerAds