快速入門:在 Azure Kubernetes Service 中使用 Azure 應用程式組態

在 Kubernetes 中,您已設定 Pod 取用 ConfigMaps 中的組態。 您可以藉此將組態與容器映像分離,以便您的應用程式易於移植。 Azure 應用程式組態 Kubernetes 提供者可以從 Azure 應用程式組態中的金鑰值和金鑰保存庫參考建構 ConfigMap 和祕密。 您可以藉此利用 Azure 應用程式組態來集中儲存和管理組態,而不需要變更應用程式的程式碼。

ConfigMap 可以取用為環境變數或掛接的檔案。 在本快速入門中,您會將 Azure 應用程式組態 Kubernetes 提供者併入 Azure Kubernetes Service 工作負載中,您可以在其中執行從 JSON 檔案取用組態的簡單 ASP.NET Core 應用程式。

提示

請參閱 Kubernetes 中裝載的工作負載選項,以存取 Azure 應用程式組態。

注意

本快速入門將逐步引導您設定 Azure 應用程式組態 Kubernetes 提供者。 您可以選擇性地使用下列 Azure Developer CLI 命令搭配 azure-appconfig-aks 範本,以佈建 Azure 資源以及部署本快速入門所使用的範例應用程式。 如需有關此範本的詳細資訊,請瀏覽 GitHub 上的 azure-appconfig-aks 存放庫。

azd init -t azure-appconfig-aks
azd up

必要條件

建立在 AKS 中執行的應用程式

在本節中,您將建立在 Azure Kubernetes Service (AKS) 中執行的簡單 ASP.NET Core Web 應用程式。 應用程式會從本地 JSON 檔案讀取組態。 在下一節中,您將能夠從 Azure 應用程式組態取用組態,而不需變更應用程式的程式碼。 如果您已經有 AKS 應用程式從檔案讀取組態,請略過本節並移至使用應用程式組態 Kubernetes 提供者。 您只需要確定提供者所產生的組態檔符合應用程式所使用的檔案路徑。

建立應用程式

  1. 使用 .NET 命令列介面 (CLI) 並執行下列命令,以在新的 MyWebApp 目錄中建立新的 ASP.NET Core Web 應用程式專案:

    dotnet new webapp --output MyWebApp --framework net6.0
    
  2. 在 Pages 目錄中開啟 Index.cshtml,並使用下列程式碼更新內容。

    @page
    @model IndexModel
    @using Microsoft.Extensions.Configuration
    @inject IConfiguration Configuration
    @{
        ViewData["Title"] = "Home page";
    }
    
    <style>
        h1 {
            color: @Configuration["Settings:FontColor"];
        }
    </style>
    
    <div class="text-center">
        <h1>@Configuration["Settings:Message"]</h1>
    </div>
    
  3. 在專案的根中建立 config 目錄,並使用下列內容將 mysettings.json 檔案新增至其中。

    {
      "Settings": {
        "FontColor": "Black",
        "Message": "Message from the local configuration"
      }
    }
    
  4. 開啟 program.cs,並藉由呼叫 AddJsonFile 方法,將 JSON 檔案新增至組態來源。

    // Existing code in Program.cs
    // ... ...
    
    // Add a JSON configuration source 
    builder.Configuration.AddJsonFile("config/mysettings.json", reloadOnChange: true, optional: false);
    
    var app = builder.Build();
    
    // The rest of existing code in program.cs
    // ... ...
    

將應用程式容器化

  1. 執行 dotnet publish 命令,以發行模式建置應用程式,並在已發佈的目錄中建立資產。

    dotnet publish -c Release -o published
    
  2. 在專案目錄的根目錄建立名為 Dockerfile 的檔案、在文字編輯器中開啟,並且輸入下列內容。 Dockerfile 是沒有副檔名且用來建立容器映像的文字檔。

    FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
    WORKDIR /app
    COPY published/ ./
    ENTRYPOINT ["dotnet", "MyWebApp.dll"]
    
  3. 執行下列命令,以建置名為 aspnetapp 的容器映像。

    docker build --tag aspnetapp .
    

將映像推送至 Azure Container Registry

  1. 執行 az acr login 命令來登入您的容器登錄。 下列範例會登入名為 myregistry 的登錄。 將登入名稱改成您的登入名稱。

    az acr login --name myregistry
    

    登入成功後,命令就會傳回 Login Succeeded

  2. 使用 docker 標籤建立映像 aspnetapp 的標籤 myregistry.azurecr.io/aspnetapp:v1

    docker tag aspnetapp myregistry.azurecr.io/aspnetapp:v1
    

    提示

    若要檢閱現有 Docker 映像和標籤清單,請執行 docker image ls。 在此案例中,您應該會看到至少兩個映像:aspnetappmyregistry.azurecr.io/aspnetapp

  3. 使用 docker push 將映射上傳至容器登錄。 例如,下列命令會將映射推送至名為 aspnetapp 而且其標記 v1 在登錄 myregistry 下的存放庫。

    docker push myregistry.azurecr.io/aspnetapp:v1
    

部署應用程式

  1. 在專案的根目錄中建立部署目錄。

  2. 使用下列內容將 deployment.yaml 檔案新增至部署目錄,以建立部署。 將 template.spec.containers.image 的值 取代為您在上一個步驟中建立的映像。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aspnetapp-demo
      labels:
        app: aspnetapp-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aspnetapp-demo
      template:
        metadata:
          labels:
            app: aspnetapp-demo
        spec:
          containers:
          - name: aspnetapp
            image: myregistry.azurecr.io/aspnetapp:v1
            ports:
            - containerPort: 80
    
  3. 使用下列內容將 service.yaml 檔案新增至部署目錄,以建立 LoadBalancer 服務。

    apiVersion: v1
    kind: Service
    metadata:
      name: aspnetapp-demo-service
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: aspnetapp-demo
    
  4. 執行下列命令,將應用程式部署至 AKS 叢集。

    kubectl create namespace appconfig-demo
    kubectl apply -f ./Deployment -n appconfig-demo
    
  5. 執行下列命令,並取得 LoadBalancer 服務公開的外部 IP 位址。

    kubectl get service aspnetapp-demo-service -n appconfig-demo
    
  6. 開啟瀏覽器視窗,並且瀏覽至上一個步驟中取得的 IP 位址。 網頁如下所示:

    螢幕擷取畫面,其中顯示使用 configMap 之前的 Kubernetes 提供者。

使用應用程式組態 Kubernetes 提供者

既然您已在 AKS 中執行應用程式,您將會將應用程式組態 Kubernetes 提供者部署到以 Kubernetes 控制器身分執行的 AKS 叢集。 提供者會從應用程式組態存放區擷取資料,並建立 ConfigMap,該檔案會做為在資料磁碟區中掛接的 JSON 檔案。

設定 Azure 應用程式組態存放區

將下列金鑰值新增至應用程式組態存放區,並將標籤內容類型保留預設值。 如需如何使用 Azure 入口網站或 CLI 將金鑰值新增至存放區的詳細資訊,請移至建立金鑰值

索引鍵
Settings:FontColor 綠色
Settings:Message 來自 Azure 應用程式組態的問候

設定應用程式組態 Kubernetes 提供者

  1. 執行下列命令,取得 AKS 叢集的存取認證。 將 nameresource-group 參數的值取代為您的 AKS 執行個體:

    az aks get-credentials --name <your-aks-instance-name> --resource-group <your-aks-resource-group>
    
  2. 使用 helm 將 Azure 應用程式組態 Kubernetes 提供者安裝到您的 AKS 叢集:

    helm install azureappconfiguration.kubernetesprovider \
         oci://mcr.microsoft.com/azure-app-configuration/helmchart/kubernetes-provider \
         --namespace azappconfig-system \
         --create-namespace
    

    提示

    應用程式組態 Kubernetes 提供者也可用作為 AKS 擴充功能。 此整合可讓您透過 Azure CLI、ARM 範本或 Bicep 範本順暢地進行安裝和管理。 使用 AKS 擴充功能有助於自動進行次要/修補版本更新,確保系統一律為最新狀態。 如需詳細的安裝指示,請參閱適用於 Azure Kubernetes Service 的 Azure 應用程式組態延伸模組

  3. 使用下列內容將 appConfigurationProvider.yaml 檔案新增至部署目錄,以建立 AzureAppConfigurationProvider 資源。 AzureAppConfigurationProvider 是自訂資源,定義要從 Azure 應用程式組態存放區下載哪些資料,並建立 ConfigMap。

    apiVersion: azconfig.io/v1
    kind: AzureAppConfigurationProvider
    metadata:
      name: appconfigurationprovider-sample
    spec:
      endpoint: <your-app-configuration-store-endpoint>
      target:
        configMapName: configmap-created-by-appconfig-provider
        configMapData: 
          type: json
          key: mysettings.json
      auth:
        workloadIdentity:
          managedIdentityClientId: <your-managed-identity-client-id>
    

    將欄位 endpoint 的值取代為 Azure 應用程式組態存放區的端點。 請遵循使用工作負載身分識別中的步驟,並使用您所建立的使用者指派受控識別的用戶端識別碼來更新 auth 區段。

    注意

    AzureAppConfigurationProvider 是宣告式 API 物件。 這會使用下列行為,定義從應用程式組態存放區中的資料建立的 ConfigMap 所需狀態:

    • 如果具有相同名稱的 ConfigMap 已存在於相同的命名空間中,則無法建立 ConfigMap。
    • 如果應用程式組態存放區中的現有資料遭到其他任何方式刪除或修改,ConfigMap 將會重設。
    • 如果解除安裝應用程式組態 Kubernetes 提供者,將會刪除 ConfigMap。
  4. 更新部署目錄中的 deployment.yaml 檔案,以使用 ConfigMap configmap-created-by-appconfig-provider 做為掛接的資料磁碟區。 請務必確定 volumeMounts.mountPath 符合 Dockerfile 中指定的 WORKDIR,以及之前建立的 config 目錄。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aspnetapp-demo
      labels:
        app: aspnetapp-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aspnetapp-demo
      template:
        metadata:
          labels:
            app: aspnetapp-demo
        spec:
          containers:
          - name: aspnetapp
            image: myregistry.azurecr.io/aspnetapp:v1
            ports:
            - containerPort: 80
            volumeMounts:
            - name: config-volume
              mountPath: /app/config
          volumes:
          - name: config-volume 
            configMap: 
              name: configmap-created-by-appconfig-provider
    
  5. 執行下列命令以部署變更。 如果您使用現有的 AKS 應用程式,請取代命名空間。

    kubectl apply -f ./Deployment -n appconfig-demo
    
  6. 重新整理瀏覽器。 頁面會顯示更新的內容。

    螢幕擷取畫面,其中顯示使用 configMap 之後的 Kubernetes 提供者。

疑難排解

如果您並未看到應用程式從應用程式組態存放區挑選資料,請執行下列命令來驗證 ConfigMap 是否已正確建立。

kubectl get configmap configmap-created-by-appconfig-provider -n appconfig-demo

如果未建立 ConfigMap,請執行下列命令以取得資料擷取狀態。

kubectl get AzureAppConfigurationProvider appconfigurationprovider-sample -n appconfig-demo -o yaml

如果 Azure 應用程式組態 Kubernetes 提供者已成功從應用程式組態存放區擷取資料,輸出狀態區段下的 phase 屬性應該是 COMPLETE,如下列範例所示。

$ kubectl get AzureAppConfigurationProvider appconfigurationprovider-sample -n appconfig-demo -o yaml

apiVersion: azconfig.io/v1
kind: AzureAppConfigurationProvider
  ... ... ...
status:
  lastReconcileTime: "2023-04-06T06:17:06Z"
  lastSyncTime: "2023-04-06T06:17:06Z"
  message: Complete sync settings to ConfigMap or Secret
  phase: COMPLETE

如果階段不是 COMPLETE,則不會從應用程式組態存放區正確下載資料。 執行下列命令以顯示 Azure 應用程式組態 Kubernetes 提供者的記錄。

kubectl logs deployment/az-appconfig-k8s-provider -n azappconfig-system

使用記錄進行進一步的疑難排解 如需常見問題, 請參閱常見問題 一節。

常見問題集

為什麼不會產生 ConfigMap 或秘密?

您可以依照疑難解答指南中的步驟收集記錄,以取得詳細的錯誤資訊。 以下是一些常見的原因。

  • 回應 403:403 禁止:設定的身分識別缺少存取 應用程式組態 存放區所需的許可權。 如需與您所使用的身分識別相符的範例,請參閱驗證一節。
  • 應用程式組態 中找到 金鑰保存庫 參考,但未設定 『spec.secret』:選取的索引鍵/值會包含一或多個 金鑰保存庫 參考,但未提供 金鑰保存庫 的驗證資訊。 為了維護組態的完整性,整個組態無法載入。 設定 區 spec.secret 段以提供必要的驗證資訊。 如需範例和詳細資訊,請參閱 金鑰保存庫 參考

為什麼產生的 ConfigMap 未包含預期的數據?

請確定您指定正確的索引鍵/值選取器,以符合預期的數據。 如果未指定選取器,則會從 應用程式組態 存放區下載不含標籤的所有索引鍵/值。 使用金鑰篩選時,請確認它符合您預期的索引鍵/值前置詞。 如果您的索引鍵/值具有標籤,請務必在選取器中指定標籤篩選。 如需更多範例,請參閱 索引鍵/值選取 檔。

如何自定義 Azure 應用程式組態 Kubernetes 提供者的安裝?

您可以在安裝 Azure 應用程式組態 Kubernetes Provider 時提供額外的 Helm 值來自定義安裝。 例如,您可以設定記錄層級、設定提供者在特定節點上執行,或停用工作負載身分識別。 如需詳細資訊, 請參閱安裝指南

清除資源

如果您想要保留 AKS 叢集,請從 AKS 叢集解除安裝應用程式組態 Kubernetes 提供者。

helm uninstall azureappconfiguration.kubernetesprovider --namespace azappconfig-system

如果您不想繼續使用本文中建立的資源,請刪除在此處建立的資源群組,以避免產生費用。

重要

刪除資源群組是無法回復的動作。 資源群組和其中的所有資源都將被永久刪除。 請確定您不會誤刪錯誤的資源群組或資源。 如果您是在包含需保留其他資源的資源群組內部,建立本文的資源,則可以從每個資源各自的窗格中個別刪除每個資源,而不必刪除整個資源群組。

  1. 登入 Azure 入口網站,然後選取 [資源群組]
  2. 在 [依名稱篩選] 方塊中,輸入您資源群組的名稱。
  3. 在結果清單中,選取資源群組名稱以查看概觀。
  4. 選取 [刪除資源群組]
  5. 系統將會要求您確認是否刪除資源群組。 輸入您資源群組的名稱以進行確認,然後選取 [刪除]

不久後,系統便會刪除該資源群組及其所有的資源。

注意

如果使用 Azure Developer CLI 以設定資源,您可以執行 azd down 命令以刪除 azure-appconfig-aks 範本所建立的所有資源。

下一步

在本快速入門中,您將:

  • 已建立在 Azure Kubernetes Service (AKS) 中執行的應用程式。
  • 使用應用程式組態 Kubernetes 提供者,將 AKS 叢集連線到應用程式組態存放區。
  • 使用來自應用程式組態存放區的資料建立 ConfigMap。
  • 從應用程式組態存放區使用組態執行應用程式,而不需要變更應用程式的程式碼。

若要了解如何將 AKS 工作負載更新為以動態方式重新整理組態,請繼續進行下一個教學課程。

若要深入了解 Azure 應用程式組態 Kubernetes 提供者,請參閱 Azure 應用程式組態 Kubernetes 提供者參考