CKA [Workoad] – Priority Class的使用

当worker node部署着random-pod和critical-pod的时候,worker node是资源刚好用完,那么新需要部署的prod-pod就无法部署,这个使用就需要淘汰random-pod来让prod-pod能够部署。我们可以设置prod-pod为high priority 和 random-pod为low priority 那么kubernetes就会先淘汰random-pod

PriorityClass的执行功能

  • 部署循序排列:如果同时部署low priority和high priority等级的deployment,那么Kubernetes会优先部署high priority的先,然后才部署low priority直到资源使用光
  • 抢占策略:如果high priority不够资源部署的话,那么kubernetes就会释放掉low priority的pod先,好让worker node足够资源部署high priority的pod

如何创建PriorityClass

1. 使用命令行创建priorityclass

【如果忘了怎么用可以用--help】
kubectl create priorityclass --help

2. 使用命令行输出yaml

【输出yaml】
kubectl create priorityclass low-priority --value=10 --dry-run=client -o yaml 

【把输出的yaml存入文件内】
kubectl create priorityclass low-priority --value=10 --dry-run=client -o yaml > priorityclass.yaml

使用案例

1. 创建low-priority和high-priority的priorityclass
– globalDefault为 true 的话,就是所有未指定 priorityClassName 的 Pod 都会默认使用该 PriorityClass 所定义的优先级值。
– globalDefault为true的话,只能选择一个而已

apiVersion: scheduling.k8s.io/v1
globalDefault: true 
kind: PriorityClass
metadata:
  name: low-priority
preemptionPolicy: PreemptLowerPriority
value: 10
apiVersion: scheduling.k8s.io/v1
globalDefault: false 
kind: PriorityClass
metadata:
  name: high-priority
preemptionPolicy: PreemptLowerPriority
value: 100

2. 使用watch的命令查看deployment的创建和摧毁记录

kubectl get deployments -w

3. 首先创建low-priority-deployment先

kubectl apply -f low-dev.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: low-priority-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: low-priority-app
  template:
    metadata:
      labels:
        app: low-priority-app
    spec:
      priorityClassName: low-priority
      containers:
      - name: busybox
        image: nginx
        resources:
          requests:
            memory: "900Mi"
            cpu: "30m"

4. 接着再创建high-priority-development

kubectl apply -f high-dev.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: high-priority-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: high-priority-app
  template:
    metadata:
      labels:
        app: high-priority-app
    spec:
      priorityClassName: high-priority
      containers:
      - name: busybox
        image: nginx
        resources:
          requests:
            memory: "900Mi"
            cpu: "30m"

5. 查看结果

抢占策略的使用(preemptionPolicy)

Kubernetes preemptionPolicy 用于控制该优先级类(PriorityClass)下的 Pod 是否可以抢占(驱逐)低优先级 Pod。它共有两种可选值

  • PreemptLowerPriority :允许本 PriorityClass 下的 Pod 在资源不足时,驱逐优先级比自己低的 Pod,以腾出资源进行调度。如果在设定priorityclass没有指定的话,那么默认就是使用这个策略。
  • Never:所属 Pod 会像普通 Pod 一样排队,但它们不抢占优先级更低的 Pod,​只能等资源“自然”释放,绝不会去踢掉别的Pod。​若节点资源不足,就一直待在 Pending 状态,直到有其他 Pod 自行终止或新增节点才会被调度。

Loading

Facebook评论