Skip to main content

配置 Deployment 使用 Volcano 控制资源使用

这里举一个示例,限制Deployment最多仅能使用 2 核 CPU。

  1. 创建队列

     apiVersion: scheduling.volcano.sh/v1beta1
    kind: Queue
    metadata:
    name: my-node-queue
    spec:
    weight: 1
    reclaimable: false
    capability:
    cpu: 2

    创建一个仅有 2 核 CPU、并且绑定到节点组my-node-group的队列。这里的weight表示集群资源划分中所占的相对比重,是软约束;reclaimable表示是否允许被回收,由weight来决定;capability表示队列的资源限制。

  2. 创建Deployment

     apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: ubuntu-with-volcano
    labels:
    app: demo
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: demo
    template:
    metadata:
    labels:
    app: demo
    spec:
    schedulerName: volcano
    containers:
    - name: demo
    image: shaowenchen/demo-ubuntu
    resources:
    requests:
    cpu: 1

    schedulerName设置为volcano,表示使用``Volcano调度器。

  3. 查看Pod

     $ kubectl get pods -l app=demo
    NAME READY STATUS RESTARTS AGE
    ubuntu-with-volcano-97c94f9fb-bfgrh 1/1 Running 0 6m24s
  4. 扩容Deployment

     $ kubectl scale deployment/ubuntu-with-volcano --replicas=3

    此时,三个 Pod 只有两个处于 Running 状态,因为 Volcano 限制了 Deployment 最多仅能使用 2c CPU。

     $ kubectl get pods -l app=demo

    NAME READY STATUS RESTARTS AGE
    ubuntu-with-volcano-97c94f9fb-25nb7 1/1 Running 0 27s
    ubuntu-with-volcano-97c94f9fb-6fd64 0/1 Pending 0 27s
    ubuntu-with-volcano-97c94f9fb-bfgrh 1/1 Running 0 7m31s

配置Job使用Volcano限流并发执行

这里创建一个Job并且要求至少 3 个Pod一起运行的Job。

直接使用Kubernetes batch/v1中的Job,配置completionsparallelism,也可以实现这个需求。但Volcano提供的Queue可以控制资源使用、Policy可以控制Task的生命周期策略,能更精准控制Job的执行。

  1. 创建Job

     apiVersion: batch.volcano.sh/v1alpha1
    kind: Job
    metadata:
    name: my-job
    spec:
    minAvailable: 3
    schedulerName: volcano
    queue: default
    policies:
    - event: PodEvicted
    action: RestartJob
    tasks:
    - replicas: 30
    name: demo
    policies:
    - event: TaskCompleted
    action: CompleteJob
    template:
    spec:
    containers:
    - image: ubuntu
    name: demo
    command: ["sleep", "5"]
    resources:
    requests:
    cpu: 20
    restartPolicy: Never

    其中:

    policies:
    - event: PodEvicted
    action: RestartJob

    表示如果PodEvict了,就重启Job

    policies:
    - event: TaskCompleted
    action: CompleteJob

    表示如果Task完成了,就完成Job

    通过EventAction,可以控制Job的状态和行为。

  2. 查看Pod创建情况

    $ kubectl get pod

    NAME READY STATUS RESTARTS AGE
    my-job-demo-0 1/1 Running 0 7s
    my-job-demo-1 1/1 Running 0 7s
    my-job-demo-10 0/1 Pending 0 7s
    ...
    my-job-demo-2 1/1 Running 0 7s
    ...

    由于我设置了PodCPU Request为 20,集群上没有足够的资源,所以 30 个Pod每次只能运行 3 个。

    执行完成之后,Pod不会被删除而是处于Completed状态。由于PodownerReferencesJob,如果删除JobPod也会被删除。