使用 Batch 應用程式套件將應用程式部署至計算節點

應用程式套件可以簡化 Azure Batch 解決方案中的程式碼,以更容易管理工作執行所在的應用程式。 透過應用程式套件,您可以上傳和管理工作所執行的多個應用程式版本,包括其支援檔案。 接著,您可以將一或多個這種類型的應用程式自動部署到集區中的計算節點。

用來建立和管理應用程式套件的 API 屬於 Batch Management .NET 程式庫的一部分。 用來在計算節點上安裝應用程式套件的 API 則屬於 Batch .NET 程式庫的一部分。 其他程式設計語言的類似功能在其可用 Batch API 中。

本文會說明如何使用 Azure 入口網站上傳與管理應用程式套件。 同時會示範如何使用 Batch .NET 程式庫將套件安裝在集區的計算節點上。

應用程式封裝需求

若要使用應用程式套件,您必須將 Azure 儲存體帳戶連結到 Batch 帳戶。

Batch 帳戶中的應用程式和應用程式套件數目,以及應用程式套件的大小上限有其限制。 如需詳細資訊,請參閱 Batch 服務配額和限制

注意

2017 年 7 月 5 日前建立的 Batch 集區不支援應用程式封裝,但 2016 年 3 月 10 日後使用雲端服務設定所建立者無此限制。 此處所述的應用程式套件功能取代了舊版服務中的「Batch Apps」功能。

了解應用程式和應用程式套件

在 Azure Batch 內,應用程式是指一組已設定版本的二進位檔,可以自動下載到您的集區中的計算節點。 應用程式可包含一或多個代表應用程式不同版本的「應用程式套件」

每個「應用程式套件」都是 .zip 檔案,包含應用程式的二進位檔和所有支援檔案。 僅支援 .zip 格式。

Diagram that shows a high-level view of applications and application packages.

您可以在集區或工作層級指定應用程式套件。

  • 集區應用程式封裝會部署到集區中的每個節點。 當節點加入集區以及重新啟動或重新安裝映像時,就會部署應用程式。

    當集區中的所有節點都執行某作業的工作時,便適合使用集區應用程式封裝。 您可以在建立集區時,指定一或多個要部署的應用程式套件。 您也可以新增或更新現有集區的套件。 若要將新的封裝安裝到現有集區,您必須重新啟動其節點。

  • 工作應用程式套件 只會部署到排程要執行工作的計算節點。 如果節點上已有指定的應用程式封裝和版本,則不會重新部署,而會使用現有封裝。

    在共用集區的環境中,工作應用程式套件很實用:不同的工作在一個集區中執行,只要有工作未完成,就不會刪除集區。 如果您的作業擁有的工作少於集區中的節點,工作應用程式套件可以減少資料傳輸,因為您的應用程式只會部署至執行工作的節點。

    其他可受益於工作應用程式封裝的情節為執行大型應用程式,但只用於少數工作的作業。 例如,工作應用程式可能適用於重量級前置處理階段或合併工作。

使用應用程式套件,集區的啟動工作就不需要指定在節點上安裝一長串的個別資源檔案。 您不需要在 Azure 儲存體中或在節點上手動管理應用程式檔案的多個版本。 再者,您也不必費心產生 SAS URL 來提供這些檔案在 Azure 儲存體帳戶中的存取權限。 Batch 會在背景中與 Azure 儲存體合作來儲存應用程式套件,並將其部署到計算節點。

注意

啟動工作的總大小必須小於或等於 32,768 個字元,包括資源檔案和環境變數。 如果啟動工作超過此限制,就可另外選擇使用應用程式套件。 您也可以建立內含資源檔案的 .zip 檔,以 blob 方式將檔案上傳到 Azure 儲存體,然後從啟動工作的命令列解壓縮檔案。

上傳及管理應用程式

您可以使用 Azure 入口網站或 Batch Management API 來管理 Batch 帳戶中的應用程式套件。 下列各節會說明如何連結儲存體帳戶,以及您能夠了解如何在 Azure 入口網站中新增與管理應用程式和應用程式封裝。

注意

雖然您可以在ARM 範本Microsoft.Batch/batchAccounts 資源中定義應用程式值,但目前無法使用 ARM 範本上傳應用程式套件,在 Batch 帳戶中使用。 如新增應用程式中所述,您必須將這些封裝上傳至所連結的儲存體帳戶。

若要使用應用程式套件,您必須將 Azure 儲存體帳戶連結到您的 Batch 帳戶。 Batch 服務會使用相關聯的儲存體帳戶來儲存應用程式封裝。 在理想情況下,您應該特別建立儲存體帳戶,將其與 Batch 帳戶搭配使用。

如果尚未設定儲存體帳戶,Azure 入口網站會在您第一次選取 Batch 帳戶中左側導覽功能表中的 [應用程式] 時顯示警告。 如需將儲存體帳戶連結至 Batch 帳戶:

  1. 選取 [警告] 視窗,指出「沒有為此批次帳戶設定的儲存體帳戶」。
  2. 然後在下一頁選擇 [儲存體帳戶設定...]
  3. 選擇 [儲存體帳戶資訊] 一節中的 [選取儲存體帳戶] 連結。
  4. 在 [選擇儲存體帳戶] 窗格的清單中,選取您想要與這個批次帳戶搭配使用的儲存體帳戶。
  5. 然後選取頁面左上角的 [儲存]

在連結兩個帳戶之後,Batch 便能將儲存在連結之儲存體帳戶中的封裝自動部署到計算節點。

重要

應用程式封裝無法搭配設定防火牆規則,或將 [階層命名空間] 設定為 [已啟用] 的 Azure 儲存體帳戶。

Batch 服務會使用 Azure 儲存體將應用程式套件儲存為區塊 Blob。 針對區塊 Blob 資料,您需支付標準費用,而每個封裝的大小則不能超過區塊 Blob 大小上限。 如需詳細資訊,請參閱 Blob 儲存體的延展性和效能目標。 請務必考量應用程式套件的大小和數目,並定期移除過時的套件以降低成本。

加入新的應用程式

若要建立新的應用程式,請新增應用程式套件,並指定唯一的應用程式識別碼。

在 Batch 帳戶中,請選取左側導覽功能表中的 [應用程式],然後選取 [新增]

Screenshot of the New application creation process in the Azure portal.

輸入下列資訊:

  • 應用程式識別碼:新應用程式的識別碼。
  • 版本":要上傳的應用程式封裝版本。
  • 應用程式封裝:包含執行應用程式所需之應用程式二進位檔和支援檔案的 .zip 檔案。

您輸入的應用程式識別碼版本必須遵循下列要求:

  • 在 Windows 節點上,識別碼可包含英數字元、連字號及底線的任意組合。 在 Linux 節點上,只允許使用英數字元和底線。
  • 不得超過 64 個字元。
  • 在 Batch 帳戶內必須是唯一的。
  • 識別碼的大小寫會保留下來,但不區分大小寫。

當您準備好時,請選取 [提交]。 將 .zip 檔案上傳至 Azure 儲存體帳戶之後,入口網站會顯示一則通知。 視上傳的檔案大小和網路連線速度而定,此程序可能需要一些時間。

檢視目前的應用程式

若要檢視 Batch 帳戶中的應用程式,請選取左側導覽功能表中的 [應用程式]

Screenshot of the Applications menu item in the Azure portal.

選取此功能表選項會開啟 [應用程式] 視窗。 此視窗會顯示帳戶中每個應用程式的識別碼,以及下列屬性︰

  • 套件:與此應用程式相關聯的版本號碼。
  • 預設版本:如果部署應用程式時未指定任何版本,此為適用即安裝的應用程式版本。
  • 允許更新:指定是否允許更新與刪除套件。

若要查看計算節點上的應用程式套件檔案結構,請瀏覽至您在 Azure 入口網站中的 Batch 帳戶。 選取 [集區]。 然後選取包含該計算節點的集區。 選取安裝了應用程式套件的計算節點,然後開啟 applications 資料夾。

檢視應用程式詳細資料

若要查看應用程式的詳細資料,請在 [應用程式] 視窗中選取該應用程式。 您可以選擇左側導覽功能表中的 [設定] 來設定應用程式。

  • [允許更新]:指定可否更新或刪除應用程式套件。 預設值為 [是]。 如果設定為 [否],則無法更新或刪除現有的應用程式套件,但仍可以新增新的應用程式套件版本。
  • 預設版本:如未指定版本,則為部署應用程式時使用的預設應用程式封裝。
  • [顯示名稱]:Batch 解決方案顯示應用程式相關資訊時可以使用的易記名稱。 例如,您透過 Batch 提供給客戶的服務 UI 即可使用此名稱。

加入新應用程式封裝

若要新增現有應用程式的應用程式封裝版本,請在 Batch 帳戶的 [應用程式] 頁面上選取應用程式。 然後選取 [新增]。

就像處理新的應用程式一樣,指定新套件的 [版本],在 [應用程式套件] 欄位中上傳 .zip 檔案,然後選取 [提交]

更新或刪除應用程式封裝

若要更新或刪除現有的應用程式封裝,請在 Batch 帳戶的 [應用程式] 頁面中選取應用程式。 在您要修改的應用程式封裝資料列,選取省略符號。 然後選取要執行的動作。

Screenshot that shows the update and delete options for application packages in the Azure portal.

如果選取 [更新],您就能夠上傳新的 .zip 檔案。 上傳的檔案會取代您為該版本上傳的前一個 .zip 檔案。

如果選取 [刪除],您會看到確認刪除該版本的提示。 在選取 [確定] 之後,Batch 會從 Azure 儲存體帳戶中刪除該 .zip 檔案。 如果刪除應用程式的預設版本,系統會移除該應用程式的 [預設版本] 設定。

將應用程式安裝在計算節點上

您已了解如何在 Azure 入口網站中管理應用程式封裝。 現在,您可以了解如何將其部署至計算節點,並使用 Batch 工作加以執行。

安裝集區應用程式套件

若要將應用程式封裝安裝在集區中的所有計算節點上,請為集區指定一或多個應用程式封裝「參考」。 您為集區指定的應用程式封裝會安裝在加入集區的每個計算節點,以及重新啟動或重新安裝映像的所有節點上。

在 Batch .NET 中,請在建立新集區或使用現有集區時指定一或多個 CloudPool.ApplicationPackageReferencesApplicationPackageReference 類別能指定要安裝在集區之計算節點上的應用程式識別碼和版本。

// Create the unbound CloudPool
CloudPool myCloudPool =
    batchClient.PoolOperations.CreatePool(
        poolId: "myPool",
        targetDedicatedComputeNodes: 1,
        virtualMachineSize: "standard_d1_v2",
        VirtualMachineConfiguration: new VirtualMachineConfiguration(
            imageReference: new ImageReference(
                                publisher: "MicrosoftWindowsServer",
                                offer: "WindowsServer",
                                sku: "2019-datacenter-core",
                                version: "latest"),
            nodeAgentSkuId: "batch.node.windows amd64");

// Specify the application and version to install on the compute nodes
myCloudPool.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
    new ApplicationPackageReference {
        ApplicationId = "litware",
        Version = "1.1001.2b" }
};

// Commit the pool so that it's created in the Batch service. As the nodes join
// the pool, the specified application package is installed on each.
await myCloudPool.CommitAsync();

重要

如果應用程式封裝部署失敗,Batch 服務會將節點標示為無法使用,而且不會在該節點上排程任何要執行的工作。 如發生此情況,請重新啟動節點以重新初始化套件部署。 重新啟動節點也會在節點上再次啟用工作排程。

安裝工作應用程式套件

類似於集區,您可以為工作指定應用程式封裝「參考」。 在節點上排程要執行的工作時,會先下載並解壓縮套件,再執行工作的命令列。 如果節點上已安裝指定的套件和版本,則不會下載套件,而會使用現有套件裝。

若要安裝工作應用程式套件,請設定工作的 CloudTask.ApplicationPackageReferences 屬性:

CloudTask task =
    new CloudTask(
        "litwaretask001",
        "cmd /c %AZ_BATCH_APP_PACKAGE_LITWARE%\\litware.exe -args -here");

task.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
    new ApplicationPackageReference
    {
        ApplicationId = "litware",
        Version = "1.1001.2b"
    }
};

執行安裝的應用程式

您為集區或工作所指定的封裝會下載並解壓縮至節點的 AZ_BATCH_ROOT_DIR 中的具名目錄。 Batch 也會建立包含具名目錄路徑的環境變數。 在參考節點上的應用程式時,工作的命令列會使用這個環境變數。

在 Windows 節點上,變數格式如下:

Windows:
AZ_BATCH_APP_PACKAGE_APPLICATIONID#version

在 Linux 節點上,格式稍有不同。 句號 (.)、連字號 (-) 和數字記號 (#) 已壓平合併為環境變數中的底線。 另外,會保留應用程式識別碼的大小寫。 例如:

Linux:
AZ_BATCH_APP_PACKAGE_applicationid_version

APPLICATIONIDversion 是對應於為部署所指定的應用程式和套件版本的值。 例如,如果您指定應該在 Windows 節點上安裝 2.7 版的「Blender」應用程式,您的工作命令列就會使用此環境變數來存取其檔案:

Windows:
AZ_BATCH_APP_PACKAGE_BLENDER#2.7

在 Linux 節點上,以此格式指定環境變數。 將句號 (.)、連字號 (-) 和數字符號 (#) 壓平合併化為底線,並保留應用程式識別碼的大小寫:

Linux:
AZ_BATCH_APP_PACKAGE_blender_2_7

當您上傳應用程式套件時,您可以指定要部署至運算節點的預設版本。 如果您已經指定應用程式的預設版本,當您參考應用程式時就可以省略版本尾碼。 您可以在 Azure 入口網站中的 [應用程式] 視窗上指定預設應用程式版本,如上傳及管理應用程式中所示。

例如,如果您設定「2.7」作為「Blender」應用程式的預設版本,且您的工作是參考下列環境變數,您的 Windows 節點就會使用 2.7 版:

AZ_BATCH_APP_PACKAGE_BLENDER

下列程式碼片段會顯示工作命令列範例,其可啟動「Blender」 應用程式的預設版本︰

string taskId = "blendertask01";
string commandLine =
    @"cmd /c %AZ_BATCH_APP_PACKAGE_BLENDER%\blender.exe -args -here";
CloudTask blenderTask = new CloudTask(taskId, commandLine);

提示

如需計算節點環境設定的詳細資訊,請參閱工作的環境設定

更新集區的應用程式封裝

如果您已設定現有集區的應用程式封裝,可以指定集區的新封裝。 這表示:

  • Batch 服務會在加入新增集區的所有新節點,以及任何重新啟動或重新安裝映像的現有節點上安裝新指定的套件。
  • 在更新封裝參考時已存在集區中的計算節點不會自動安裝新應用程式封裝。 這些計算節點必須重新啟動或重新安裝映像才能接收新封裝。
  • 部署新的封裝之後,所建立的環境變數會反映新的應用程式封裝參考。

在此範例中,現有集區已將 Blender 應用程式的 2.7 版設定為其中一個 CloudPool.ApplicationPackageReferences。 若要將集區的節點更新為 2.76b 版,請將 ApplicationPackageReference 指定為新版本並認可變更。

string newVersion = "2.76b";
CloudPool boundPool = await batchClient.PoolOperations.GetPoolAsync("myPool");
boundPool.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
    new ApplicationPackageReference {
        ApplicationId = "blender",
        Version = newVersion }
};
await boundPool.CommitAsync();

既然您已設定新版本,Batch 服務就會將 2.76b 版安裝到任何加入集區的新節點。 若要將 2.76b 安裝在已存在集區中的節點上,請將節點重新啟動或重新安裝映像。 重新啟動的節點會保留上一個封裝部署的檔案。

列出 Batch 帳戶中的應用程式

您可以使用 ApplicationOperations.ListApplicationSummaries 方法列出 Batch 帳戶中的應用程式和應用程式套件。

// List the applications and their application packages in the Batch account.
List<ApplicationSummary> applications = await batchClient.ApplicationOperations.ListApplicationSummaries().ToListAsync();
foreach (ApplicationSummary app in applications)
{
    Console.WriteLine("ID: {0} | Display Name: {1}", app.Id, app.DisplayName);

    foreach (string version in app.Versions)
    {
        Console.WriteLine("  {0}", version);
    }
}

下一步