Partilhar via


Modelos de cluster

O Azure CycleCloud usa modelos para definir configurações de cluster. O CycleCloud inclui muitos modelos por padrão. Para obter uma lista completa dos modelos suportados, consulte GitHub. Você pode criar novos modelos ou personalizar os existentes. Por exemplo, pode personalizar um modelo existente para aproveitar as Spot VMs ou adicionar uma VPC para estender a sua própria rede.

Notação de configuração

Os modelos de cluster do Azure CycleCloud permitem adicionar uma ou mais secções de [[[configuração]]] a um nó ou a uma matriz de nós. Essas seções especificam as opções de configuração de software para os nós que o CycleCloud inicia. Use a notação pontilhada para especificar os atributos que você deseja configurar:

[[node scheduler]]
  [[[configuration]]]
  cycle_server.admin.name = poweruser
  cycle_server.admin.pass = super_secret
  cycle_server.http_port = 8080
  cycle_server.https_port = 8443

Você também pode usar prefix a notação para especificar uma seção de configuração e salvar a digitação. A mesma configuração também pode ser escrita como:

[[node scheduler]]
  [[[configuration cycle_server]]]
  admin.name = poweruser
  admin.pass = super_secret
  http_port = 8080
  https_port = 8443

Um nó ou uma matriz de nós também pode conter várias seções de configuração, se necessário.

[[node scheduler]]
  [[[configuration]]]
  run_list = role[sge_scheduler_node]

  [[[configuration cycle_server.admin]]]
  name = poweruser
  pass = super_secret

Parâmetros do modelo de cluster

Os modelos de cluster podem conter parâmetros que você usa para alterar os valores de determinadas partes de um cluster. Não é necessário modificar o modelo em si. Esse recurso é especialmente útil quando você deseja criar muitos clusters semelhantes com pequenas diferenças, como a implantação de ambientes de desenvolvimento e produção. Para especificar um parâmetro dentro de um modelo de cluster, prefixe uma variável com um '$'. Um exemplo de modelo básico (não funcional) com alguns parâmetros pode se parecer com:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

    [[[configuration]]]
    gridengine.slots = $slots

Este modelo define dois parâmetros: $machine_type e $slots. Com esse modelo, você pode criar arquivos de texto que contêm os valores para esses parâmetros nos ambientes dev e prod. Você pode usar o formato JSON ou o formato de arquivo de propriedades Java para o arquivo de parâmetros:

# dev-params.json
{
  "machine_type": "H16r",
  "slots": 2
}

# prod-params.properties
machine_type = Standard_D4v3
slots = 8

Este exemplo cria um arquivo JSON contendo os parâmetros para dev e um arquivo .properties contendo os valores para produção.

Observação

O sufixo do nome do arquivo para o seu arquivo de parâmetros é importante! Se você usa JSON, nomeie seu arquivo foo.json. Se você usar propriedades Java, finalize o nome do arquivo com .properties. Arquivos de parâmetros nomeados incorretamente não serão importados corretamente.

Agora você pode importar o modelo usando o arquivo de parâmetros para preencher as peças faltantes:

cyclecloud import_cluster gridengine-dev -f template.txt -p dev-params.json -c gridengine

cyclecloud import_cluster gridengine-prod -f template.txt -p prod-params.properties -c gridengine

Você também pode definir alguns ou todos os parâmetros dentro do próprio modelo de cluster:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

    [[[configuration]]]
    gridengine.slots = $slots

[parameters]
  [[parameter machine_type]]
  DefaultValue = Standard_D4v3

  [[parameter slots]]
  DefaultValue = 2

O modelo define valores padrão para cada parâmetro (usamos os valores dev como padrão).

Agora você pode importar o modelo sem um arquivo de parâmetros e os valores de desenvolvimento são usados automaticamente. Quando for o momento de criar um cluster prod, use o arquivo prod-params.properties para substituir os valores especificados dentro do próprio arquivo de modelo.

Observação

Os nomes dos parâmetros podem incluir letras, números e sublinhados.

As referências de parâmetros no modelo podem assumir uma de duas formas:

$param: Usa o valor de um único parâmetro chamado param.

${expr}: Avalia expr no contexto de todos os parâmetros, o que permite calcular valores dinâmicos. Por exemplo:

Attribute = ${(a > b ? a : b) * 100}

Esta expressão toma o maior de dois parâmetros, a e b, e multiplica-o por 100. A expressão é interpretada e avaliada de acordo com a especificação da linguagem ClassAd.

Se uma referência de parâmetro existir individualmente, o valor do parâmetro será usado, o que suporta tipos não string, como booleanos, inteiros e estruturas aninhadas, como listas. No entanto, se a referência estiver incorporada em outro texto, seu valor será convertido e incluído em uma cadeia de caracteres. Por exemplo, suponha que param é definido como 456 e referenciado em dois lugares:

  • Atributo1 = $param
  • Atributo2 = 123$param

O valor de Attribute1 é o número 456, mas o valor de Attribute2 é a cadeia de caracteres "123456". ${param} funciona da mesma forma que $paramo , para que você possa usá-lo para incluir referências de parâmetros em situações mais complexas:

  • Atributo3 = 123$param789
  • Atributo4 = 123${param}789

Attribute3 procura o parâmetro chamado param789, mas Attribute4 usa o valor de param para obter "123456789".

Tipos de máquinas

O Azure CycleCloud dá suporte a vários tipos de máquina por meio do MachineType atributo. A solução tenta obter capacidade na ordem que indicas.

Especificações de inicialização do cluster

O aplicativo Web Azure CycleCloud permite selecionar especificações de projeto de inicialização de cluster ao criar um novo cluster. Configure as especificações do projeto dentro do modelo de cluster:

[parameter ClusterInitSpecs]
Label = Cluster-Init
Description = Cluster init specs to apply to nodes
ParameterType = Cloud.ClusterInitSpecs

[cluster demo]

  [[node defaults]]
  AdditionalClusterInitSpecs = $ClusterInitSpecs

      [[[cluster-init myproject:myspec:1.0.0]]]

Depois de adicionar esse parâmetro ao seu modelo de cluster, você pode usar o seletor de arquivos para selecionar as especificações de projeto corretas ao criar um cluster.

Identificar máquinas virtuais

Para reduzir o custo de suas cargas de trabalho, defina Interruptible como true. Essa configuração sinaliza sua instância como uma máquina virtual spot e permite que ela use capacidade excedente quando disponível. Lembre-se de que essas instâncias nem sempre estão disponíveis e podem ser preemptadas a qualquer momento, portanto, podem não ser apropriadas para a sua carga de trabalho.

Por padrão, quando você define Interruptible como true, a instância usa máquinas virtuais spot com um preço máximo definido como -1. Essa configuração significa que a instância não é removida com base no preço. O preço para a instância é o preço atual para máquinas virtuais spot ou o preço para uma instância padrão, o que for menor, desde que haja capacidade e cota disponíveis. Para definir um preço máximo personalizado, use o atributo MaxPrice no nó ou na matriz de nós desejados.

[cluster demo]

  [[nodearray execute]]
  Interruptible = true
  MaxPrice = 0.2

Tabelas de pesquisa

Você pode ter um parâmetro de referência outro e calcular um determinado valor com uma tabela de pesquisa. Por exemplo, suponha que você tenha um parâmetro para a imagem a ser usada, com duas opções neste caso:

[[parameter MachineImage]]
    Label = Image
    DefaultValue = image-1000
    Description = Ubuntu 22.04
    Config.Plugin = pico.control.AutoCompleteDropdown
    [[[list Config.Entries]]]
        Name = image-1000
        Label = Ubuntu 20.04
    [[[list Config.Entries]]]
        Name = image-2000
            Label = Ubuntu 22.04

Você também pode obter a versão do sistema operacional da imagem escolhida e usá-la para outras configurações, tornando e um parâmetro cujo valor é uma tabela de pesquisa de valores:

[[parameter AmiLookup]]
  ParameterType = hidden
  [[[record DefaultValue]]]
      image-1000 = Ubuntu 20.04
      image-2000 = Ubuntu 22.04

Esse parâmetro está oculto, portanto, não aparece na interface do usuário.

Você pode obter a versão do sistema operacional usada para a imagem escolhida em qualquer outro lugar na definição do cluster:

[[node node]]
[[[configuration]]]
version = ${AmiLookup[MachineImage]}

Integração GUI

A definição de parâmetros dentro do modelo de cluster permite que você aproveite a GUI do Azure CycleCloud. Por exemplo, ao definir parâmetros, use os seguintes atributos para ajudar na criação da GUI:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

    [[[configuration]]]
    gridengine.slots = $slots

[parameters]
  [[parameter machine_type]]
  DefaultValue = Standard_D4v3
  Label = Machine Type
  Description = MachineType to use for the Grid Engine scheduler node
  ParameterType = Cloud.MachineType

  [[parameter slots]]
  DefaultValue = 2
  Description = The number of slots for Grid Engine to report for the node

A GUI inclui os atributos Label e Description , que aparecem na GUI, bem como o atributo opcional ParameterType . O atributo ParameterType permite que elementos personalizados da interface do usuário sejam exibidos. No exemplo anterior, o valor Cloud.MachineType exibe um menu suspenso contendo todos os tipos de máquinas disponíveis. Os outros valores ParameterType são:

Tipo de parâmetro Descrição
Cloud.MachineType Exibe uma lista suspensa contendo todos os tipos de máquinas disponíveis.
Credenciais da Nuvem Exibe uma lista suspensa contendo todas as credenciais disponíveis.
Nuvem.Região Exibe uma lista suspensa contendo todas as regiões disponíveis.

Imagens de usuário personalizadas em modelos

O Azure CycleCloud dá suporte a imagens personalizadas em modelos. Você pode especificar o ID da imagem (ID do recurso) diretamente com ImageId, ou pode adicionar a imagem ao registo da imagem. Ao adicionar a imagem ao registro, você pode fazer referência a ela com um ou ImageImageName no seu nó. A imagem aparece na lista suspensa de imagens na página de criação do cluster.

As imagens no registro de imagem consistem em um Package registro que identifica o conteúdo da imagem lógica e um ou mais registros correspondentes Artifact que especificam o ID real da imagem no provedor de nuvem apropriado. Por exemplo, uma imagem personalizada com R instalado nela pode consistir neste registro de pacote:

AdType = "Package"
Name = "r_execute"
Version = "2.1.1"
PackageType = "image"
Label = "R"

Ao adicionar esse registro, você pode especificar a imagem incluindo um Image = R ou ImageName = r_execute no modelo de cluster.

Se essa imagem existia como uma única máquina virtual no Leste dos EUA com uma ID de /subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/images/MyCustomImage, você precisará armazenar o seguinte artefato:

AdType = "Artifact"
Package = "r_execute"
Version = "2.1.1"
Name = "az/useast"
Provider = "az"
ImageId = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/images/MyCustomImage"

Você deve especificar Provider no artefato.

Você pode adicionar quantos artefatos quiser para um determinado pacote de imagens, mas deve incluir todos os artefatos necessários para usar essa imagem em todos os locais desejados (um por conta de provedor de nuvem, regiões, projetos e assim por diante). O nome do artefato não é importante, exceto que ele deve ser exclusivo para todos os artefatos de um determinado pacote e versão. Normalmente, recomendamos o uso de uma combinação do provedor e detalhes específicos do provedor, como a região. O CycleCloud escolhe automaticamente o artefato certo para corresponder ao provedor e a quaisquer detalhes específicos do provedor, mas usa o atributo Provider (e Region, e assim por diante) em vez de analisar o Name.

Se você adicionar mais de um pacote de imagem com o mesmo nome, cada pacote deverá ter um número de versão diferente. Quando você inicia uma instância, o CycleCloud seleciona automaticamente a imagem com o número de versão mais alto. Ele trata o número da versão como uma cadeia de caracteres pontilhada e compara cada parte como um número. Para substituir esse comportamento, especifique ImageVersion no nó como um número de versão literal (por exemplo, 1.2) ou um número de versão curinga (por exemplo, 1.x).