CKA – 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评论