基於Dapr的 Azure 容器應用

微軟在 Ignite 2021 大會上發布了預覽版的Azure Container Apps,這是一個完全託管的無伺服器容器運行時,用於大規模構建和運行現代應用程式。從2021 年 11 月 2 日起,Azure 容器應用程式可在公共預覽中使用。雖在服務到達 GA 之前,Azure Container Apps 可能會發生變化。因此我們可以用來學習,不建議用於生產。


Azure Container Apps是什麼?

image

  • kubernetes 是目前最為強大的應用程式平台調度器,然而他很複雜,有著陡峭的學習曲線,雲原生計算基金會(CNCF)聯合Linux基金會推出了皆在考察相關從業者對Kubernetes的開發知識了解程度的認證考試Certified Kubernetes Application Developer (CKAD),通過CKAD考試後,持證者即被認可能夠為Kubernetes設計、構建、配置和部署雲原生應用,在Kubernetes中能夠定義應用程式資源,使用核心功能構建、監控和診斷可伸縮的應用程式。開發人員要通過CKAD考試的陡峭學習曲線,然後才能充分利用kubernetes提供的功能,Azure Container Apps 把這裡的陡峭學習曲線抹平了。
  • Azure Container Apps就是kubernetes之上的抽象層,是一種運行容器化應用程式的完全託管的服務。它讓你專註於構建應用程式,而不是管理配置kubernetes。
  • 利用Kubernetes Event-driven Autoscaling (KEDA) 縮放Container Apps,無論你是想根據CPU、記憶體等資源對應用縮放,還是基於消息隊列的長度對特定的負載進行縮放。
  • 利用分散式應用運行時 Dapr 輕鬆構建和連接微服務。 Dapr允許你構建松耦合的微服務應用程式,而不是構建一個分散式單體應用,在Azure Container Apps里我,們利用 Dapr 及其組件構建具有彈性、可擴展性和松耦合的應用程式
  • 利用Envoy proxy 路由外部進來的HTTP請求流量,Envoy就有強大的網路代理功能,我們基本不需要配置就可以實現強大的功能,比如金絲雀發布
  • 您可以隨時可以從 Azure Container Apps 升級到更自主的 Azure Kubernetes 服務 (AKS),並釋放kubernetes 的全部力量。

Azure Container Apps的核心組件

Azure Container Apps有一系列組件,我們必須了解並利用這些組件來構建企業級雲本地應用程式。

image

  • Container:我們可以在Azure Container Apps里運行容器,這些容器和k8s 一樣可以從各種容器倉庫中拉取容器鏡像,和k8s 一樣,Azure Container Apps 也是用Pod 作為運行容器的最小單位,我們可以在Pods里定義多個容器,這個k8s 上通常的SideCar 模式就是這樣的,Pod的所有容器共享硬碟和網路資源。目前 Azure Container Apps只支援Linux 容器。
  • Revisions:Revision 表示Pod的不可變快照,至少有一個Revision,這是初始部署的時候自動創建的。通常我們會在某個時間點對Pod 做多次的Revision,以實現金絲雀發布和A/B測試.
  • Container Apps: 容器應用程式包括至少一個Revision 。每個容器應用程式都可以進行主動和非活動Revision 。但是,它至少有一個主動Revision 。如果不再需要Revision ,我們可以停用Revision 。(我們還可以重新激活非活動Revision )
  • Environment: Environment 至少有一個容器應用程式組成。每個環境是一個安全邊界,這意味著其所有容器應用程式都部署到專用的 Azure 虛擬網路中。所有由Environment 內部容器產生的日誌都發送到專用的 Azure Log Analytics 。


下面我們就來玩一下Azure Container App 體驗一下,部署一個簡單的容器到Azure容器應用程式,具體文檔參見 //docs.microsoft.com/zh-cn/azure/container-apps/get-started?tabs=bash

需要注意的是當前Azure Container App 只在 北歐(northeurope) 和加拿大中部 (canadacentral)這兩個區域可用

首先,我們必須為 Azure CLI 安裝 Azure Container App 擴展。

az extension add \
   –source //workerappscliextension.blob.core.windows.net/azure-cli-extension/containerapp-0.2.0-py2.py3-none-any.whl

設置以下環境變數:

RESOURCE_GROUP=”my-containerapps”
LOCATION=”canadacentral”
LOG_ANALYTICS_WORKSPACE=”containerapps-logs”
CONTAINERAPPS_ENVIRONMENT=”containerapps-env”

定義這些變數後,可以創建一個資源組來組織與新容器應用相關的服務。

az group create \
   –name $RESOURCE_GROUP \
   –location “$LOCATION”

升級 CLI 並提供新的資源組後,可以創建容器應用環境並部署容器應用。

創建環境

Azure 容器應用中的環境圍繞一組容器應用創建安全邊界。 部署到相同環境的容器應用部署在同一虛擬網路中,並將日誌寫入同一個 Log Analytics 工作區。

Azure Log Analytics 用於監視創建容器應用環境時所需的容器應用。

使用以下命令創建新的 Log Analytics 工作區:

az monitor log-analytics workspace create \
   –resource-group $RESOURCE_GROUP \
   –workspace-name $LOG_ANALYTICS_WORKSPACE

接下來,檢索 Log Analytics 客戶端 ID 和客戶端密碼。請確保單獨運行每個查詢,以便有足夠的時間完成請求。

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az monitor log-analytics workspace show –query customerId -g $RESOURCE_GROUP -n $LOG_ANALYTICS_WORKSPACE –out tsv`

LOG_ANALYTICS_WORKSPACE_CLIENT_SECRET=`az monitor log-analytics workspace get-shared-keys –query primarySharedKey -g $RESOURCE_GROUP -n $LOG_ANALYTICS_WORKSPACE –out tsv`

單個容器應用部署到 Azure 容器應用環境。 若要創建環境,請運行以下命令:

az containerapp env create \
   –name $CONTAINERAPPS_ENVIRONMENT \
   –resource-group $RESOURCE_GROUP \
   –logs-workspace-id $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
   –logs-workspace-key $LOG_ANALYTICS_WORKSPACE_CLIENT_SECRET \

執行到這裡的時候報錯了

Command group ‘containerapp env’ is in preview and under development. Reference and support levels: //aka.ms/CLI_refstatus
MissingRegistrationForLocation: The subscription is not registered for the resource type ‘kubeEnvironments’ in the location ‘canadacentral’. Please re-register for this provider in order to have access to this location.

後面我們用Azure的Portal 頁面來進行下面的實驗

image

image

image

image

通過Portal 進行創建也失敗了。