Como gerenciar lote em recursos do GKE

BatchQueues

As filas são uma forma de agrupar e gerenciar jobs estreitamente relacionados.

Criar um BatchQueue

Para criar um BatchQueue, use o nome de um BatchPriority atual ou crie um novo BatchPriority a ser usado.

O arquivo default_queue.yaml abaixo é um manifesto simples para um BatchQueue.

   apiVersion: kbatch.k8s.io/v1beta1
   kind: BatchQueue
   metadata:
     labels:
       controller-tools.k8s.io: "1.0"
     name: default
     namespace: default
   spec:
     batchPriorityName: critical
     # Attaching a budget here is optional.
     batchBudgetName: default
     # Attaching constraints here is optional.
     constraintNames: ["default"]
   

Crie o BatchQueue:

   kubectl apply -f default_queue.yaml
   

A resposta é semelhante a:

   batchqueue.kbatch.k8s.io/default created
   

Listar BatchQueues:

   kubectl get batchqueues
   kubectl get batchqueues --all-namespaces
   

A resposta é semelhante a:

   NAME      AGE
   default   2m
   

Descrever BatchQueues:

   kubectl describe batchqueue queuename
   

Exemplo:

   kubectl describe batchqueue default
   

A resposta é semelhante a:

    Name:         default
    Namespace:    default
    Labels:       constraint_default=default
                  controller-tools.k8s.io=1.0
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"kbatch.k8s.io/v1beta1","kind":"BatchQueue","metadata":{"annotations":{},"labels":{"controller-tools.k8s.io":"1.0"},"name":...
    API Version:  kbatch.k8s.io/v1beta1
    Kind:         BatchQueue
    Metadata:
      Creation Timestamp:  2019-09-11T23:57:12Z
      Finalizers:
        finalizers.kbatch.k8s.io/batchqueue
      Generation:        1
      Resource Version:  403107
      Self Link:         /apis/kbatch.k8s.io/v1beta1/namespaces/default/batchqueues/default
      UID:               dfdde64c-d4ef-11e9-b6dc-42010a8000a6
    Spec:
      Batch Budget Name:  default
      Batch Job Constraint Names:
        default
      Batch Priority Name:  critical
    Status:
      Jobs:
        Last Updated:  2019-09-12T20:27:40Z
        Phase Counts:
          Queued:   0
          Ready:    0
          Running:  0
    Events:         none
   

Parar de programar jobs atuais de um BatchQueue

Para impedir que um BatchQueue programe jobs da fila que ainda não foram programados, defina PauseScheduling como true.

Exemplo:

Atualize o arquivo default_queue.yaml da forma a seguir:

    apiVersion: kbatch.k8s.io/v1beta1
    kind: BatchQueue
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: default
      namespace: default
    spec:
      batchPriorityName: critical
      pauseScheduling: true
   

Em seguida, use o comando a seguir para atualizar o BatchQueue:

kubectl apply -f default_queue.yaml

Parar de aceitar novos jobs em um BatchQueue

Para impedir que um BatchQueue aceite novos jobs, defina PauseAdmission como verdadeiro.

  1. Atualize default_queue.yaml com base no manifesto a seguir:

    apiVersion: kbatch.k8s.io/v1beta1
    kind: BatchQueue
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: default
      namespace: default
    spec:
      batchPriorityName: critical
      pauseAdmission: true
    
  2. Aplique a atualização ao BatchQueue:

    kubectl apply -f default_queue.yaml
    

Atualizar BatchQueues

Para atualizar um BatchQueue, edite o manifesto da fila, por exemplo, default_queue.yaml, e aplique as alterações:

kubectl apply -f default_queue.yaml

Excluir BatchQueues

Para excluir um BatchQueue, execute o seguinte comando:

kubectl delete batchqueue default

A resposta é semelhante a:

batchqueue.kbatch.k8s.io "default" deleted

Verifique se o BatchQueue foi excluído executando:

kubectl get batchqueues

A resposta é semelhante a:

No resources found.

Como criar e gerenciar prioridades

O BatchPriorities permite priorizar jobs em filas de alta prioridade acima de jobs de filas de prioridade mais baixa.

Para criar um BatchPriority, execute as etapas a seguir:

  1. Crie criticalpriority.yaml do manifesto abaixo:

    apiVersion: kbatch.k8s.io/v1beta1
    kind: BatchPriority
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: critical
    spec:
      value: 150
      description: Critical Priority
    
  2. Execute o seguinte comando:

    kubectl apply -f criticalpriority.yaml
    

    A resposta é semelhante a:

    batchpriority.kbatch.k8s.io/critical created
    
  3. Verifique o BatchPriority:

    kubectl get batchpriorities
    kubectl get batchpriorities --all-namespaces
    

    A resposta é semelhante a:

    NAME      AGE
    critical  1m
    
  4. Descreva o BatchPriority:

    kubectl describe batchpriority critical
    

    A resposta é semelhante a:

    Name:         critical
    Namespace:
    Labels:       controller-tools.k8s.io=1.0
    Annotations:  <none>
    API Version:  kbatch.k8s.io/v1beta1
    
    Metadata:
      Creation Timestamp:  2019-09-11T22:24:15Z
      Finalizers:
        finalizers.kbatch.k8s.io/batchpriority
      Generation:        1
      Resource Version:  28112
      Self Link:         /apis/kbatch.k8s.io/v1beta1/batchpriorities/critical
      UID:               e377117e-d4e2-11e9-a0de-42010a80005f
    Spec:Kind:         BatchPriority
      Description:  Critical Priority
      Value:        150
    Status:
    Events:  <none>
    

Como atualizar BatchPriorities

Para atualizar o BatchPriority, edite criticalpriority.yaml e execute o seguinte comando:

kubectl apply -f criticalpriority.yaml

Como excluir BatchPriorities

Para excluir um BatchPriority, execute o seguinte comando:

kubectl delete batchpriority critical

A resposta é semelhante a:

batchpriority.kbatch.k8s.io "critical" deleted

Verifique se o BatchBudget foi excluído executando:

kubectl get batchpriority

A resposta é semelhante a:

No resources found.

Como criar e gerenciar BatchJobConstraints [opcional]

Opcionalmente, uma fila pode ter restrições de job que especificam políticas para aceitar jobs de uma determinada fila.

Para criar um BatchJobConstraints, execute as etapas a seguir:

  1. Crie constraint.yaml do manifesto abaixo:

    apiVersion: kbatch.k8s.io/v1beta1
    kind: BatchJobConstraint
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: default
    spec:
      # The system supports the following constraints:
      # Cpu, Memory, WallTime, Gpu, GpuModel, RetryLimit
      # Adding a BatchJobConstraint to a BatchQueue means that the BatchQueue
      # will only accept jobs that satisfy the listed constraints.
      constraints:
        - name: WallTime
          operator: LessThan
          values: ["24h"]
    
  2. Execute o seguinte comando:

    kubectl create -f constraint.yaml
    

    A resposta é semelhante a:

    batchjobconstraint.kbatch.k8s.io/batchjobconstraint-sample created
    
  3. Verifique o BatchJobConstraints:

    kubectl get batchjobconstraints
    kubectl get batchjobconstraints --all-namespaces
    

    A resposta é semelhante a:

    NAME                        AGE
    batchjobconstraint-sample   45s
    
  4. Descreva o BatchJobConstraints:

    kubectl describe batchjobconstraint batchjobconstraint-sample
    

    A resposta é semelhante a:

    Name:         batchjobconstraint-sample
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  kbatch.k8s.io/v1beta1
    Kind:         BatchJobConstraint
    Metadata:
      Creation Timestamp:  2019-09-11T22:39:39Z
      Generation:          1
      Resource Version:    32480
      Self Link:           /apis/kbatch.k8s.io/v1beta1/batchjobconstraints/batchjobconstraint-sample
      UID:                 0a496ff2-d4e5-11e9-a0de-42010a80005f
    Spec:
      Constraints:
        Name:      Memory
        Operator:  LessThan
        Values:
          16G
        Name:      Cpu
        Operator:  In
        Values:
          1
          2
          4
        Name:      Gpu
        Operator:  In
        Values:
          1
          2
          4
        Name:      GpuModel
        Operator:  Equal
        Values:
          nvidia-tesla-v100
        Name:      WallTime
        Operator:  LessThan
        Values:
          24h
        Name:      RetryLimit
        Operator:  LessThan
        Values:
          2
    Events:  <none>
    

Como atualizar o BatchJobConstraints

Para atualizar o BatchJobConstraints, edite constraint.yaml e execute o seguinte comando:

kubectl apply -f constraint.yaml

Como excluir BatchJobConstraints

Para excluir um BatchJobConstraints, execute o seguinte comando:

kubectl delete batchjobconstraint batchjobconstraint-sample

A resposta é semelhante a:

batchjobconstraint.kbatch.k8s.io "batchjobconstraint-sample" deleted

Verifique se o BatchJobConstraints foi excluído executando:

kubectl get batchjobconstraints

A resposta é semelhante a:

No resources found.

Como criar e gerenciar CostModels [opcional]

O Batch usa CostModels para deduzir recursos de um orçamento. O CostModel só é necessário apenas se você quiser usar um BatchBudget para qualquer um de seus BatchQueues.

Para criar um CostModel, execute as etapas a seguir:

  1. Crie default_costmodel.yaml do manifesto abaixo:

    apiVersion: kbatch.k8s.io/v1beta1
    kind: BatchCostModel
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: default
    spec:
      resources:
        # These costs are hourly and in USD. For example, based on the numbers below, running using 1 CPU
        # 1 GB of RAM, and 1 Tesla T4 GPU for 2 hours would cost 2 * ($0.031611 + $0.004237 + $0.95)
        # The values are taken from https://cloud.google.com/compute/pricing for
        # region us-west1. The values are accurate as of April 2019. Actual pricing depends on various factors,
        # such as long-term contracts, use of standard machine types, the region, etc.
        cpu: 0.031611         # This is the on-demand price for a single vCPU
        memory: 0.004237      # This is the on-demand price for 1GB of memory
        nvidia.com/gpu: 0.95  # This is the cost for use of the Tesla T4 GPU. Currently
                              # the system does not support breaking out prices for
                              # specific GPU types, so an average price for the intended
                              # GPUs should be used here.
    
  2. Execute o seguinte comando:

    kubectl create -f default_costmodel.yaml
    

    A resposta é semelhante a:

    batchcostmodel.kbatch.k8s.io/default created
    
  3. Verifique o CostModel:

    kubectl get batchcostmodels
    

    A resposta é semelhante a:

    NAME      AGE
    default   2m
    
  4. Descreva o CostModel:

    kubectl describe batchcostmodel default
    

    A resposta é semelhante a:

    Name:         default
    Namespace:
    Labels:       controller-tools.k8s.io=1.0
    Annotations:  none
    API Version:  kbatch.k8s.io/v1beta1
    Kind:         BatchCostModel
    Metadata:
      Creation Timestamp:  2019-09-11T21:39:51Z
      Generation:          1
      Resource Version:    15534
      Self Link:           /apis/kbatch.k8s.io/v1beta1/batchcostmodels/default
      UID:                 afacef7a-d4dc-11e9-b6dc-42010a8000a6
    Spec:
      Resources:
        Cpu:                 0.031611
        Memory:              0.004237
        Nvidia . Com / Gpu:  0.95
    Events:                  none
    

Como atualizar CostModels

Para atualizar CostModel, edite default_costmodel.yaml e execute o seguinte comando:

kubectl apply -f default_costmodel.yaml

Como excluir CostModels

Para excluir um CostModel, execute o seguinte comando:

kubectl delete batchcostmodel default

A resposta é semelhante a:

batchcostmodel.kbatch.k8s.io "default" deleted

Verifique se o CostModel foi excluído executando:

kubectl get batchcostmodels

A resposta é semelhante a:

No resources found.

Como criar e gerenciar BatchBudgets [opcional]

Uma fila pode ter um orçamento. O orçamento define quanto você gasta com recursos em um período específico. Um BatchCostModel especifica o custo dos recursos.

Se nenhum orçamento for anexado à fila, os jobs serão programados sem considerar o orçamento.

Para criar um BatchBudget, execute as etapas a seguir:

  1. Crie default_budget.yaml do manifesto abaixo:

    apiVersion: kbatch.k8s.io/v1beta1
    kind: BatchBudget
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: default
    spec:
      batchCostModelName: "default"
      # Two durations are currently supported: 24h and 720h (30d).
      # These may be combined, by specifying two budget windows, to enforce both a
      # daily and monthly limit.
      budgetWindows:
        - duration: "24h"
          amount: 100
    
  2. Execute o seguinte comando:

    kubectl create -f default_budget.yaml
    

    A resposta é semelhante a:

    batchbudget.kbatch.k8s.io/default created
    
  3. Verifique o BatchBudget:

    kubectl get batchbudgets
    kubectl get batchbudgets --all-namespaces
    

    A resposta é semelhante a:

    NAME      AGE
    default   2m
    
  4. Descreva o BatchBudget:

    kubectl describe batchbudget default
    

    A resposta é semelhante a:

    Name:         default
    Namespace:
    Labels:       controller-tools.k8s.io=1.0
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"kbatch.k8s.io/v1beta1","kind":"BatchBudget","metadata":{"annotations":{},"labels":{"controller-tools.k8s.io":"1.0"},"name"...
    API Version:  kbatch.k8s.io/v1beta1
    Kind:         BatchBudget
    Metadata:
      Creation Timestamp:  2019-09-11T23:57:10Z
      Finalizers:
        finalizers.kbatch.k8s.io/batchbudget
      Generation:        1
      Resource Version:  403104
      Self Link:         /apis/kbatch.k8s.io/v1beta1/batchbudgets/default
      UID:               de94325d-d4ef-11e9-a127-42010a8000d1
    Spec:
      Batch Cost Model Name:  default
      Budget Start Time:      2019-09-11T23:57:10Z
      Budget Windows:
        Amount:    100
        Duration:  24h0m0s
    Status:
      Last Updated:  2019-09-12T20:27:40Z
      Window Status List:
        Amount:      0.0003068580833333333
        Duration:    24h0m0s
        Start Time:  2019-09-11T23:57:10Z
    Events:          none
    

Como atualizar BatchBudgets

Para atualizar o BatchBudget, edite default_batchbudget.yaml e execute o seguinte comando:

kubectl apply -f default_batchbudget.yaml

Como excluir BatchBudgets

Para excluir um BatchBudget, execute o seguinte comando:

kubectl delete batchbudget default

A resposta é semelhante a:

batchbudget.kbatch.k8s.io "default" deleted

Verifique se o BatchBudget foi excluído executando:

kubectl get batchbudgets

A resposta é semelhante a:

No resources found.

A seguir