Klustermallar

Azure CycleCloud använder mallar för att definiera klusterkonfigurationer. Ett antal mallar ingår som standard i CycleCloud och en fullständig lista över mallar som stöds finns i GitHub. Du kan skapa nya mallar eller anpassa befintliga mallar. Du kanske till exempel vill anpassa en befintlig mall för att dra nytta av virtuella datorer med oanvänd kapacitet, eller så kanske du vill lägga till en VPC för att utöka ditt eget nätverk.

Konfigurationsnotation

Azure CycleCloud-klustermallar har alla möjlighet att ha ett eller flera [[[configuration]]] avsnitt som tillhör en nod eller nodmatris. De här avsnitten anger alternativ för programvarukonfiguration om noderna som startas av CycleCloud. Prickad notation används för att ange de attribut som du vill konfigurera:

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

Du kan också ange ett konfigurationsavsnitt med notation prefix för att spara inmatningen. Samma konfiguration kan också skrivas som:

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

En nod/nodmatris kan också innehålla flera konfigurationsavsnitt om det behövs:

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

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

Parametrar för klustermall

Klustermallar kan innehålla parametrar som ändrar värdena för vissa delar av ett kluster utan att du behöver ändra själva mallen. Detta är särskilt användbart i fall där många liknande kluster med mindre skillnader önskas, till exempel distribution av utvecklings- och produktionsmiljöer. Syntaxen för att ange en parameter i en klustermall är att prefixet en variabel med "$". Ett grundläggande mallexempel (icke-funktionellt) med vissa parametrar kan se ut så här:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

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

Den här mallen definierar två parametrar: $machine_type och $slots. Med den här mallen kan du definiera textfiler som innehåller parametrarnas värden i både utvecklings- och prod-miljöerna. Parameterfilen kan vara i JSON-format eller ett Java-egenskapsfilformat:

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

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

Då skapas en JSON-fil som innehåller parametrarna för utveckling och en .properties-fil som innehåller värdena för produktion.

Anteckning

Filnamnssuffixet för parameterfilen är viktigt! Om du använder JSON måste filen ha namnet foo.json. Om du använder Java-egenskaper måste filen sluta med .properties. Felaktigt namngivna parameterfiler importeras inte korrekt.

Nu kan du importera mallen med parameterfilen för att fylla i de saknade delarna:

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

Det är också möjligt att definiera vissa eller alla parametrar i själva klustermallen:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

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

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

  [[parameter slots]]
  DefaultValue = 2

Standardvärdena för varje parameter definieras i mallen (vi använde "dev"-värdena som standardvärden).

Nu är det möjligt att importera mallen utan en parameterfil, och "dev"-värdena används automatiskt. När det är dags att skapa ett prod-kluster kan du använda filen prod-params.properties för att skriva över de värden som anges i själva mallfilen.

Anteckning

Parameternamn kan innehålla bokstäver, siffror och understreck.

Parameterreferenser i mallen kan ha ett av två former:

$param: Använder värdet för en enskild parameter med namnet param

${expr}: Utvärderas expr i kontexten för alla parametrar, vilket gör att du kan beräkna dynamiska värden. Ett exempel:

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

Detta skulle ta det större av två parametrar, a och b, och multiplicera det med 100. Uttrycket tolkas och utvärderas enligt språkspecifikationen ClassAd.

Om det finns en parameterreferens används värdet för parametern, som stöder icke-strängtyper som booleska värden, heltal och kapslade strukturer, till exempel listor. Men om referensen är inbäddad i annan text konverteras dess värde och inkluderas i en sträng. Anta till exempel param att definieras som 456 och refereras på två platser:

  • Attribute1 = $param
  • Attribute2 = 123$param

Värdet Attribute1 för skulle vara talet 456, men värdet Attribute2 för skulle vara strängen "123456". Observera att ${param} är identiskt med $param, vilket gör att du kan bädda in parameterreferenser i mer komplexa situationer:

  • Attribute3 = 123$param789
  • Attribute4 = 123${param}789

Attribute3 skulle leta efter parametern med namnet param789, men Attribute4 skulle använda värdet param för för att hämta "123456789".

Datortyper

Azure CycleCloud stöder flera datortyper via attributet MachineType . Den försöker hämta kapacitet i den ordning som anges.

Init-specifikationer för kluster

Med Azure CycleCloud-webbappen kan användarna välja projektspecifikationer för cluster-init när de skapar ett nytt kluster. Projektspecifikationerna konfigureras i klustermallen:

[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]]]

När den här parametern har lagts till i klustermallen kan användaren använda filväljaren för att välja lämpliga projektspecifikationer när ett nytt kluster skapas.

Spot Virtual Machines

Om du vill minska kostnaden för dina arbetsbelastningar kan du ange Interruptible = true. Detta flaggar din instans som Spot och använder överskottskapacitet när den är tillgänglig. Observera att dessa instanser inte alltid är tillgängliga och kan förhindras när som helst, vilket innebär att de inte alltid är lämpliga för din arbetsbelastning.

Som standard använder inställningen Interruptible true spot-instanser med ett högsta pris inställt på -1. Det innebär att instansen inte tas bort baserat på pris. Priset för instansen är det aktuella priset för Spot eller priset för en standardinstans, beroende på vilket som är mindre, så länge det finns tillgänglig kapacitet och kvot. Om du vill ange ett anpassat maxpris använder du MaxPrice attributet på önskad nod eller nodmatris.

[cluster demo]

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

Uppslagstabeller

Du kan ha en parameterreferens till en annan och beräkna ett visst värde med en uppslagstabell. Anta till exempel att du har en parameter för avbildningen som ska användas, med två alternativ i det här fallet:

[[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

Du kan också hämta OS-versionen av den valda avbildningen och använda den för annan konfiguration genom att skapa en parameter vars värde är en uppslagstabell med värden:

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

Observera att detta är dolt så att det inte visas i användargränssnittet.

Du kan hämta os-versionen som används för den valda avbildningen någon annanstans i klusterdefinitionen:

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

GUI-integrering

Genom att definiera parametrar i klustermallen kan du dra nytta av Gränssnittet för Azure CycleCloud. När du till exempel definierar parametrar kan följande attribut användas för att hjälpa dig att skapa ett grafiskt användargränssnitt:

# 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

Attributen "Etikett" och "Beskrivning" ingår som visas i det grafiska användargränssnittet samt det valfria attributet "ParameterType". Med ParameterType kan anpassade gränssnittselement visas. I exemplet ovan visar värdet "Cloud.MachineType" en listruta som innehåller alla tillgängliga datortyper. De andra ParameterType-värdena är:

Parametertyp Description
Cloud.MachineType Visar en listruta som innehåller alla tillgängliga datortyper.
Cloud.Credentials Visar en listruta som innehåller alla tillgängliga autentiseringsuppgifter.
Cloud.Region Visar en listruta som innehåller alla tillgängliga regioner.

Chef Server-stöd

Azure CycleCloud suports ChefServer.

Skapa filen chefserver.json och lägg till dina autentiseringsuppgifter. ValidationKey motsvarar filen validation.pem för chef-servern. Du måste också bevisa validation_client_name om du har ändrat det från standardvärdet "chef-validator":

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

Placera sedan filen i katalogen /opt/cycle_server/config/data. Den importeras automatiskt.

Anpassade användarbilder i mallar

Azure CycleCloud stöder anpassade avbildningar i mallar. Ange avbildnings-ID :t (resurs-ID) direkt med ImageIdeller lägg till avbildningen i avbildningsregistret. När avbildningen finns i registret refererar du till den med antingen Image eller ImageName på noden. Den visas i listrutan för avbildningen på sidan för att skapa klustret.

Avbildningar i avbildningsregistret består av en Package post som identifierar innehållet i den logiska avbildningen och en eller flera motsvarande Artifact poster som anger det faktiska avbildnings-ID:t i lämplig molnleverantör. En anpassad avbildning med R installerad på den kan till exempel bestå av den här paketposten:

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

När du lägger till den posten kan du ange avbildningen genom att inkludera antingen Image = R eller ImageName = r_execute i klustermallen.

Om den här avbildningen /subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/images/MyCustomImagefanns som en enda virtuell dator i bruk med ID:t måste följande artefakt lagras:

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"

Du måste ange Provider artefakten.

Du kan lägga till så många artefakter som du vill för ett visst avbildningspaket, men du måste inkludera alla artefakter som krävs för att använda avbildningen på alla "platser" du vill ha (ett per molnleverantörskonto, regioner, projekt osv.). Artefaktens namn är inte viktigt, förutom att den måste vara unik för alla artefakter för ett visst paket och en viss version. Vi rekommenderar vanligtvis att du använder en kombination av providern och providerspecifik information (t.ex. region). CycleCloud väljer automatiskt rätt artefakt för att matcha providern och eventuell providerspecifik information, men använder providerattributet (och region osv.) i stället för att parsa namnet.

Om du lägger till fler än ett avbildningspaket med samma namn måste de ha olika versionsnummer. När du startar en instans väljer CycleCloud automatiskt bilden med det högsta versionsnumret genom att behandla versionsnumret som en prickad sträng och jämföra varje del som ett tal. Om du vill åsidosätta detta anger du ImageVersion på noden som antingen en literal (t.ex 1.2. ) eller ett jokertecken (1.x).