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 b
multiplicaria-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 = R
ImageName = 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
).