教學課程:在已啟用 Azure Arc 的 Kubernetes 上啟用 Azure 容器應用程式

此教學準備一個支援的 Kubernetes 叢集以執行 Azure 容器應用程式。 它建立一個支援 Azure Arc 的 Kubernetes 叢集,安裝容器應用程式擴充功能,建立自訂位置,並建立一個容器應用程式連接的環境。

完成這個教學後,你的 Azure 訂閱和 Kubernetes 叢集都會被更改。 你需要 Azure 權限來建立列出的資源,並且有叢集管理員權限存取 Kubernetes 叢集。

本教學示範如何在啟用 Azure Arc 的 Kubernetes 叢集上啟用 Azure 容器應用程式。 在本教學課程中,您會:

  • 如果 Kubernetes 叢集還沒連接,就把它連接到 Azure Arc。
  • 可選擇建立 Log Analytics 工作區。
  • 安裝並驗證容器應用程式擴充功能。
  • 建立並驗證自訂地點。
  • 建立並驗證一個與容器應用程式連結的環境。

開始前,先檢視 Azure Arc 上的 Azure 容器應用程式。如果某個資源或叢集內元件尚未準備好,請參閱「Troubleshoot Azure 容器應用程式 on Azure Arc-enabled Kubernetes」。

先決條件

在開始之前,請確認以下要求:

  • 具有有效訂用帳戶的 Azure 帳戶。 如果你還沒有,可以 免費建立一個。
  • 允許註冊資源提供者及建立資源群組、啟用 Azure Arc 的 Kubernetes 資源、叢集擴充功能、自訂位置、連接容器應用程式的環境,以及可選的 Log Analytics 工作空間。
  • Azure CLI 及其前置條件。
  • 一個與您的 Kubernetes 叢集相容的kubectl版本,以及從您的工作站到 Kubernetes API 伺服器的網路存取權。
  • 一個支援的 Kubernetes 叢集,具備 Linux amd64 工作節點,並透過主動 kubectl 上下文進行叢集管理員存取。
  • 一個可運作的 Kubernetes LoadBalancer 服務實作。
  • Azure Arc 和容器應用程式所需端點的對外連線能力。
  • 具備足夠的可分配 CPU 與記憶體以應付擴充功能與應用程式工作負載。

在變更生產叢集之前,請先參閱 規劃已啟用 Azure Arc 的 Kubernetes 上的 Container Apps 部署。

安裝程式

安裝下列 Azure CLI 延伸模組。

az extension add --name connectedk8s --upgrade --yes
az extension add --name k8s-extension --upgrade --yes
az extension add --name customlocation --upgrade --yes
az extension add --name containerapp --upgrade --yes

註冊必要的命名空間。

az provider register --namespace Microsoft.ExtendedLocation --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait
az provider register --namespace Microsoft.App --wait
az provider register --namespace Microsoft.Web --wait
az provider register --namespace Microsoft.OperationalInsights --wait

根據您的 Kubernetes 叢集部署設定環境變數。

GROUP_NAME="my-arc-cluster-group"
AKS_CLUSTER_GROUP_NAME="my-aks-cluster-group"
AKS_NAME="my-aks-cluster"
LOCATION="eastus"

建立連線的叢集

如果您在 $GROUP_NAME 中已經有受支援的已啟用 Azure Arc 的 Kubernetes 叢集,就不要再建立另一個叢集。 設定CLUSTER_NAME為現有的 connected-cluster 資源名稱,用 kubectl get nodes驗證存取權限,然後繼續建立 Log Analytics 工作區。

以下步驟建立 AKS 叢集並連接到 Azure Arc。此路徑僅作為教學的 Azure 主機評估環境。 對於現有的本地或多雲叢集,請依照快速啟動:將現有的 Kubernetes 叢集連接到 Azure Arc,然後返回此教學。

  1. 在 Azure Kubernetes 服務中建立叢集。

    az group create --name $AKS_CLUSTER_GROUP_NAME --location $LOCATION
    az aks create \
       --resource-group $AKS_CLUSTER_GROUP_NAME \
       --name $AKS_NAME \
       --enable-aad \
       --generate-ssh-keys
    
  2. 取得 kubeconfig 檔案,並測試您與叢集的連線。 根據預設,kubeconfig 檔案會儲存至 ~/.kube/config。

    az aks get-credentials --resource-group $AKS_CLUSTER_GROUP_NAME --name $AKS_NAME --admin
    
    kubectl get ns
    
  3. 建立資源群組,並在其中納入您的 Azure Arc 資源。

    az group create --name $GROUP_NAME --location $LOCATION
    
  4. 將您建立的叢集連線到 Azure Arc。

    CLUSTER_NAME="${GROUP_NAME}-cluster" # Name of the connected cluster resource
    
    az connectedk8s connect --resource-group $GROUP_NAME --name $CLUSTER_NAME
    
  5. 等待已連線的叢集完成佈建。

    CONNECTED_CLUSTER_ID=$(az connectedk8s show \
        --resource-group $GROUP_NAME \
        --name $CLUSTER_NAME \
        --query id \
        --output tsv)
    
    az resource wait --ids $CONNECTED_CLUSTER_ID --created --timeout 600
    
    az connectedk8s show \
        --resource-group $GROUP_NAME \
        --name $CLUSTER_NAME \
        --query "{State:provisioningState,Connectivity:connectivityStatus}" \
        --output table
    

    僅當 State 為 Succeeded 且 Connectivity 為 Connected 時,才繼續。 如果指令逾時,請參閱 已連線的叢集尚未準備就緒。

建立 Log Analytics 工作區

Log Analytics 工作區可讓您存取在已啟用 Azure Arc 的 Kubernetes 叢集上執行之容器應用程式的應用程式記錄。 Log Analytics 工作區是可選的,但建議用於應用程式診斷。

重要事項

在安裝容器應用程式擴充功能前,先決定是否使用 Log Analytics。 在安裝擴充功能時提供 Log Analytics 設定。 你無法在之後把 Log Analytics 設定加到那個擴充實例裡。

  1. 建立 Log Analytics 工作區。

    WORKSPACE_NAME="$GROUP_NAME-workspace" # Name of the Log Analytics workspace
    
    az monitor log-analytics workspace create \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME
    
  2. 執行下列命令,以取得現有 Log Analytics 工作區的編碼工作區識別碼和共用金鑰。 您在接下來的步驟中需要這些資料。

    注意事項

    工作區共享金鑰是憑證。 不要列印、不要提交到原始碼控制、不要儲存在 shell 歷史,或是包含在支援套件中。 以下指令會將它保留在 shell 變數中,並以受保護的擴充功能設定傳給 Azure。

    LOG_ANALYTICS_WORKSPACE_ID=$(az monitor log-analytics workspace show \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME \
        --query customerId \
        --output tsv)
    LOG_ANALYTICS_WORKSPACE_ID_ENC=$(printf %s $LOG_ANALYTICS_WORKSPACE_ID | base64 -w0) # Needed for the next step
    LOG_ANALYTICS_KEY=$(az monitor log-analytics workspace get-shared-keys \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME \
        --query primarySharedKey \
        --output tsv)
    LOG_ANALYTICS_KEY_ENC=$(printf %s $LOG_ANALYTICS_KEY | base64 -w0) # Needed for the next step
    

檢查現有的 KEDA 安裝

Container Apps 擴充功能會安裝 KEDA。 安裝擴充功能前,請檢查叢集中現有的 KEDA 元件:

kubectl get deployments -A -o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name"
kubectl get crd scaledobjects.keda.sh

檢查部署清單中的 KEDA 元件。 如果任一指令偵測到現有的 KEDA 安裝,請先停止,並在繼續之前確認支援的共存設定。 不要移除現有的 KEDA 安裝或套用未公開的擴充功能設定,因為其他工作負載可能會依賴它。

安裝容器應用程式延伸模組

重要事項

如果你要部署到 Azure Local 的 AKS,請確保在安裝擴充功能前先設定好 HAProxy 或自訂負載平衡器。 你也可以用 az containerapp arc setup-core-dns --distro AksAzureLocal 來設定 CoreDNS 來支援本地環境。

  1. 為 容器應用程式擴充功能、其 Kubernetes 命名空間及連接環境設定名稱。

    • EXTENSION_NAME 用來識別 Azure 叢集延伸模組資源。
    • NAMESPACE 在 Kubernetes 叢集中建立,包含擴充元件及容器應用程式管理的資源。 appsNamespace設定必須完全符合擴充功能釋出的命名空間。
    • CONNECTED_ENVIRONMENT_NAME 成為預設應用程式域的一部分。 使用資源群組中唯一且符合 DNS 相容的名稱。

    不要在擴充名命名空間安裝無關的工作負載。

    EXTENSION_NAME="appenv-ext"
    NAMESPACE="appplat-ns"
    CONNECTED_ENVIRONMENT_NAME="<connected-environment-name>"
    
  2. 將容器應用程式延伸模組安裝到已啟用 Log Analytics 的 Azure Arc 連線叢集。 Log Analytics 稍後無法新增至延伸模組。

    az k8s-extension create \
        --resource-group $GROUP_NAME \
        --name $EXTENSION_NAME \
        --cluster-type connectedClusters \
        --cluster-name $CLUSTER_NAME \
        --extension-type 'Microsoft.App.Environment' \
        --release-train stable \
        --auto-upgrade-minor-version true \
        --scope cluster \
        --release-namespace $NAMESPACE \
        --configuration-settings "Microsoft.CustomLocation.ServiceAccount=default" \
        --configuration-settings "appsNamespace=${NAMESPACE}" \
        --configuration-settings "clusterName=${CONNECTED_ENVIRONMENT_NAME}" \
        --configuration-settings "logProcessor.appLogs.destination=log-analytics" \
        --config-protected-settings "logProcessor.appLogs.logAnalyticsConfig.customerId=${LOG_ANALYTICS_WORKSPACE_ID_ENC}" \
        --config-protected-settings "logProcessor.appLogs.logAnalyticsConfig.sharedKey=${LOG_ANALYTICS_KEY_ENC}"
    

    附註

    若要安裝不整合 Log Analytics 的擴充功能,請從指令中移除三個與日誌相關的參數。

    對於使用自訂負載平衡器的叢集,設定 loadBalancerIp 為保留給容器應用程式入口的位址:

    --configuration-settings "loadBalancerIp=<LOAD_BALANCER_INGRESS_IP>"
    

    該位址必須是應用程式用戶端可存取的,且不得被指派給其他服務。 安裝後,請用 kubectl get service -n $NAMESPACE -o wide 來驗證分機入口服務是否回報這個位址。 只有在地址分配好後才設定通配碼DNS。 請參閱 DNS 要求。

    下表描述執行此命令時的各種 --configuration-settings 參數:

    參數 描述
    Microsoft.CustomLocation.ServiceAccount 針對自訂位置建立的服務帳戶。 將 [值] 設定為 default。
    appsNamespace 用來建立應用程式定義和修訂的命名空間。 它必須符合延伸模組版本命名空間。
    clusterName 針對此延伸模組建立的容器應用程式延伸模組 Kubernetes 環境名稱。
    logProcessor.appLogs.destination 選擇性。 應用程式記錄的目的地。 接受 log-analytics 或 none,選擇 [none] 會停用平台記錄。
    logProcessor.appLogs.logAnalyticsConfig.customerId 只有當 logProcessor.appLogs.destination 設定為 log-analytics 時才需要。 base64 編碼的 Log Analytics 工作區 ID。 此參數應設定為受保護的設定。
    logProcessor.appLogs.logAnalyticsConfig.sharedKey 只有當 logProcessor.appLogs.destination 設定為 log-analytics 時才需要。 以 base64 編碼的 Log Analytics 工作區共用金鑰。 此參數應設定為受保護的設定。
    loadBalancerIp 負載平衡器的入口 IP。
  3. 儲存容器應用程式延伸模組的 id 屬性供稍後使用。

    EXTENSION_ID=$(az k8s-extension show \
        --cluster-type connectedClusters \
        --cluster-name $CLUSTER_NAME \
        --resource-group $GROUP_NAME \
        --name $EXTENSION_NAME \
        --query id \
        --output tsv)
    
  4. 等候延伸模組完整安裝,再繼續進行。

    az resource wait --ids $EXTENSION_ID --created --timeout 1200
    
    az k8s-extension show \
        --cluster-type connectedClusters \
        --cluster-name $CLUSTER_NAME \
        --resource-group $GROUP_NAME \
        --name $EXTENSION_NAME \
        --query "{State:provisioningState,Version:currentVersion}" \
        --output table
    

    僅在 State 為 Succeeded 時,才繼續。 如果指令逾時或回報失敗,請參見 擴充套件安裝失敗或逾時。

  5. 檢視擴充工作負載、服務及近期事件:

    kubectl get pods -n $NAMESPACE
    kubectl get services -n $NAMESPACE -o wide
    kubectl get events -n $NAMESPACE --sort-by=.lastTimestamp
    

    當擴充功能 Pod 處於 Pending 狀態、反覆重新啟動,或意外地未就緒時,請勿建立自訂位置。 若要深入了解這些 Pod 及其在系統中的角色,請參閱 Azure Arc 概觀。

  6. 如果你設定了 Log Analytics,請清除包含工作區金鑰的本地變數。

    unset LOG_ANALYTICS_KEY LOG_ANALYTICS_KEY_ENC
    

建立自訂位置

自訂位置是您指派給 Azure 容器應用程式連線環境的 Azure 位置。

  1. 請將下列環境變數設定為需要的自訂位置名稱,以及 Azure Arc 連線叢集的識別碼。

    CUSTOM_LOCATION_NAME="my-custom-location" # Name of the custom location
    CONNECTED_CLUSTER_ID=$(az connectedk8s show --resource-group $GROUP_NAME --name $CLUSTER_NAME --query id --output tsv)
    
  2. 建立自訂位置:

    az customlocation create \
        --resource-group $GROUP_NAME \
        --name $CUSTOM_LOCATION_NAME \
        --host-resource-id $CONNECTED_CLUSTER_ID \
        --namespace $NAMESPACE \
        --cluster-extension-ids $EXTENSION_ID
    

    附註

    如果你在叢集上建立自訂位置有困難,可能需要 啟用叢集上的自訂位置功能。 在使用服務主體或擁有限制叢集資源權限的 Microsoft Entra 使用者登入 CLI 時,啟用此功能。

  3. 等自訂位置完成配置並儲存其資源 ID。

    CUSTOM_LOCATION_ID=$(az customlocation show \
        --resource-group $GROUP_NAME \
        --name $CUSTOM_LOCATION_NAME \
        --query id \
        --output tsv)
    
    az resource wait --ids $CUSTOM_LOCATION_ID --created --timeout 600
    
    az customlocation show \
        --resource-group $GROUP_NAME \
        --name $CUSTOM_LOCATION_NAME \
        --query "{State:provisioningState,Host:hostResourceId,Namespace:namespace}" \
        --output table
    

    檢查 State 是否為 Succeeded、Host 可識別出您想要連線的叢集,且 Namespace 與 $NAMESPACE 相符。 如果配置失敗,請參見 自訂位置建立失敗。

建立 Azure 容器應用程式連線環境

開始在自訂位置上建立應用程式之前,您需要 Azure 容器應用程式連線環境。

  1. 建立容器應用程式連線環境:

    az containerapp connected-env create \
        --resource-group $GROUP_NAME \
        --name $CONNECTED_ENVIRONMENT_NAME \
        --custom-location $CUSTOM_LOCATION_ID \
        --location $LOCATION
    
  2. 等連線環境完成配置。

    CONNECTED_ENVIRONMENT_ID=$(az containerapp connected-env show \
        --resource-group $GROUP_NAME \
        --name $CONNECTED_ENVIRONMENT_NAME \
        --query id \
        --output tsv)
    
    az resource wait --ids $CONNECTED_ENVIRONMENT_ID --created --timeout 900
    
    az containerapp connected-env show \
        --resource-group $GROUP_NAME \
        --name $CONNECTED_ENVIRONMENT_NAME \
        --query "{State:properties.provisioningState,Location:location,CustomLocation:extendedLocation.name,Domain:properties.defaultDomain}" \
        --output yaml
    

    只有當 State 為 Succeeded,且 CustomLocation 與你在本教學課程中建立的自訂位置相符時,才繼續進行。 將顯示 Domain 的設定存為應用程式 DNS 設定。 若配置失敗,請參閱 「連接環境建立失敗」。

後續步驟