K8S-POD優先順序與搶佔
阿新 • • 發佈:2022-03-01
通過給pod設定對應的優先順序可以保證中重要的pod優先排程
1、概念
在定義pod時,可以在spec.priorityClassName中指定PriorityClass,根據其中定義的優先順序在PrioritySort中排序,優先排程優先順序高的pod,優先順序相同的pod根據進入佇列的時間戳先後排程,當未找到
合適的執行節點時,排程器會將POD轉為pending狀態,併為其啟動“搶佔”過程,在叢集中刪除一個或者多個低優先的POD,讓節點滿足該優先順序高的POD排程。
pod優先順序使用32位正整數,可用值為[0,1000000000],值越大優先順序越高,大於1000000000的優先順序預留給系統級的關鍵pod,以防止這些pod被驅逐。
例如:API-server,Controller-manager,Scheduler和etcd 的pod直接使用system-cluster-critical PriorityClass,優先順序為:2000000000
metric-server,CoreDNS、Dashboard等使用system-node-critical 的pod使用system-node-critical PriorityClass,優先順序為:2000001000
在定義pod時不定義PriorityClass時,預設優先順序的值為:0
2、PriorityClass定義
如果叢集上存在多個設定了全域性預設的優先順序的PriorityClass物件,優先順序小的會生效,如:
定義預設優先順序的demoappv11
apiVersion: apps/v1 kind: Deployment metadata: name: demoappv11 spec: replicas: 4 selector: matchLabels: app: demoappv11 template: metadata: labels: app: demoappv11 spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - {key: app, operator: In, values: ["demoappv11"]} topologyKey: kubernetes.io/hostname containers: - name: demoappv11 image: harbor.myland.com/baseimages/centos/centos-tsinghua:7.9.2009 command: ["sleep","1000"] resources: requests: memory: 2Gi cpu: 150mView Code
優先順序為222222的demoappv12
kind: PriorityClass apiVersion: scheduling.k8s.io/v1 metadata: name: demoappv12 value: 222222 description: "demoappv12" globalDefault: false preemptionPolicy: PreemptLowerPriority --- apiVersion: apps/v1 kind: Deployment metadata: name: demoappv12 spec: replicas: 4 selector: matchLabels: app: demoappv12 template: metadata: labels: app: demoappv12 spec: priorityClassName: demoappv12 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - {key: app, operator: In, values: ["demoappv12"]} topologyKey: kubernetes.io/hostname containers: - name: demoappv12 image: ikubernetes/demoapp:v1.2 resources: requests: memory: 2Gi cpu: 150mView Code
由於記憶體不足,排程器開始清理優先順序的demoappv11
直到demoappv11處於pending狀態