分享方式:


Azure 容器應用程式上的 .NET 概觀

若要將 .NET 應用程式部署至 Azure 容器應用程式之類的雲端原生環境,您需要做出決策,以確保應用程式順利且安全地執行。 本指南涵蓋將 .NET 應用程式部署至 Azure 容器應用程式的相關重要概念。

Azure 容器應用程式是完全受控無伺服器容器服務,可讓您執行容器化應用程式,而不需要管理基礎結構。 容器應用程式包含內建功能支援,包括自動調整、健康情況檢查,以及傳輸層安全性 (TLS) 憑證。

本文詳述您在 Azure 容器應用程式上部署 .NET 應用程式時的重要概念和考量。

選取資源類型

容器應用程式支援兩種類型的資源:應用程式和作業。 應用程式會持續執行服務,而作業是短期工作,其設計目的是要執行到完成。

當您準備部署應用程式時,請考慮這兩種應用程式類型之間的差異,因為其行為會影響您管理 .NET 應用程式的方式。 下表說明應用程式與作業之間使用案例的差異。

使用案例 資源類型
提供 HTTP 要求的 ASP.NET Core Web API App
處理某些資料然後結束的 .NET Core 主控台應用程式 工作 (Job)
持續執行背景服務可處理來自佇列的訊息 App
映像最佳化服務僅在大型映像儲存到儲存體帳戶時執行。 工作 (Job)
使用 Hangfire、Quartz.NET 或 Azure WebJobs SDK 等架構的應用程式 App

容器化及部署 .NET 應用程式

針對應用程式或作業,您必須建置容器映像來封裝 .NET 應用程式。 如需建置容器映像的詳細資訊,請參閱 ASP.NET Core 的 Docker 映像

設定之後,您可以遵循下列指南,將應用程式部署至 Azure 容器應用程式:

使用 HTTP 輸入

Azure 容器應用程式包含內建 HTTP 輸入,可讓您將應用程式公開至來自容器外部的流量。 容器應用程式輸入位於您的應用程式與終端使用者之間。 由於輸入會作為中繼,因此無論終端使用者看到什麼都會在輸入中結束,無論您的應用程式看到什麼都會從輸入開始。

輸入會管理 TLS 終止和自訂網域,讓您不需要在應用程式中手動設定。 透過輸入,連接埠 443 會針對 HTTPS 流量公開,連接埠 80 會選擇性針對 HTTP 流量公開。 輸入會將要求轉送至應用程式的目標連接埠。

如果您的應用程式需要原始要求的中繼資料,可以使用 X 轉送標頭

若要深入了解,請參閱 Azure 容器應用程式的 HTTP 輸入

定義目標連接埠

為了接收流量,輸入是在應用程式接聽流量的目標連接埠上設定。

ASP.NET Core 在容器中執行時,應用程式會接聽容器映像中所設定的連接埠。 當您使用官方 ASP.NET Core 映像時,您的應用程式會設定為在預設連接埠上接聽 HTTP。 預設連接埠取決於 ASP.NET Core 版本。

執行階段 目標連接埠
ASP.NET Core 7 和更早版本 80
ASP.NET Core 8 和更新版本 8080

當您設定輸入時,請將目標連接埠設定為您所使用容器映像對應的號碼。

定義 X 轉送標頭

當輸入處理原始 HTTP 要求時,您的應用程式會將輸入視為用戶端。 在某些情況下,您的應用程式必須知道原始用戶端的 IP 位址或原始通訊協定 (HTTP 或 HTTPS)。 您可以透過要求的 X-Forwarded-* 標頭來存取通訊協定和 IP 資訊。

您可以藉由存取 ForwardedHeaders 物件,從這些標頭讀取原始值。

builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders =
        ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    options.KnownNetworks.Clear();
    options.KnownProxies.Clear();
});

如需使用要求標頭的詳細資訊,請參閱設定 ASP.NET Core 以使用 Proxy 伺服器和負載平衡器

建置雲端原生 .NET 應用程式

當您以雲端原生原則為基礎建置時,部署至容器應用程式的應用程式通常運作狀況最佳。 下列各節有助於詳細說明有關雲端原生應用程式的常見考量。

應用程式設定

將 .NET 應用程式部署至 Azure 容器應用程式時,請使用環境變數來儲存組態資訊,而不是使用 appsettings.json。 這種做法可讓您在不同的環境中以不同方式設定應用程式。 此外,使用環境變數可讓您更輕鬆地管理組態值,而不需要重建和重新部署容器映像。

在 Azure 容器應用程式中,當您定義應用程式或作業的容器時,您會設定環境變數。 將敏感性值儲存在祕密中,並將其參考為環境變數。 若要深入了解管理祕密,請參閱管理 Azure 容器應用程式中的祕密

受控識別

Azure 容器應用程式支援受控識別,可讓您的應用程式存取其他 Azure 服務,而不需要交換認證。 若要深入了解 Azure 服務之間的安全通訊,請參閱 Azure 容器應用程式中的受控識別

記錄

在雲端原生環境中,記錄對於監視和疑難排解您的應用程式至關重要。 根據預設,Azure 容器應用程式會使用 Azure Log Analytics 從您的容器收集記錄。 您可以設定其他記錄提供者。 若要深入了解應用程式記錄,請參閱 Azure 容器應用程式中的記錄儲存體和監視選項

當您設定將記錄寫入主控台的記錄提供者時,Azure 容器應用程式會為您收集及儲存記錄訊息。

健康情況探查

Azure 容器應用程式包含健全狀態探查的內建支援,可讓您監視應用程式的健康情況。 如果探查判斷您的應用程式處於狀況不良狀態,則您的容器會自動重新啟動。 若要深入了解健全狀態探查,請參閱 Azure 容器應用程式中的健全狀態探查

若要獲得實作自訂邏輯來判斷應用程式健康情況的機會,您可以設定健康情況檢查端點。 若要深入了解健康情況檢查端點,請參閱 ASP.NET Core 中的健康情況檢查

自動調整考量

根據預設,Azure 容器應用程式會根據傳入的 HTTP 要求數目,自動調整 ASP.NET Core 應用程式。 您也可以根據其他計量來設定自訂自動調整規則,例如 CPU 或記憶體使用量。 若要深入了解調整,請參閱在 Azure 容器應用程式中設定調整規則

在 .NET 8.0.4 和更新版本中,使用資料保護的 ASP.NET Core 應用程式會自動設定為讓所有複本隨著應用程式調整而存取受保護的資料。 當您的應用程式開始調整時,金鑰管理員會跨多個修訂處理寫入和共用金鑰。 部署應用程式時,環境變數 autoConfigureDataProtection 會自動設定 true 以啟用此功能。 如需此自動設定的詳細資訊,請參閱此 GitHub 提取要求

自動調整會根據您定義的規則,變更應用程式的複本數目。 根據預設,容器應用程式會隨機將傳入流量路由傳送至 ASP.NET Core 應用程式的複本。 由於流量可以在不同的複本之間分割,您的應用程式應該為無狀態,因此您的應用程式不會遇到狀態相關問題。

防偽、驗證、SignalR、Blazor Server 和 Razor Pages 等功能取決於資料保護,因此在調整為多個複本時,需要額外的設定才能正確運作。

設定資料保護

ASP.NET Core 具有特殊功能來保護和取消保護資料,例如工作階段資料和防偽權杖。 根據預設,資料保護金鑰會儲存在檔案系統上,這不適用於雲端原生環境。

如果您要部署 .NET Aspire 應用程式,系統會自動為您設定資料保護。 在所有其他情況下,您必須手動設定資料保護

設定 ASP.NET Core SignalR

ASP.NET Core SignalR 需要一個後擋板,才能將訊息散發到多個伺服器複本。 使用 SignalR 將 ASP.NET Core 應用程式部署至 Azure 容器應用程式時,您必須設定其中一個支援的後擋板,例如 Azure SignalR Service 或 Redis。 若要深入了解後擋板,請參閱 ASP.NET Core SignalR 裝載和調整

設定 Blazor Server

ASP.NET Core Blazor Server 應用程式在伺服器上儲存狀態,這表示每個用戶端必須在工作階段期間連線到相同的伺服器複本。 將 Blazor Server 應用程式部署至 Azure 容器應用程式時,您必須啟用黏性工作階段,以確保用戶端已路由傳送至相同的複本。 若要深入了解,請參閱 Azure 容器應用程式中的工作階段親和性