Modelos de cluster

Azure CycleCloud utiliza modelos para definir configurações de cluster. Vários modelos estão incluídos no CycleCloud por padrão e uma lista completa de modelos suportados está disponível no GitHub. Pode criar novos modelos ou personalizar os existentes. Por exemplo, pode querer personalizar um modelo existente para tirar partido dos VMs spot, ou talvez queira adicionar um VPC para alargar a sua própria rede.

Notação de configuração

Os modelos de cluster Azure CycleCloud têm a opção de ter uma ou mais secções [[configuração]] que pertencem a um nó ou nodearray. Estas secções especificam opções de configuração de software sobre os nós que estão a ser iniciados pelo CycleCloud. A notação pontilhada é usada para especificar os atributos que 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

Também pode especificar uma secção de configuração utilizando prefix a notação para salvar a dactilografia. 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ó/nó dedearray também pode conter várias secçõ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 alteram os valores de certas partes de um cluster sem ter que modificar o próprio modelo. Isto é particularmente útil nos casos em que são desejados muitos aglomerados semelhantes com pequenas diferenças, tais como a implantação de ambientes de desenvolvimento e de produção. A sintaxe para especificar um parâmetro dentro de um modelo de cluster é prefixar uma variável com um '$'. Um exemplo básico do modelo (não funcional) com alguns parâmetros pode parecer:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

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

Este modelo define dois parâmetros: $machine_type e $slots. Utilizando este modelo, pode definir ficheiros de texto que contenham os valores dos parâmetros tanto nos ambientes dev como em prod. O ficheiro de parâmetros pode estar no formato JSON ou num formato de ficheiro de propriedades Java:

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

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

Isto criará um ficheiro JSON contendo os parâmetros para dev e um ficheiro .properties contendo os valores de produção.

Nota

O sufixo de nome de ficheiro para o seu ficheiro de parâmetros é importante! Se utilizar o JSON, o seu ficheiro deve ser nomeado foo.json. Se utilizar propriedades Java, o seu ficheiro deve terminar com .properties. Os ficheiros de parâmetros mal nomeados não importarão corretamente.

Agora pode importar o modelo utilizando o ficheiro de parâmetros para preencher as peças em falta:

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

Também é possível 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

Os valores predefinidos para cada parâmetro são definidos dentro do modelo (usamos os valores 'dev' como padrão).

Agora é possível importar o modelo sem um ficheiro de parâmetros, e os valores 'dev' serão usados automaticamente. Quando for a hora de criar um cluster 'prod', pode utilizar o ficheiro prod-params.properties para substituir os valores especificados dentro do próprio ficheiro do modelo.

Nota

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

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

$param: Utiliza o valor de um único parâmetro nomeado 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}

Isto levaria o maior de dois parâmetros, a e bmultiplicaria-o por 100. A expressão é interpretada e avaliada de acordo com a especificação linguística classAd.

Se uma referência de parâmetro existir por si só, o valor do parâmetro é usado, que suporta tipos não-cordas como booleans, inteiros e estruturas aninhadas, tais como listas. No entanto, se a referência estiver incorporada noutro texto, o seu valor é convertido e incluído numa cadeia. Por exemplo, suponha que param seja definido como 456 e referenciado em dois lugares:

  • Atributo1 = $param
  • Atributo2 = 123$param

O valor de Attribute1 seria o número 456, mas o valor de Attribute2 ser a cadeia "123456". Note que ${param} é idêntico a $param, o que permite incorporar referências de parâmetros em situações mais complexas:

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

Attribute3 procuraria o parâmetro nomeado param789, mas o Attribute4 usaria o valor de param obter "123456789".

Tipos de Máquinas

O Azure CycleCloud suporta vários tipos de máquinas através do MachineType atributo. Tentará adquirir capacidade na ordem listada.

Especificações init cluster

A aplicação web Azure CycleCloud permite que os utilizadores selecionem especificações de projeto de cluster-init ao criar um novo cluster. As especificações do projeto são configuras 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]]]

Uma vez adicionado este parâmetro ao seu modelo de cluster, o seu utilizador pode utilizar o selecionador de ficheiros para selecionar as especificações de projeto apropriadas ao criar um novo cluster.

Spot Máquinas Virtuais

Para reduzir o custo das suas cargas de trabalho, pode definir Interruptible = true. Isto irá sinalizar o seu caso como Spot, e usará a capacidade excedentária quando disponível. É importante notar que estas situações nem sempre estão disponíveis e podem ser antecipadas a qualquer momento, o que significa que nem sempre são apropriadas para a sua carga de trabalho.

Por padrão, a definição Interruptible para verdade utilizará instâncias pontuais com um preço máximo definido para -1; isto significa que a instância não será despejada com base no preço. O preço, por exemplo, será o preço atual para o Spot ou o preço para uma instância padrão, o que for menor, desde que haja capacidade e quota disponíveis. Se desejar definir um preço máximo personalizado, use o MaxPrice atributo no nó ou node desejado.

[cluster demo]

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

Mesas de procura

Pode ter uma referência de parâmetro e calcular um determinado valor com uma tabela de procura. Por exemplo, suponha que tenha um parâmetro para a imagem usar, 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

Também pode obter a versão EM da imagem escolhida e usá-la para outra configuração, fazendo e um parâmetro cujo valor é uma tabela de valores de procura:

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

Note que isto está escondido, para que não apareça na UI.

Pode obter a versão SO usada para a imagem escolhida em qualquer outro lugar na definição de cluster:

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

Integração gui

Definir parâmetros dentro do modelo de cluster permite tirar partido do Azure CycleCloud GUI. Como exemplo, ao definir parâmetros, os seguintes atributos podem ser utilizados para ajudar na criação do 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

Os atributos "Etiqueta" e "Descrição" estão incluídos que aparecerão no GUI, bem como no atributo opcional "ParâmetroType". O "ParâmetroType" permite visualizar elementos de UI personalizados. No exemplo acima do valor "Cloud.MachineType" apresentará um dropdown contendo todos os tipos de máquinas disponíveis. Os outros valores de ParâmetroType são:

Tipo de parâmetro Description
Cloud.MachineType Apresenta um dropdown contendo todos os tipos de máquinas disponíveis.
Cloud.Credenciais Apresenta uma queda contendo todas as credenciais disponíveis.
Nuvem.Região Apresenta um dropdown contendo todas as regiões disponíveis.

Suporte ao servidor do chef

Azure CycleCloud suports ChefServer.

Crie o ficheiro chefserver.json e adicione as suas credenciais. ValidationKey corresponde ao ficheiro validação.pem para o seu servidor de chef. Você também deve provar o validation_client_name se você mudou-lo do valor padrão de "chef-validador":

{
"AdType" : "Cloud.Locker",
"ValidationKey" : "YOURVALIDATION.PEMHERE",
"ValidationClientName" : "chef-validator",
"Credentials" : "default",
"Location" : "https://mychefserver",
"ChefRepoType" : "chefserver",
"LockerType" : "chefrepo",
"Name" : "chefrepo",
"AccountId" : "default",
"Shared" : false
}

Em seguida, coloque o arquivo no diretório /opt/cycle_server/config/data. Será importado automaticamente.

Imagens personalizadas do utilizador em modelos

Azure CycleCloud suporta imagens personalizadas em modelos. Especifique o ID de imagem (ID de recurso) diretamente com ImageId, ou adicione a imagem ao registo de imagem. Quando a imagem estiver no registo, refira-a com um Image ou ImageName no nó. Aparecerá na queda de imagem na página de criação de cluster.

As imagens no registo de imagem consistem num Package registo que identifica o conteúdo da imagem lógica e um ou mais registos correspondentes Artifact que especificam o id de imagem real no provedor de nuvem apropriado. Por exemplo, uma imagem personalizada com R instalada nele pode consistir neste registo pacote:

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

Uma vez que adicione esse registo, pode especificar essa imagem incluindo ou Image = RImageName = r_execute no modelo de cluster.

Se esta imagem existisse como uma única Máquina Virtual em uso com um id de /subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/images/MyCustomImage, teria de ter o seguinte artefacto armazenado:

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"

Tem de especificar Provider o artefacto.

Pode adicionar tantos artefactos quanto quiser para um determinado pacote de imagem, mas deve incluir todos os artefactos necessários para usar essa imagem em todos os "locais" que quiser (uma conta por fornecedor de nuvem, regiões, projetos, etc). O nome do artefacto não é importante, exceto que deve ser exclusivo de todos os artefactos para um determinado pacote e versão. Recomenda-se normalmente a combinação do fornecedor e detalhes específicos do fornecedor (por exemplo, região). O CycleCloud escolhe automaticamente o artefacto certo para combinar com o fornecedor e quaisquer detalhes específicos do fornecedor, mas utiliza o atributo Provider (e Região, etc) em vez de analisar o Nome.

Se adicionar mais de um pacote de imagem com o mesmo nome, eles devem ter números de versão diferentes. Ao iniciar uma instância, o CycleCloud escolherá automaticamente a imagem com o número de versão mais elevado, tratando o número da versão como uma corda pontilhada e comparando cada peça como um número. Para anular isto, especifique ImageVersion no nó, como um literal (por exemplo 1.2) ou um wildcard (1.x).