Containertoepassingen uitvoeren op Azure Batch
Azure Batch kunt u grote aantallen batch-computingtaken uitvoeren en schalen in Azure. Batchtaken kunnen rechtstreeks worden uitgevoerd op virtuele machines (knooppunten) in een Batch-pool, maar u kunt ook een Batch-pool instellen om taken uit te voeren in met Docker compatibele containers op de knooppunten. In dit artikel wordt beschreven hoe u een pool met rekenknooppunten maakt die ondersteuning bieden voor het uitvoeren van containertaken, en hoe u vervolgens containertaken uitvoert in de pool.
In de codevoorbeelden hier worden de Batch .NET- en Python-SDK's gebruikt. U kunt ook andere Batch-SDK's en -hulpprogramma's, waaronder de Azure Portal, gebruiken om Batch-pools met container ingeschakeld te maken en containertaken uit te voeren.
Redenen om containers te gebruiken
Het gebruik van containers biedt een eenvoudige manier om Batch-taken uit te voeren zonder dat u een omgeving en afhankelijkheden voor het uitvoeren van toepassingen moet beheren. Containers implementeren toepassingen als lichtgewicht, draagbare, zelfvoorzienende eenheden die in verschillende omgevingen kunnen worden uitgevoerd. U kunt bijvoorbeeld een container lokaal bouwen en testen en vervolgens de containerafbeelding uploaden naar een register in Azure of ergens anders. Het containerimplementatiemodel zorgt ervoor dat de runtime-omgeving van uw toepassing altijd correct wordt geïnstalleerd en geconfigureerd, waar u de toepassing ook host. Op containers gebaseerde taken in Batch kunnen ook profiteren van functies van niet-containertaken, waaronder toepassingspakketten en beheer van resourcebestanden en uitvoerbestanden.
Vereisten
U moet bekend zijn met containerconcepten en hoe u een Batch-pool en -taak maakt.
SDK-versies: de Batch-SDK's ondersteunen containerafbeeldingen vanaf de volgende versies:
- Batch REST API versie 2017-09-01.6.0
- Batch .NET SDK versie 8.0.0
- Batch Python SDK versie 4.0
- Batch Java SDK versie 3.0
- Batch Node.js SDK versie 3.0
Accounts: in uw Azure-abonnement moet u een Batch-account maken en optioneel een Azure Storage account.
Een ondersteunde VM-installatielijst: containers worden alleen ondersteund in pools die zijn gemaakt met de configuratie van de virtuele machine, op basis van een ondersteunde installatielijst (weergegeven in de volgende sectie). Als u een aangepaste afbeelding op geeft, bekijkt u de overwegingen in de volgende sectie en de vereisten in Een beheerde aangepaste afbeelding gebruiken om een pool met virtuele machines te maken.
Houd rekening met de volgende beperkingen:
- Batch biedt alleen RDMA-ondersteuning voor containers die worden uitgevoerd in Linux-pools.
- Voor Windows containerworkloads wordt u aangeraden een VM-grootte met meerdere kernen voor uw pool te kiezen.
Ondersteunde virtuele-machine-afbeeldingen
Gebruik een van de volgende ondersteunde Windows of Linux-afbeeldingen om een pool met VM-rekenknooppunten te maken voor containerworkloads. Zie Lijst met virtuele-machine-afbeeldingenvoor meer informatie over Marketplace-afbeeldingen die compatibel zijn met Batch.
Windows ondersteuning
Batch ondersteunt Windows serverafbeeldingen met containerondersteuningsaanduidingen. Normaal gesproken worden deze SKU-namen voor de afbeelding achtervoegsel of -with-containers -with-containers-smalldisk . Daarnaast geeft de API om alle ondersteunde afbeeldingen in Batch weer te geven een mogelijkheid als de DockerCompatible afbeelding Docker-containers ondersteunt.
U kunt ook aangepaste afbeeldingen maken van VM's met Docker op Windows.
Linux Support
Voor Linux-containerworkloads ondersteunt Batch momenteel de volgende Linux-afbeeldingen die zijn gepubliceerd door Microsoft Azure Batch in de Azure Marketplace zonder dat er een aangepaste afbeelding nodig is.
VM-grootten zonder RDMA
- Publisher:
microsoft-azure-batch- Bieden:
centos-container - Bieden:
ubuntu-server-container
- Bieden:
VM-grootten met RDMA
- Publisher:
microsoft-azure-batch- Bieden:
centos-container-rdma - Bieden:
ubuntu-server-container-rdma
- Bieden:
Deze afbeeldingen worden alleen ondersteund voor gebruik in Azure Batch-pools en zijn gericht op het uitvoeren van Docker-containers. Ze hebben de volgende functies:
- Een vooraf geïnstalleerde, met Docker compatibele Moby-containerruntime
- Vooraf geïnstalleerde NVIDIA GPU-stuurprogramma's en NVIDIA-containerruntime om de implementatie op virtuele azure-VM's uit de N-serie te stroomlijnen
- VM-afbeeldingen met het achtervoegsel '-rdma' zijn vooraf geconfigureerd met ondersteuning voor VM-grootten van InfiniBand RDMA. Deze VM-afbeeldingen mogen niet worden gebruikt met VM-grootten die geen Ondersteuning voor InfiniBand hebben.
U kunt ook aangepaste afbeeldingen maken van VM's met Docker op een van de Linux-distributies die compatibel is met Batch. Als u ervoor kiest om uw eigen aangepaste Linux-afbeelding op te geven, bekijkt u de instructies in Een beheerde aangepaste afbeelding gebruiken om een pool met virtuele machines te maken.
Installeer Docker Community Edition (CE) of Docker Enterprise Edition (EE) voor Docker-ondersteuning.
Aanvullende overwegingen voor het gebruik van een aangepaste Linux-afbeelding:
- Installeer vooraf NVIDIA-stuurprogramma's om te profiteren van de GPU-prestaties van Azure N-serie-grootten bij het gebruik van een aangepaste installatie afbeelding. U moet ook het hulpprogramma Docker Engine installeren voor NVIDIA GPU's, NVIDIA Docker.
- Gebruik een VM-grootte die geschikt is voor RDMA om toegang te krijgen tot het Azure RDMA-netwerk. De benodigde RDMA-stuurprogramma's worden geïnstalleerd in de CentOS HPC- en Ubuntu-installatie afbeeldingen die worden ondersteund door Batch. Er is mogelijk aanvullende configuratie nodig om MPI-workloads uit te voeren. Zie Use RDMA-capable or GPU-enabled instances in Batch pool (Instanties met RDMA of GPU gebruiken in Batch-pool).
Containerconfiguratie voor Batch-pool
Als u een Batch-pool wilt inschakelen om containerworkloads uit te voeren, moet u ContainerConfiguration-instellingen opgeven in het virtualMachineConfiguration-object van de pool. (Dit artikel bevat koppelingen naar de Batch .NET API-verwijzing. Bijbehorende instellingen zijn in de Batch Python-API.)
U kunt een pool met container maken met of zonder vooraf opgeslagen containerafbeeldingen, zoals wordt weergegeven in de volgende voorbeelden. Met het pull-proces (of prefetch) kunt u containerafbeeldingen vooraf laden vanuit een Docker Hub of een ander containerregister op internet. Gebruik voor de beste prestaties een Azure-containerregister in dezelfde regio als het Batch-account.
Het voordeel van het vooraf opsnurken van containerafbeeldingen is dat wanneer taken voor het eerst worden uitgevoerd, ze niet hoeven te wachten tot de containerafbeelding is gedownload. De containerconfiguratie haalt containerafbeeldingen op naar de VM's wanneer de pool wordt gemaakt. Taken die in de pool worden uitgevoerd, kunnen vervolgens verwijzen naar de lijst met containerafbeeldingen en opties voor containerruns.
Pool zonder vooraf geëtstige containerafbeeldingen
Als u een pool met container wilt configureren zonder vooraf gefeteerde containerafbeeldingen, definieert u - en ContainerConfiguration VirtualMachineConfiguration -objecten, zoals wordt weergegeven in de volgende voorbeelden. In deze voorbeelden wordt de Ubuntu-server gebruikt voor Azure Batch containerpools van Marketplace.
image_ref_to_use = batch.models.ImageReference(
publisher='microsoft-azure-batch',
offer='ubuntu-server-container',
sku='16-04-lts',
version='latest')
"""
Specify container configuration. This is required even though there are no prefetched images.
"""
container_conf = batch.models.ContainerConfiguration()
new_pool = batch.models.PoolAddParameter(
id=pool_id,
virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
image_reference=image_ref_to_use,
container_configuration=container_conf,
node_agent_sku_id='batch.node.ubuntu 16.04'),
vm_size='STANDARD_D1_V2',
target_dedicated_nodes=1)
...
ImageReference imageReference = new ImageReference(
publisher: "microsoft-azure-batch",
offer: "ubuntu-server-container",
sku: "16-04-lts",
version: "latest");
// Specify container configuration. This is required even though there are no prefetched images.
ContainerConfiguration containerConfig = new ContainerConfiguration();
// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
imageReference: imageReference,
nodeAgentSkuId: "batch.node.ubuntu 16.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;
// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
poolId: poolId,
targetDedicatedComputeNodes: 1,
virtualMachineSize: "STANDARD_D1_V2",
virtualMachineConfiguration: virtualMachineConfiguration);
Installatiegegevens vooraf opseenbaar maken voor containerconfiguratie
Als u containerafbeeldingen in de pool vooraf wilt opseet, voegt u de lijst met containerafbeeldingen ( container_image_names , in Python) toe aan de ContainerConfiguration .
In het volgende eenvoudige Python-voorbeeld ziet u hoe u vooraf een standaard Ubuntu-containerafbeelding kunt ops halen uit Docker Hub.
image_ref_to_use = batch.models.ImageReference(
publisher='microsoft-azure-batch',
offer='ubuntu-server-container',
sku='16-04-lts',
version='latest')
"""
Specify container configuration, fetching the official Ubuntu container image from Docker Hub.
"""
container_conf = batch.models.ContainerConfiguration(
container_image_names=['ubuntu'])
new_pool = batch.models.PoolAddParameter(
id=pool_id,
virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
image_reference=image_ref_to_use,
container_configuration=container_conf,
node_agent_sku_id='batch.node.ubuntu 16.04'),
vm_size='STANDARD_D1_V2',
target_dedicated_nodes=1)
...
In het volgende C#-voorbeeld wordt ervan uitgenomen dat u vooraf een TensorFlow-afbeelding van Docker Hub. Dit voorbeeld bevat een begintaak die wordt uitgevoerd in de VM-host op de poolknooppunten. U kunt een begintaak uitvoeren in de host, bijvoorbeeld om een bestandsserver te installeren die toegankelijk is vanuit de containers.
ImageReference imageReference = new ImageReference(
publisher: "microsoft-azure-batch",
offer: "ubuntu-server-container",
sku: "16-04-lts",
version: "latest");
ContainerRegistry containerRegistry = new ContainerRegistry(
registryServer: "https://hub.docker.com",
userName: "UserName",
password: "YourPassword"
);
// Specify container configuration, prefetching Docker images
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> { "tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry };
// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
imageReference: imageReference,
nodeAgentSkuId: "batch.node.ubuntu 16.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;
// Set a native host command line start task
StartTask startTaskContainer = new StartTask( commandLine: "<native-host-command-line>" );
// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
poolId: poolId,
virtualMachineSize: "Standard_NC6",
virtualMachineConfiguration: virtualMachineConfiguration);
// Start the task in the pool
pool.StartTask = startTaskContainer;
...
Prefetch images from a private container registry (Vooraf opseisbaar maken van afbeeldingen uit een privécontainerregister)
U kunt containerafbeeldingen ook vooraf opsnulpen door te authenticeren bij een privécontainerregisterserver. In de volgende voorbeelden halen de ContainerConfiguration objecten en vooraf een persoonlijke VirtualMachineConfiguration TensorFlow-afbeelding op uit een privé-Azure-containerregister. De afbeeldingsverwijzing is hetzelfde als in het vorige voorbeeld.
image_ref_to_use = batch.models.ImageReference(
publisher='microsoft-azure-batch',
offer='ubuntu-server-container',
sku='16-04-lts',
version='latest')
# Specify a container registry
container_registry = batch.models.ContainerRegistry(
registry_server="myRegistry.azurecr.io",
user_name="myUsername",
password="myPassword")
# Create container configuration, prefetching Docker images from the container registry
container_conf = batch.models.ContainerConfiguration(
container_image_names = ["myRegistry.azurecr.io/samples/myImage"],
container_registries =[container_registry])
new_pool = batch.models.PoolAddParameter(
id="myPool",
virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
image_reference=image_ref_to_use,
container_configuration=container_conf,
node_agent_sku_id='batch.node.ubuntu 16.04'),
vm_size='STANDARD_D1_V2',
target_dedicated_nodes=1)
// Specify a container registry
ContainerRegistry containerRegistry = new ContainerRegistry(
registryServer: "myContainerRegistry.azurecr.io",
userName: "myUserName",
password: "myPassword");
// Create container configuration, prefetching Docker images from the container registry
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> {
"myContainerRegistry.azurecr.io/tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry } );
// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
imageReference: imageReference,
nodeAgentSkuId: "batch.node.ubuntu 16.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;
// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
poolId: poolId,
targetDedicatedComputeNodes: 4,
virtualMachineSize: "Standard_NC6",
virtualMachineConfiguration: virtualMachineConfiguration);
...
Ondersteuning voor beheerde identiteiten voor ACR
Bij het openen van containers die zijn opgeslagen in Azure Container Registry,kan een gebruikersnaam/wachtwoord of een beheerde identiteit worden gebruikt voor verificatie bij de service. Als u een beheerde identiteit wilt gebruiken, moet u eerst controleren of de identiteit is toegewezen aan de groep en of aan de identiteit de rol is toegewezen voor het containerregister dat AcrPull u wilt openen. Vervolgens vertelt u Batch welke identiteit moet worden gebruikt bij het verifiëren met ACR.
ContainerRegistry containerRegistry = new ContainerRegistry(
registryServer: "myContainerRegistry.azurecr.io",
identityReference: new ComputeNodeIdentityReference() { ResourceId = "/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name" }
);
// Create container configuration, prefetching Docker images from the container registry
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> {
"myContainerRegistry.azurecr.io/tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry } );
// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
imageReference: imageReference,
nodeAgentSkuId: "batch.node.ubuntu 16.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;
// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
poolId: poolId,
targetDedicatedComputeNodes: 4,
virtualMachineSize: "Standard_NC6",
virtualMachineConfiguration: virtualMachineConfiguration);
...
Containerinstellingen voor de taak
Als u een containertaak wilt uitvoeren in een pool met container ingeschakeld, geeft u containerspecifieke instellingen op. Instellingen de uit te voeren opties voor de te gebruiken afbeelding, het register en de container.
Gebruik de
ContainerSettingseigenschap van de taakklassen om containerspecifieke instellingen te configureren. Deze instellingen worden gedefinieerd door de klasse TaskContainerSettings. Houd er rekening--rmmee dat voor de containeroptie geen extra optie is--runtimevereist, omdat deze wordt verzorgd door Batch.Als u taken uitvoert op containerafbeeldingen, zijn voor de taak cloudtaak en jobbeheer containerinstellingen vereist. Voor de begintaak, jobvoorbereidingstaak en jobre release-taak zijn echter geen containerinstellingen vereist (dat wil zeggen, ze kunnen worden uitgevoerd binnen een containercontext of rechtstreeks op het knooppunt).
Voor Windows moeten taken worden uitgevoerd met ElevationLevel ingesteld op
admin.Voor Linux wordt in Batch de machtiging gebruiker/groep aan de container verleend. Als voor toegang tot een map in de container beheerdersmachtigingen zijn vereist, moet u de taak mogelijk uitvoeren als poolbereik met het niveau van beheerdersverhoging. Dit zorgt ervoor dat batch de taak als hoofdmap in de containercontext wordt uitgevoerd. Anders heeft een gebruiker die geen beheerder is mogelijk geen toegang tot deze mappen.
Voor containergroepen met hardware met GPU schakelt Batch AUTOMATISCH GPU in voor containertaken, dus u moet het argument niet
–gpusopnemen.
Opdrachtregel containertaak
Wanneer u een containertaak hebt uitgevoerd, gebruikt Batch automatisch de opdracht docker create om een container te maken met behulp van de in de taak opgegeven afbeelding. Batch beheert vervolgens de taakuitvoering in de container.
Net als bij batchtaken zonder container stelt u een opdrachtregel in voor een containertaak. Omdat Batch de container automatisch maakt, geeft de opdrachtregel alleen de opdracht of opdrachten op die in de container worden uitgevoerd.
Als de containerafbeelding voor een Batch-taak is geconfigureerd met een ENTRYPOINT-script, kunt u de opdrachtregel instellen op het standaard ENTRYPOINT of overschrijven:
Als u het standaard ENTRYPOINT van de containerafbeelding wilt gebruiken, stelt u de opdrachtregel van de taak in op de lege tekenreeks
"".Als u het standaard ENTRYPOINT wilt overschrijven of als de afbeelding geen ENTRYPOINT heeft, stelt u een opdrachtregel in die geschikt is voor de container,
/app/myappbijvoorbeeld of/bin/sh -c python myscript.py.
Optionele ContainerRunOptions zijn aanvullende argumenten die u aan de opdracht levert die Batch gebruikt om de container te maken docker create en uit te voeren. Als u bijvoorbeeld een werkmap voor de container wilt instellen, stelt u de optie --workdir <directory> in. Zie de docker create reference (Referentie voor docker maken) voor aanvullende opties.
Werkmap van containertaak
Een Batch-containertaak wordt uitgevoerd in een werkmap in de container die vergelijkbaar is met de map die Batch voor een reguliere (niet-container)-taak in stelt. Houd er rekening mee dat deze werkmap verschilt van de WORKDIR als deze is geconfigureerd in de afbeelding of de standaardwerkmap van de container ( in een Windows-container of in een C:\ / Linux-container).
Voor een Batch-containertaak:
- Alle mapjes recursief onder de op het host-knooppunt (de hoofdmap van de Azure Batch) worden in de
AZ_BATCH_NODE_ROOT_DIRcontainer geplaatst - Alle omgevingsvariabelen voor taken worden in de container geplaatst
- De taak working directory op het knooppunt is hetzelfde ingesteld als
AZ_BATCH_TASK_WORKING_DIRvoor een reguliere taak en in de container.
Met deze toewijzingen kunt u op vrijwel dezelfde manier met containertaken werken als niet-containertaken. U kunt bijvoorbeeld toepassingen installeren met behulp van toepassingspakketten, toegang krijgen tot resourcebestanden van Azure Storage, taakomgevingsinstellingen gebruiken en taakuitvoerbestanden persistent maken nadat de container is gestopt.
Problemen met containertaken oplossen
Als uw containertaak niet wordt uitgevoerd zoals verwacht, moet u mogelijk informatie krijgen over de WORKDIR- of ENTRYPOINT-configuratie van de containerafbeelding. Voer de opdracht docker image inspect uit om de configuratie te zien.
Pas indien nodig de instellingen van de containertaak aan op basis van de afbeelding:
- Geef een absoluut pad op in de opdrachtregel van de taak. Als het standaard ENTRYPOINT van de afbeelding wordt gebruikt voor de opdrachtregel van de taak, moet u ervoor zorgen dat er een absoluut pad is ingesteld.
- Wijzig in de containerrunopties van de taak de werkmap zo dat deze overeenkomen met de WORKDIR in de afbeelding. Stel bijvoorbeeld
--workdir /appin.
Voorbeelden van containertaak
Het volgende Python-fragment toont een eenvoudige opdrachtregel die wordt uitgevoerd in een container die is gemaakt op basis van een fictieve afbeelding die is Docker Hub. Hier verwijdert de containeroptie de container nadat de taak is voltooien en stelt de --rm --workdir optie een werkmap in. De opdrachtregel overschrijven de container ENTRYPOINT met een eenvoudige shell opdracht die een klein bestand schrijft naar de taak working directory op de host.
task_id = 'sampletask'
task_container_settings = batch.models.TaskContainerSettings(
image_name='myimage',
container_run_options='--rm --workdir /')
task = batch.models.TaskAddParameter(
id=task_id,
command_line='/bin/sh -c \"echo \'hello world\' > $AZ_BATCH_TASK_WORKING_DIR/output.txt\"',
container_settings=task_container_settings
)
In het volgende C#-voorbeeld ziet u de basiscontainerinstellingen voor een cloudtaak:
// Simple container task command
string cmdLine = "c:\\app\\myApp.exe";
TaskContainerSettings cmdContainerSettings = new TaskContainerSettings (
imageName: "myimage",
containerRunOptions: "--rm --workdir c:\\app"
);
CloudTask containerTask = new CloudTask (
id: "Task1",
commandline: cmdLine);
containerTask.ContainerSettings = cmdContainerSettings;
Volgende stappen
- Zie de Batch Batch-toolkit voor een eenvoudige implementatie van containerworkloads op Azure Batch via de Recipes-recepten.
- Zie de Docker-documentatie voor meer informatie over het installeren en gebruiken van Docker CE op Linux.
- Meer informatie over het gebruik van een beheerde aangepaste afbeelding om een pool met virtuele machines te maken.
- Meer informatie over het Moby-project, een framework voor het maken van op containers gebaseerde systemen.