Köra containerprogram på Azure Batch
Azure Batch kan du köra och skala ett stort antal batchberäkningsjobb i Azure. Batch-aktiviteter kan köras direkt på virtuella datorer (noder) i en Batch-pool, men du kan också konfigurera en Batch-pool för att köra aktiviteter i Docker-kompatibla containrar på noderna. Den här artikeln visar hur du skapar en pool med beräkningsnoder som stöder körning av containeraktiviteter och sedan kör containeraktiviteter i poolen.
Kodexe exemplen här använder Batch .NET- och Python-SDK:er. Du kan också använda andra Batch-SDK:er och verktyg, inklusive Azure Portal, för att skapa containeraktiverade Batch-pooler och för att köra containeruppgifter.
Varför använda containrar?
Att använda containrar är ett enkelt sätt att köra Batch-uppgifter utan att behöva hantera en miljö och beroenden för att köra program. Containrar distribuerar program som lätta, portabla, självförsörjande enheter som kan köras i flera olika miljöer. Du kan till exempel skapa och testa en container lokalt och sedan ladda upp containeravbildningen till ett register i Azure eller någon annanstans. Containerdistributionsmodellen säkerställer att körningsmiljön för ditt program alltid är korrekt installerad och konfigurerad var du än är värd för programmet. Containerbaserade uppgifter i Batch kan också dra nytta av funktioner i icke-containeruppgifter, inklusive programpaket och hantering av resursfiler och utdatafiler.
Förutsättningar
Du bör vara bekant med containerbegrepp och hur du skapar en Batch-pool och ett jobb.
SDK-versioner: Batch SDK:er stöder containeravbildningar från och med följande versioner:
- Batch REST API version 2017-09-01.6.0
- Batch .NET SDK version 8.0.0
- Batch Python SDK version 4.0
- Batch Java SDK version 3.0
- Batch Node.js SDK version 3.0
Konton: I din Azure-prenumeration måste du skapa ett Batch-konto och eventuellt ett Azure Storage konto.
En VM-avbildning som stöds: Containrar stöds endast i pooler som skapats med Virtual Machine Configuration från en avbildning som stöds (visas i nästa avsnitt). Om du anger en anpassad avbildning kan du se övervägandena i följande avsnitt och kraven i Använda en hanterad anpassad avbildning för att skapa en pool med virtuella datorer.
Tänk på följande begränsningar:
- Batch tillhandahåller endast RDMA-stöd för containrar som körs på Linux-pooler.
- För Windows containerarbetsbelastningar rekommenderar vi att du väljer en VM-storlek med flera kärnor för din pool.
Avbildningar av virtuella datorer som stöds
Använd någon av följande beräkningsnoder Windows Linux- eller Linux-avbildningar för att skapa en pool med VM-beräkningsnoder för containerarbetsbelastningar. Mer information om Marketplace-avbildningar som är kompatibla med Batch finns i Lista över avbildningar av virtuella datorer.
Windows support
Batch stöder Windows serveravbildningar som har containerstödsbeteckningar. Dessa SKU-namn för avbildningar har vanligtvis suffixet -with-containers eller -with-containers-smalldisk . Dessutom anger API:et för en lista över alla avbildningar som stöds i Batch en DockerCompatible funktion om avbildningen stöder Docker-containrar.
Du kan också skapa anpassade avbildningar från virtuella datorer som kör Docker på Windows.
Linux-support
För Linux-containerarbetsbelastningar stöder Batch för närvarande följande Linux-avbildningar som publicerats av Microsoft Azure Batch i Azure Marketplace utan behov av en anpassad avbildning.
VM-storlekar utan RDMA
- Publisher:
microsoft-azure-batch- Erbjuder:
centos-container - Erbjuder:
ubuntu-server-container
- Erbjuder:
VM-storlekar med RDMA
- Publisher:
microsoft-azure-batch- Erbjuder:
centos-container-rdma - Erbjuder:
ubuntu-server-container-rdma
- Erbjuder:
Dessa avbildningar stöds endast för användning i Azure Batch-pooler och är inriktade på Docker-containerkörning. De har:
- En förinstallerad Docker-kompatibel Moby-containerkörning
- Förinstallerade NVIDIA GPU-drivrutiner och NVIDIA-containerkörning för att effektivisera distributionen på virtuella datorer i Azure N-serien
- VM-avbildningar med suffixet "-rdma" är förkonfigurerade med stöd för Storlekar på virtuella InfiniBand RDMA-datorer. Dessa VM-avbildningar bör inte användas med VM-storlekar som inte har stöd för InfiniBand.
Du kan också skapa anpassade avbildningar från virtuella datorer som kör Docker på en av Linux-distributionerna som är kompatibla med Batch. Om du väljer att ange en egen anpassad Linux-avbildning kan du läsa anvisningarna i Använda en hanterad anpassad avbildning för att skapa en pool med virtuella datorer.
För Docker-stöd på en anpassad avbildning installerar du Docker Community Edition (CE) eller Docker Enterprise Edition (EE).
Ytterligare överväganden för att använda en anpassad Linux-avbildning:
- Om du vill dra nytta av GPU-prestandan för Azure N-seriens storlekar när du använder en anpassad avbildning förinstallerar du NVIDIA-drivrutiner. Du måste också installera Docker Engine-verktyget för NVIDIA GPU:er, NVIDIA Docker.
- Om du vill komma åt Azure RDMA-nätverket använder du en RDMA-kompatibel VM-storlek. Nödvändiga RDMA-drivrutiner installeras i CentOS HPC- och Ubuntu-avbildningar som stöds av Batch. Ytterligare konfiguration kan behövas för att köra MPI-arbetsbelastningar. Se Använda RDMA-kompatibla eller GPU-aktiverade instanser i Batch-pool.
Containerkonfiguration för Batch-pool
Om du vill göra det möjligt för en Batch-pool att köra containerarbetsbelastningar måste du ange inställningar för ContainerConfiguration i poolens VirtualMachineConfiguration-objekt. (Den här artikeln innehåller länkar till Batch .NET API-referensen. Motsvarande inställningar finns i Batch Python API.)
Du kan skapa en containeraktiverad pool med eller utan förinstallerade containeravbildningar, som du ser i följande exempel. Med pull-processen (eller prefetch) kan du läsa in containeravbildningar från antingen Docker Hub eller ett annat containerregister på Internet. Använd ett Azure-containerregister i samma region som Batch-kontot för bästa prestanda.
Fördelen med att förinstallera containeravbildningar är att när aktiviteter börjar köras behöver de inte vänta på att containeravbildningen laddas ned. Containerkonfigurationen hämtar containeravbildningar till de virtuella datorerna när poolen skapas. Aktiviteter som körs i poolen kan sedan referera till listan över containeravbildningar och alternativ för containerkörning.
Pool utan förindelade containeravbildningar
Om du vill konfigurera en containeraktiverad pool utan förinstallerade containeravbildningar definierar du ContainerConfiguration VirtualMachineConfiguration objekten och enligt följande exempel. I de här exemplen används Ubuntu Server Azure Batch en containerpoolavbildning från 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);
Prefetch-avbildningar för containerkonfiguration
Om du vill förinstallera containeravbildningar i poolen lägger du till listan över containeravbildningar ( container_image_names , i Python) till ContainerConfiguration .
Följande grundläggande Python-exempel visar hur du förinstallerar en Ubuntu-standardcontaineravbildning från 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)
...
Följande C#-exempel förutsätter att du vill förinstallera en TensorFlow-avbildning från Docker Hub. Det här exemplet innehåller en startaktivitet som körs på VM-värden på poolnoderna. Du kan köra en startaktivitet på värden, till exempel för att montera en filserver som kan nås från containrarna.
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-avbildningar från ett privat containerregister
Du kan också förinstallera containeravbildningar genom att autentisera till en privat containerregisterserver. I följande exempel förinstallerar ContainerConfiguration - VirtualMachineConfiguration och -objekten en privat TensorFlow-avbildning från ett privat Azure-containerregister. Bildreferensen är samma som i föregående exempel.
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);
...
Stöd för hanterade identiteter för ACR
Vid åtkomst till containrar som Azure Container Registrykan antingen ett användarnamn/lösenord eller en hanterad identitet användas för att autentisera med tjänsten. Om du vill använda en hanterad identitet måste du först se till att identiteten har tilldelats till poolen och att identiteten har tilldelats rollen för AcrPull det containerregister som du vill komma åt. Sedan berättar du bara för Batch vilken identitet som ska användas vid autentisering med 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);
...
Containerinställningar för uppgiften
Om du vill köra en containeraktivitet på en containeraktiverad pool anger du containerspecifika inställningar. Inställningar inkludera avbildningen som ska användas, register- och containerkörningsalternativen.
Använd egenskapen
ContainerSettingsför aktivitetsklasserna för att konfigurera containerspecifika inställningar. De här inställningarna definieras av klassen TaskContainerSettings. Observera att--rmcontaineralternativet inte kräver något ytterligare alternativ--runtimeeftersom det tas hand om av Batch.Om du kör uppgifter på containeravbildningar kräver molnaktiviteten och Job Manager-uppgiften containerinställningar. Startaktiviteten,jobbförberedelseaktiviteten och jobbutgåningen kräver dock inte containerinställningar (det vill säga de kan köras i en containerkontext eller direkt på noden).
För Windows måste uppgifter köras med ElevationLevel inställt på
admin.För Linux mappar Batch användar-/gruppbehörigheten till containern. Om åtkomst till en mapp i containern kräver administratörsbehörighet kan du behöva köra uppgiften som poolomfång med administratörshöjningsnivå. Detta säkerställer att Batch kör uppgiften som rot i containerkontexten. Annars kanske en icke-administratörsanvändare inte har åtkomst till dessa mappar.
För containerpooler med GPU-aktiverad maskinvara aktiverar Batch automatiskt GPU för containeruppgifter, så du bör inte inkludera
–gpusargumentet .
Kommandorad för containeraktivitet
När du kör en containeraktivitet använder Batch automatiskt kommandot docker create för att skapa en container med hjälp av avbildningen som anges i uppgiften. Batch styr sedan uppgiftskörningen i containern.
Precis som med Batch-uppgifter som inte är container anger du en kommandorad för en containeraktivitet. Eftersom Batch skapar containern automatiskt anger kommandoraden bara det eller de kommandon som ska köras i containern.
Om containeravbildningen för en Batch-aktivitet har konfigurerats med ett ENTRYPOINT-skript kan du ange att kommandoraden antingen ska använda standard-ENTRYPOINT eller åsidosätta den:
Om du vill använda standardvärdet ENTRYPOINT för containeravbildningen anger du aktivitetens kommandorad till den tomma strängen
"".Om du vill åsidosätta standard-ENTRYPOINT, eller om avbildningen inte har en ENTRYPOINT, anger du en kommandorad som är lämplig för containern, till
/app/myappexempel eller/bin/sh -c python myscript.py.
Valfria ContainerRunOptions är ytterligare argument som du anger för docker create kommandot som Batch använder för att skapa och köra containern. Om du till exempel vill ange en arbetskatalog för containern anger du --workdir <directory> alternativet . Se docker create-referensen för ytterligare alternativ.
Arbetskatalog för containeruppgift
En Batch-containeraktivitet körs i en arbetskatalog i containern som liknar katalogen Batch uppsättningar för en vanlig uppgift (inte container). Observera att den här arbetskatalogen skiljer sig från WORKDIR om den konfigurerats i avbildningen, eller standardcontainerns arbetskatalog ( på en Windows-container eller på en C:\ / Linux-container).
För en Batch-containeruppgift:
- Alla kataloger rekursivt under på värdnoden
AZ_BATCH_NODE_ROOT_DIR(roten Azure Batch kataloger) mappas till containern - Alla aktivitetsmiljövariabler mappas till containern
- Arbetskatalogen för
AZ_BATCH_TASK_WORKING_DIRaktiviteten på noden anges på samma sätt som för en vanlig aktivitet och mappas till containern.
Med de här mappningarna kan du arbeta med containeruppgifter på ungefär samma sätt som andra uppgifter än containeruppgifter. Du kan till exempel installera program med programpaket, komma åt resursfiler från Azure Storage, använda inställningar för aktivitetsmiljön och spara aktivitetsutdatafiler när containern stoppas.
Felsöka containeruppgifter
Om containeruppgiften inte körs som förväntat kan du behöva hämta information om konfigurationen WORKDIR eller ENTRYPOINT för containeravbildningen. Om du vill se konfigurationen kör du kommandot docker image inspect.
Om det behövs justerar du inställningarna för containeruppgiften baserat på avbildningen:
- Ange en absolut sökväg på aktivitetens kommandorad. Om avbildningens standard ENTRYPOINT används för aktivitetens kommandorad ser du till att en absolut sökväg har angetts.
- I aktivitetens alternativ för containerkörning ändrar du arbetskatalogen så att den matchar WORKDIR i avbildningen. Ange till exempel
--workdir /app.
Exempel på containeraktivitet
Följande Python-kodfragment visar en grundläggande kommandorad som körs i en container som skapats från en fiktiv avbildning som hämtas Docker Hub. Här tar --rm containeralternativet bort containern när uppgiften har avslutats och alternativet --workdir anger en arbetskatalog. Kommandoraden åsidosätter containern ENTRYPOINT med ett enkelt kommando som skriver en liten fil till aktivitetens arbetskatalog på värden.
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
)
I följande C#-exempel visas grundläggande containerinställningar för en molnuppgift:
// 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;
Nästa steg
- Information om hur du enkelt distribuerar containerarbetsbelastningar Azure Batch via Shipyard-receptfinns i Verktygslådan Batch Shipyard.
- Information om hur du installerar och använder Docker CE på Linux finns i Docker-dokumentationen.
- Lär dig hur du använder en hanterad anpassad avbildning för att skapa en pool med virtuella datorer.
- Läs mer om Moby-projektet, ett ramverk för att skapa containerbaserade system.