Spouštění kontejnerových aplikací v Azure Batch
Azure Batch umožňuje spouštět a škálovat velký počet dávkových výpočetních úloh v Azure. Dávkové úlohy lze spouštět přímo na virtuálních počítačích (uzlech) ve fondu Batch, ale můžete také nastavit fond Batch pro spouštění úkolů v kontejnerech kompatibilních s Dockerem na uzlech. Tento článek ukazuje, jak vytvořit fond výpočetních uzlů, které podporují spouštění úloh kontejnerů, a pak ve fondu spouštět úlohy kontejneru.
Příklady kódu tady používají batch .NET a pythonové sdk. K vytváření fondů Batch s podporou kontejnerů a ke spouštění úloh kontejnerů můžete použít také další sady SDK a nástroje služby Batch, včetně sady Azure Portal.
Proč používat kontejnery?
Použití kontejnerů poskytuje snadný způsob, jak spouštět úlohy Batch, aniž byste museli spravovat prostředí a závislosti pro spouštění aplikací. Kontejnery nasadí aplikace jako jednoduché, přenositelné a soběstačné jednotky, které mohou běžet v několika různých prostředích. Například sestavíte a otestujte kontejner místně a pak image kontejneru nahrajete do registru v Azure nebo jinde. Model nasazení kontejneru zajišťuje, že běhové prostředí vaší aplikace je vždy správně nainstalované a nakonfigurované všude, kde aplikaci hostíte. Úlohy založené na kontejnerech ve batchu mohou také využívat funkce úloh, které nejsou kontejnery, včetně balíčků aplikací a správy souborů prostředků a výstupních souborů.
Požadavky
Měli byste být obeznámeni s koncepty kontejnerů a s tím, jak vytvořit fond a úlohu služby Batch.
Verze sady SDK: Sady SDK služby Batch podporují image kontejnerů v následujících verzích:
- Batch REST API verze 2017-09-01.6.0
- Batch .NET SDK verze 8.0.0
- Batch Python SDK verze 4.0
- Batch Java SDK verze 3.0
- Batch Node.js SDK verze 3.0
Účty: Ve svém předplatném Azure musíte vytvořit účet Batch a volitelně účet Azure Storage účtu.
Podporovaná image virtuálního počítače: Kontejnery se podporují jenom ve fondech vytvořených pomocí konfigurace virtuálního počítače z podporované image (uvedené v další části). Pokud poskytnete vlastní image, prohlédněte si důležité informace v následující části a požadavky v tématu Použití spravované vlastní image k vytvoření fondu virtuálních počítačů.
Mějte na paměti následující omezení:
- Batch poskytuje podporu RDMA pouze pro kontejnery spuštěné ve fondech Linuxu.
- Pro Windows kontejnerových úloh doporučujeme pro fond zvolit vícejádrový virtuální počítač.
Podporované image virtuálních počítačů
Pomocí jedné z následujících podporovaných imagí Windows linuxových imagí vytvořte fond výpočetních uzlů virtuálních počítačů pro úlohy kontejneru. Další informace o imagi z Marketplace, které jsou kompatibilní se službou Batch, najdete v tématu Seznam imagí virtuálních počítačů.
Windows podpory
Služba Batch Windows image serverů, které mají označení podpory kontejnerů. Tyto názvy SKU image mají obvykle příponu -with-containers nebo -with-containers-smalldisk . Kromě toho rozhraní API pro zobrazení seznamu všech podporovaných imagí ve batche označuje schopnost, pokud image podporuje DockerCompatible kontejnery Dockeru.
Můžete také vytvořit vlastní image z virtuálních počítače s Dockerem na Windows.
Podpora Linuxu
Pro úlohy kontejnerů Linuxu batch v současné době podporuje následující image Linuxu publikované Microsoft Azure Batch v Azure Marketplace bez nutnosti vlastní image.
Velikosti virtuálních počítačů bez RDMA
- Publisher:
microsoft-azure-batch- Nabízejí:
centos-container - Nabízejí:
ubuntu-server-container
- Nabízejí:
Velikosti virtuálních počítačů s RDMA
- Publisher:
microsoft-azure-batch- Nabízejí:
centos-container-rdma - Nabízejí:
ubuntu-server-container-rdma
- Nabízejí:
Tyto image se podporují jenom pro použití v Azure Batch fondech a jsou zaměřeny na spouštění kontejnerů Dockeru. Mají tyto funkce:
- Předinstalovaný modul runtime kontejneru Moby kompatibilní s Dockerem
- Předem nainstalované ovladače NVIDIA GPU a modul runtime kontejneru NVIDIA pro zjednodušení nasazení na virtuální počítače řady Azure N-series
- Image virtuálních počítačů s příponou -rdma mají předem nakonfigurovanou podporu velikostí virtuálních počítačů InfiniBand s podporou RDMA. Tyto image virtuálních počítačů by se neměly používat s velikostmi virtuálních počítačů, které nepodporují InfiniBand.
Můžete také vytvořit vlastní image z virtuálních počítačů s Dockerem v jedné z linuxových distribucí, které jsou kompatibilní se službou Batch. Pokud se rozhodnete zadat vlastní image Linuxu, přečtěte si pokyny v tématu Použití spravované vlastní image k vytvoření fondu virtuálních počítačů.
Pokud potřebujete podporu Dockeru pro vlastní image, nainstalujte Docker Community Edition (CE) nebo Docker edice Enterprise (EE).
Další důležité informace o používání vlastní image Linuxu:
- Pokud chcete při použití vlastní image využít výkon GPU velikostí Azure N-series, nainstalujte předinstalujte ovladače NVIDIA. Musíte také nainstalovat nástroj Docker Engine pro grafické procesory NVIDIA, NVIDIA Docker.
- Pokud chcete získat přístup k síti Azure RDMA, použijte velikost virtuálního počítače s podporou RDMA. Potřebné ovladače RDMA jsou nainstalované v imagích CentOS HPC a Ubuntu podporovaných aplikací Batch. Ke spouštění úloh MPI může být potřeba další konfigurace. Viz Použití instancí s podporou RDMAnebo GPU ve fondu Batch.
Konfigurace kontejneru pro fond Služby Batch
Pokud chcete fondu služby Batch povolit spouštění úloh kontejneru, musíte zadat nastavení ContainerConfiguration v objektu VirtualMachineConfiguration fondu. (Tento článek obsahuje odkazy na referenční informace k rozhraní Batch .NET API. Odpovídající nastavení se nachází v rozhraní Python API služby Batch.)
Fond s podporou kontejnerů můžete vytvořit s předem načtenou imagí kontejnerů nebo bez nich, jak je znázorněno v následujících příkladech. Proces načítání (nebo předběžné načtení) umožňuje předběžné načtení imagí kontejnerů z Docker Hub nebo z jiného registru kontejneru na internetu. Pro nejlepší výkon použijte registr kontejneru Azure ve stejné oblasti jako účet Batch.
Výhodou předběžného načtení imagí kontejneru je, že když se úkoly poprvé spustí, nemusí čekat na stažení image kontejneru. Konfigurace kontejneru při vytvoření fondu přetáhne image kontejnerů na virtuální počítače. Úlohy, které běží ve fondu, pak mohou odkazovat na seznam imagí kontejnerů a možností spuštění kontejneru.
Fond bez předem načtených imagí kontejnerů
Pokud chcete nakonfigurovat fond s podporou kontejnerů bez předem načtených imagí kontejnerů, definujte objekty a , jak je znázorněno ContainerConfiguration VirtualMachineConfiguration v následujících příkladech. V těchto příkladech se používá Ubuntu Server Azure Batch image fondů kontejnerů z 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);
Předběžné načtení imagí pro konfiguraci kontejneru
Pokud chcete předběžné načtení imagí kontejnerů ve fondu, přidejte seznam imagí kontejneru ( container_image_names v Pythonu) do ContainerConfiguration .
Následující základní příklad Pythonu ukazuje, jak předběžně načtou standardní image kontejneru Ubuntu z 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)
...
Následující příklad jazyka C# předpokládá, že chcete předběžně načtou obrázek TensorFlow z Docker Hub. Tento příklad zahrnuje úlohu spuštění, která běží na hostiteli virtuálního počítače na uzlech fondu. V hostiteli můžete spustit spouštěný úkol, například připojit souborový server, ke kterým lze přistupovat z kontejnerů.
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;
...
Předběžné načtení imagí z privátního registru kontejneru
Image kontejnerů můžete také předběžně načtou ověřením na privátním serveru registru kontejnerů. V následujících příkladech objekty ContainerConfiguration VirtualMachineConfiguration a předběžně načtou privátní image TensorFlow z privátního registru kontejnerů Azure. Odkaz na image je stejný jako v předchozím příkladu.
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);
...
Podpora spravované identity pro ACR
Při přístupu ke kontejnerům uloženým Azure Container Registrymůžete k ověření ve službě použít buď uživatelské jméno a heslo, nebo spravovanou identitu. Pokud chcete použít spravovanou identitu, nejprve se ujistěte, že je identita přiřazená k fondu a že má identita přiřazenou roli pro registr kontejneru, ke které AcrPull chcete získat přístup. Pak jednoduše řekněte Batch, která identita se má použít při ověřování pomocí 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);
...
Nastavení kontejneru pro úlohu
Pokud chcete spustit úlohu kontejneru ve fondu s povoleným kontejnerem, zadejte nastavení specifická pro kontejner. Nastavení zahrnout image, která se má použít, registr a možnosti spuštění kontejneru.
Ke
ContainerSettingskonfiguraci nastavení specifických pro kontejner použijte vlastnost tříd úloh. Tato nastavení jsou definována třídou TaskContainerSettings. Všimněte--rmsi, že možnost kontejneru nevyžaduje další možnost, protože se o ni postará--runtimeBatch.Pokud spustíte úlohy v imagi kontejneru, cloudový úkol a úkol správce úloh vyžadují nastavení kontejneru. Úkol spuštění ,úkol přípravy úlohy a úkol uvolnění úlohy však nevyžadují nastavení kontejneru (to znamená, že mohou běžet v kontextu kontejneru nebo přímo na uzlu).
Pro Windows musí být úkoly spuštěny s ElevationLevel nastavenou na
admin.V případě Linuxu bude Batch mapovat oprávnění uživatele nebo skupiny na kontejner. Pokud přístup k libovolné složce v kontejneru vyžaduje oprávnění správce, bude pravděpodobně nutné spustit úlohu jako rozsah fondu s úrovní zvýšení oprávnění správce. Tím se zajistí, že dávka spustí úlohu jako kořen v kontextu kontejneru. V opačném případě uživatel bez oprávnění správce nemusí mít přístup k těmto složkám.
Pro fondy kontejnerů s hardwarem podporujícím GPU Batch automaticky povolí GPU pro úlohy kontejneru, takže by neměl obsahovat
–gpusargument.
Příkazový řádek úlohy kontejneru
Když spustíte úlohu kontejneru, Batch automaticky použije příkaz Docker Create k vytvoření kontejneru pomocí Image zadané v úloze. Batch potom řídí provádění úloh v kontejneru.
Stejně jako u úloh služby Batch bez kontejnerů můžete nastavit příkazový řádek pro úlohu kontejneru. Vzhledem k tomu, že dávka automaticky vytvoří kontejner, příkazový řádek pouze určuje příkaz nebo příkazy, které budou spuštěny v kontejneru.
Pokud je image kontejneru pro úlohu Batch nakonfigurovaná pomocí skriptu ENTRYPOINT , můžete příkazový řádek nastavit tak, aby buď použil výchozí vstupní bod, nebo ho přepsat:
Chcete-li použít výchozí vstupní bod pro Image kontejneru, nastavte příkazový řádek úlohy na prázdný řetězec
"".Chcete-li přepsat výchozí vstupní bod, nebo pokud bitová kopie neobsahuje vstupní bod, nastavte příkazový řádek vhodný pro kontejner, například
/app/myappnebo/bin/sh -c python myscript.py.
Volitelné ContainerRunOptions jsou další argumenty, které poskytnete docker create příkazu, který dávka používá k vytvoření a spuštění kontejneru. Chcete-li například nastavit pracovní adresář pro kontejner, nastavte --workdir <directory> možnost. Další možnosti najdete v tématu o Vytvoření Docker reference.
Pracovní adresář úkolu kontejneru
Úloha služby Batch se spustí v pracovním adresáři v kontejneru, který je velmi podobný jako adresářová dávka pro běžný (nekontejnerový) úkol. všimněte si, že tento pracovní adresář je jiný než WORKDIR , pokud je nakonfigurovaný v imagi, nebo výchozí pracovní adresář kontejneru ( C:\ v kontejneru Windows nebo / v kontejneru Linux).
Pro úlohu kontejneru Batch:
- Všechny adresáře rekurzivně pod
AZ_BATCH_NODE_ROOT_DIRuzlem hostitele (kořen adresářů Azure Batch) jsou namapovány do kontejneru. - Všechny proměnné prostředí úlohy jsou namapované na kontejner.
- Pracovní adresář úkolu
AZ_BATCH_TASK_WORKING_DIRna uzlu je nastaven jako stejný jako pro běžný úkol a namapován do kontejneru.
Tato mapování umožňují pracovat s úlohami kontejneru podobným způsobem jako úlohy bez kontejneru. například nainstalujte aplikace pomocí balíčků aplikace, získejte přístup k souborům prostředků z Azure Storage, použijte nastavení prostředí úloh a zachovejte výstupní soubory úlohy po zastavení kontejneru.
Řešení potíží s úlohami kontejneru
Pokud úloha kontejneru neběží podle očekávání, možná budete muset získat informace o konfiguraci WORKDIR nebo ENTRYPOINT pro Image kontejneru. Pokud chcete zobrazit konfiguraci, spusťte příkaz Docker image prověřit .
V případě potřeby upravte nastavení úlohy kontejneru na základě bitové kopie:
- Zadejte absolutní cestu na příkazovém řádku úlohy. Pokud se pro příkazový řádek úlohy používá výchozí vstupní bod obrázku, ujistěte se, že je nastavená absolutní cesta.
- V možnostech spuštění kontejneru úlohy změňte pracovní adresář tak, aby odpovídal WORKDIR v imagi. Například nastavte
--workdir /app.
Příklady úloh kontejneru
Následující fragment kódu Pythonu ukazuje základní příkazový řádek, který je spuštěný v kontejneru vytvořeném z fiktivní image z Docker Hub. V tomto případě --rm možnost kontejneru odstraní kontejner po dokončení úkolu a --workdir možnost nastaví pracovní adresář. Příkazový řádek přepíše vstupní bod kontejneru jednoduchým příkazem prostředí, který zapíše malý soubor do pracovního adresáře úkolů na hostiteli.
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
)
Následující příklad jazyka C# ukazuje základní nastavení kontejneru pro úlohu cloudu:
// 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;
Další kroky
- Pro snadné nasazení kontejnerových úloh v Azure Batch prostřednictvím recepty v rámci loděnicesi prohlédněte sadu Batch pro dávkové zpracování.
- Informace o instalaci a použití nástroje Docker CE v systému Linux najdete v dokumentaci k Docker .
- Naučte se používat spravovanou vlastní image k vytvoření fondu virtuálních počítačů.
- Přečtěte si další informace o projektu Moby, architektuře pro vytváření kontejnerových systémů.