Plantillas de clúster

Azure CycleCloud usa plantillas para definir configuraciones de clúster. Una serie de plantillas se incluyen en CycleCloud de forma predeterminada y hay disponible una lista completa de plantillas admitidas en GitHub. Puede crear nuevas plantillas o personalizar las existentes. Por ejemplo, puede que desee personalizar una plantilla existente para aprovechar las ventajas de las máquinas virtuales de Spot, o puede que quiera agregar una VPC para ampliar su propia red.

Notación de configuración

Todas las plantillas de clúster de Azure CycleCloud tienen la opción de tener una o varias secciones [[[[configuration]]] que pertenecen a un nodo o a nodearray. En estas secciones se especifican opciones de configuración de software sobre los nodos que inicia CycleCloud. La notación de puntos se usa para especificar los atributos que desea 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

También puede especificar una sección de configuración mediante prefix notación para guardar la escritura. La misma configuración también se puede escribir como:

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

Una matriz de nodos o nodos también puede contener varias secciones de configuración si es necesario:

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

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

Parámetros de plantilla de clúster

Las plantillas de clúster pueden contener parámetros que modifican los valores de determinadas partes de un clúster sin tener que modificar la propia plantilla. Esto es especialmente útil en los casos en los que se desean muchos clústeres similares con pequeñas diferencias, como la implementación de entornos de desarrollo y producción. La sintaxis para especificar un parámetro dentro de una plantilla de clúster es prefijar una variable con un valor "$". Un ejemplo de plantilla básica (no funcional) con algunos parámetros podría tener el siguiente aspecto:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

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

Esta plantilla define dos parámetros: $machine_type y $slots. Con esta plantilla, puede definir archivos de texto que contengan los valores de los parámetros en los entornos de desarrollo y producción. El archivo de parámetros puede estar en formato JSON o en un formato de archivo de propiedades de Java:

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

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

Esto creará un archivo JSON que contiene los parámetros para desarrollo y un archivo .properties que contiene los valores de producción.

Nota

El sufijo de nombre de archivo del archivo de parámetros es importante. Si usa JSON, el archivo debe denominarse foo.json. Si usa propiedades de Java, el archivo debe terminar con .properties. Los archivos de parámetros con nombre incorrecto no se importarán correctamente.

Ahora puede importar la plantilla mediante el archivo de parámetros para rellenar las partes que faltan:

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

También es posible definir algunos o todos los parámetros dentro de la propia plantilla de clúster:

# template.txt
[cluster gridengine]

  [[node scheduler]]
  MachineType = $machine_type

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

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

  [[parameter slots]]
  DefaultValue = 2

Los valores predeterminados de cada parámetro se definen dentro de la plantilla (usamos los valores "dev" como valores predeterminados).

Ahora es posible importar la plantilla sin un archivo de parámetros y los valores de "desarrollo" se usarán automáticamente. Cuando es el momento de crear un clúster "prod", puede usar el archivo prod-params.properties para sobrescribir los valores especificados dentro del propio archivo de plantilla.

Nota

Los nombres de parámetro pueden incluir letras, números y caracteres de subrayado.

Las referencias de parámetros de la plantilla pueden adoptar una de estas dos formas:

$param: usa el valor de un único parámetro denominado . param

${expr}: se expr evalúa en el contexto de todos los parámetros, lo que le permite calcular valores dinámicos. Por ejemplo:

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

Esto tomaría el mayor de dos parámetros, a y b, y lo multiplicaría por 100. La expresión se interpreta y evalúa según la especificación del lenguaje ClassAd.

Si existe una referencia de parámetro por sí misma, se usa el valor del parámetro , que admite tipos que no son de cadena, como booleanos, enteros y estructuras anidadas, como listas. Sin embargo, si la referencia está incrustada en otro texto, su valor se convierte e incluye en una cadena. Por ejemplo, supongamos que param se define como 456 y se hace referencia a ella en dos lugares:

  • Attribute1 = $param
  • Attribute2 = 123$param

El valor de Attribute1 sería el número 456, pero el valor de Attribute2 sería la cadena "123456". Tenga en cuenta que ${param} es idéntico a $param, que permite insertar referencias de parámetros en situaciones más complejas:

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

Attribute3 buscaría el parámetro denominado param789, pero Attribute4 usaría el valor de param para obtener "123456789".

Tipos de máquina

Azure CycleCloud admite varios tipos de máquina mediante el MachineType atributo . Intentará adquirir capacidad en el orden indicado.

Especificaciones de inicialización de clúster

La aplicación web de Azure CycleCloud permite a los usuarios seleccionar las especificaciones del proyecto cluster-init al crear un nuevo clúster. Las especificaciones del proyecto se configuran dentro de la plantilla de clúster:

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

Una vez agregado este parámetro a la plantilla de clúster, el usuario puede usar el selector de archivos para seleccionar las especificaciones de proyecto adecuadas al crear un nuevo clúster.

Máquinas virtuales de acceso puntual

Para reducir el costo de las cargas de trabajo, puede establecer Interruptible = true. Esto marcará la instancia como Spot y usará capacidad sobrante cuando esté disponible. Es importante tener en cuenta que estas instancias no siempre están disponibles y se pueden adelantar en cualquier momento, lo que significa que no siempre son adecuadas para la carga de trabajo.

De forma predeterminada, si se establece Interruptible en true, se usarán instancias de spot con un precio máximo establecido en -1; esto significa que la instancia no se expulsará en función del precio. El precio de la instancia será el actual de Spot o el de una instancia estándar, el menor de los dos, siempre que haya capacidad y cuota disponibles. Si desea establecer un precio máximo personalizado, use el MaxPrice atributo en el nodo deseado o nodearray.

[cluster demo]

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

Tablas de búsqueda

Puede tener una referencia de parámetro a otra y calcular un valor determinado con una tabla de búsqueda. Por ejemplo, supongamos que tiene un parámetro para que la imagen la use, con dos opciones en este 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

También puede obtener la versión del sistema operativo de la imagen elegida y usarla para otra configuración si crea un parámetro cuyo valor es una tabla de búsqueda de valores:

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

Tenga en cuenta que esto está oculto, para que no aparezca en la interfaz de usuario.

Puede obtener la versión del sistema operativo usada para la imagen elegida en cualquier otro lugar de la definición del clúster:

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

Integración de GUI

La definición de parámetros dentro de la plantilla de clúster permite aprovechar las ventajas de la GUI de Azure CycleCloud. Por ejemplo, al definir parámetros, se pueden usar los atributos siguientes para ayudar en la creación de la 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

Los atributos "Label" y "Description" se incluyen, que aparecerán en la GUI, así como en el atributo opcional "ParameterType". El parámetro "ParameterType" permite mostrar elementos de interfaz de usuario personalizados. En el ejemplo anterior, el valor "Cloud.MachineType" mostrará una lista desplegable que contiene todos los tipos de máquina disponibles. Los demás valores ParameterType son:

Tipo de parámetro Descripción
Cloud.MachineType Muestra una lista desplegable que contiene todos los tipos de máquina disponibles.
Cloud.Credentials Muestra una lista desplegable que contiene todas las credenciales disponibles.
Cloud.Region Muestra una lista desplegable que contiene todas las regiones disponibles.

Compatibilidad con chef Server

Azure CycleCloud suporta ChefServer.

Cree el archivo chefserver.json y agregue sus credenciales. ValidationKey corresponde al archivo validation.pem del servidor chef. También debe demostrar si validation_client_name lo ha cambiado del valor predeterminado de "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
}

A continuación, coloque el archivo en el directorio /opt/cycle_server/config/data. Se importará automáticamente.

Imágenes de usuario personalizadas en plantillas

Azure CycleCloud admite imágenes personalizadas en plantillas. Especifique el identificador de imagen (id. de recurso) directamente con ImageIdo agregue la imagen al registro de imágenes. Cuando la imagen se encuentra en el Registro, haga referencia a ella con Image o ImageName en el nodo. Aparecerá en la lista desplegable de imágenes de la página de creación del clúster.

Las imágenes del registro de imágenes constan de un Package registro que identifica el contenido de la imagen lógica y uno o varios registros correspondientes Artifact que especifican el identificador de imagen real en el proveedor de nube adecuado. Por ejemplo, una imagen personalizada con R instalada en él podría constar de este registro de paquete:

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

Una vez que agregue ese registro, puede especificar esa imagen incluyendo Image = R o ImageName = r_execute en la plantilla de clúster.

Si esta imagen existía como una sola máquina virtual en useast con un identificador de /subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/images/MyCustomImage, tendría que tener almacenado el siguiente artefacto:

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"

Debe especificar Provider en el artefacto.

Puede agregar tantos artefactos como desee para un paquete de imagen determinado, pero debe incluir todos los artefactos necesarios para usar esa imagen en todas las "ubicaciones" que desee (una por cuenta de proveedor de nube, regiones, proyectos, etc.). El nombre del artefacto no es importante, excepto que debe ser único para todos los artefactos de un paquete y una versión determinado. Normalmente se recomienda usar una combinación de los detalles específicos del proveedor y del proveedor (por ejemplo, región). CycleCloud selecciona automáticamente el artefacto adecuado para que coincida con el proveedor y los detalles específicos del proveedor, pero usa el atributo Provider (y Region, etc.) en lugar de analizar el nombre.

Si agrega más de un paquete de imágenes con el mismo nombre, deben tener números de versión diferentes. Al iniciar una instancia, CycleCloud seleccionará automáticamente la imagen con el número de versión más alto, tratando el número de versión como una cadena de puntos y comparando cada parte como un número. Para invalidar esto, especifique ImageVersion en el nodo, como un literal (por ejemplo 1.2, ) o un carácter comodín (1.x).