クイック スタート: Azure Kubernetes Service で Azure App Configuration を使用する
Kubernetes では、ConfigMaps から構成を使用するようにポッドを設定します。 これにより、お使いのコンテナー イメージから構成を切り離して、アプリケーションを簡単に移植できるようになります。 Azure App Configuration Kubernetes プロバイダーを使用すると、Azure App Configuration のキー値と Key Vault 参照から ConfigMaps とシークレットを構築できます。 これにより、Azure App Configuration を利用して、アプリケーション コードを変更することなく、一元化されたストレージと構成の管理を行うことができます。
ConfigMap は、環境変数またはマウントされたファイルとして使用できます。 このクイック スタートでは、Azure Kubernetes Service ワークロードに Azure App Configuration Kubernetes Provider を組み込み、JSON ファイルから構成を使用する単純な ASP.NET Core アプリを実行します。
ヒント
Azure App Configuration にアクセスするために Kubernetes でホストされているワークロードのオプションを参照してください。
Note
このクイック スタートでは、Azure App Configuration Kubernetes プロバイダーの設定について説明します。 必要に応じて、次の Azure Developer CLI コマンドと azure-appconfig-aks
テンプレートを使用して、Azure リソースをプロビジョニングし、このクイックスタートで使用するサンプル アプリケーションをデプロイできます。 このテンプレートの詳細については、GitHub の azure-appconfig-aks リポジトリを参照してください。
azd init -t azure-appconfig-aks
azd up
前提条件
- App Configuration ストア。 ストアを作成する。
- Azure Container Registry。 レジストリを作成します。
- お使いの Azure Container Registry からイメージをプルするアクセス許可が付与されている Azure Kubernetes Service (AKS) クラスター。 AKS クラスターを作成する。
- .NET SDK 6.0 以降
- Azure CLI
- Docker Desktop
- helm
- kubectl
AKS で実行されているアプリケーションを作成する
このセクションでは、Azure Kubernetes Service (AKS) で実行されている単純な ASP.NET Core Web アプリケーションを作成します。 アプリケーションは、ローカル JSON ファイルから構成を読み取ります。 次のセクションでは、アプリケーション コードを変更せずに、Azure App Configuration から構成を使用できるようにします。 ファイルから構成を読み取る AKS アプリケーションが既にある場合は、このセクションをスキップし、「App Configuration Kubernetes Providerを使用する」に進んでください。 プロバイダーによって生成された構成ファイルが、アプリケーションで使用されるファイル パスと一致することを確認するだけで済みます。
アプリケーションの作成
.NET コマンドライン インターフェイス (CLI) を使用して次のコマンドを実行し、新しい ASP.NET Core Web アプリ プロジェクトを新しい MyWebApp ディレクトリに作成します。
dotnet new webapp --output MyWebApp --framework net6.0
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>
プロジェクトのルートに config ディレクトリを作成し、次の内容を含む mysettings.json ファイルを追加します。
{ "Settings": { "FontColor": "Black", "Message": "Message from the local configuration" } }
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 // ... ...
アプリケーションのコンテナー格納
dotnet publish コマンドを実行して、リリース モードでアプリをビルドし、発行されたディレクトリ にアセットを作成します。
dotnet publish -c Release -o published
プロジェクト ディレクトリのルートに Dockerfile という名前のファイルを作成し、それをテキスト エディターで開いて、次の内容を入力します。 Dockerfile は、拡張子のないテキスト ファイルであり、コンテナー イメージの作成に使用されます。
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime WORKDIR /app COPY published/ ./ ENTRYPOINT ["dotnet", "MyWebApp.dll"]
次のコマンドを実行して、aspnetapp という名前のコンテナー イメージをビルドします。
docker build --tag aspnetapp .
Azure Container Registry にイメージをプッシュする
az acr login コマンドを実行して、コンテナー レジストリにログインします。 次の例では、myregistry という名前のレジストリにログインします。 レジストリ名をご自分のものに置き換えてください。
az acr login --name myregistry
ログインが成功すると、コマンドが
Login Succeeded
を返します。docker tag を使用して、イメージ aspnetapp 用のタグ myregistry.azurecr.io/aspnetapp:v1 を作成します。
docker tag aspnetapp myregistry.azurecr.io/aspnetapp:v1
ヒント
既存の Docker イメージとタグの一覧を確認するには、
docker image ls
を実行します。 このシナリオでは、少なくとも 2 つのイメージ (aspnetapp
とmyregistry.azurecr.io/aspnetapp
) が表示されるはずです。docker push を使用してイメージをコンテナー レジストリにアップロードします。 たとえば、次のコマンドを使用すると、レジストリ myregistry の下にある、v1 というタグが付いた aspnetapp という名前のリポジトリにイメージがプッシュされます。
docker push myregistry.azurecr.io/aspnetapp:v1
アプリケーションの配置
ご自分のプロジェクトのルート ディレクトリに、Deployment ディレクトリを作成します。
次の内容を含む deployment.yaml ファイルを Deployment ディレクトリに追加して、デプロイを作成します。
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
次の内容を含む service.yaml ファイルを Deployment ディレクトリに追加して、LoadBalancer サービスを作成します。
apiVersion: v1 kind: Service metadata: name: aspnetapp-demo-service spec: type: LoadBalancer ports: - port: 80 selector: app: aspnetapp-demo
次のコマンドを実行して、アプリケーションを AKS クラスターにデプロイします。
kubectl create namespace appconfig-demo kubectl apply -f ./Deployment -n appconfig-demo
次のコマンドを実行して、LoadBalancer サービスによって公開される外部 IP アドレスを取得します。
kubectl get service aspnetapp-demo-service -n appconfig-demo
ブラウザーの画面を開き、前の手順で特定した IP アドレスに移動します。 Web ページは次のようになります。
App Configuration Kubernetes プロバイダー を使用する
AKS で実行されているアプリケーションを作成したので、Kubernetes コントローラーとして実行されている AKS クラスターに App Configuration Kubernetes プロバイダーをデプロイします。 プロバイダーは App Configuration ストアからデータを取得し、データ ボリュームにマウントされた JSON ファイルとして使用可能な ConfigMap を作成します。
Azure App Configuration ストアを設定する
App Configuration ストアに次のキー値を追加し、[ラベル] と [コンテンツのタイプ] を既定値のままにします。 Azure portal または CLI を使用してストアにキーと値を追加する方法の詳細については、キーと値の作成に関する記事を参照してください。
キー | Value |
---|---|
Settings:FontColor | 緑 |
Settings:Message | "Azure App Configuration からの挨拶" |
App Configuration Kubernetes プロバイダーを設定する
次のコマンドを実行して、ご自分の AKS クラスターのアクセス資格情報を取得します。
name
とresource-group
パラメーターの値をご自分の AKS インスタンスのものに置き換えます。az aks get-credentials --name <your-aks-instance-name> --resource-group <your-aks-resource-group>
helm
を使用して、Azure App Configuration Kubernetes プロバイダーをご自分の AKS クラスターにインストールします。helm install azureappconfiguration.kubernetesprovider \ oci://mcr.microsoft.com/azure-app-configuration/helmchart/kubernetes-provider \ --namespace azappconfig-system \ --create-namespace
ヒント
App Configuration Kubernetes プロバイダーは、AKS 拡張機能としても使用できます。 この統合により、Azure CLI、ARM テンプレート、または Bicep テンプレートを使用したシームレスなインストールと管理が可能になります。 AKS 拡張機能を使用すると、マイナー/パッチ バージョンの自動更新が容易になり、システムが常に最新の状態であることが確実になります。 詳細なインストール手順については、「Azure Kubernetes Service 用 Azure App Configuration 拡張機能」を参照してください。
次の内容を含む appConfigurationProvider.yaml ファイルを Deployment ディレクトリに追加して、
AzureAppConfigurationProvider
リソースを作成します。AzureAppConfigurationProvider
は、Azure App Configuration ストアからダウンロードするデータを定義し、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: serviceAccountName: <your-service-account-name>
endpoint
フィールドの値を、ご自分の Azure App Configuration ストアのエンドポイントに置き換えます。 次の手順に進み、自分の認証情報でauth
セクションを更新します。Note
AzureAppConfigurationProvider
は宣言型 API オブジェクトです。 これにより、App Configuration ストア内のデータから作成された ConfigMap の必要な状態が次の動作で定義されます。- 同じ名前の ConfigMap が同じ名前空間に既に存在する場合、ConfigMap の作成は失敗します。
- ConfigMap は、他の方法で削除または変更された場合、App Configuration ストア内の現在のデータに基づいてリセットされます。
- App Configuration Kubernetes プロバイダーがアンインストールされると、ConfigMap は削除されます。
ワークロード ID を使用するための手順に従って、App Configuration ストアで認証します。
serviceAccountName
フィールドを、作成したサービス アカウントの名前に置き換えて、appConfigurationProvider.yaml ファイルを更新します。 その他の認証方法の詳細については、「認証」セクションの例を参照してください。Deployment ディレクトリ内の 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
次のコマンドを実行して、変更をデプロイします。 既存の AKS アプリケーションを使用している場合は、名前空間を置き換えます。
kubectl apply -f ./Deployment -n appconfig-demo
ブラウザーを更新します。 更新されたコンテンツがページに表示されます。
トラブルシューティング
App Configuration ストアからのデータがアプリケーションによって取得されていない場合は、次のコマンドを実行して、ConfigMap が正しく作成されていることを検証します。
kubectl get configmap configmap-created-by-appconfig-provider -n appconfig-demo
ConfigMap が作成されていない場合は、次のコマンドを実行してデータ取得の状態を表示します。
kubectl get AzureAppConfigurationProvider appconfigurationprovider-sample -n appconfig-demo -o yaml
App Configuration ストアからのデータが Azure App Configuration Kubernetes プロバイダーによって正常に取得されていると、次の例に示すように、出力の status セクションの下の 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
でない場合、データは App Configuration ストアから正しくダウンロードされていません。 次のコマンドを実行して、Azure App Configuration Kubernetes プロバイダーのログを表示します。
kubectl logs deployment/az-appconfig-k8s-provider -n azappconfig-system
このログを使用して、詳細なトラブルシューティングを行います。 一般的な問題については、FAQ セクションを参照してください。
よく寄せられる質問
ConfigMap またはシークレットが生成されないのはなぜですか?
トラブルシューティング ガイドの手順に従って、詳細なエラー情報のログを収集できます。 一般的な原因を以下に示します。
- RESPONSE 403: 403 Forbidden: 構成された ID には、App Configuration ストアにアクセスするのに必要なアクセス許可がありません。 使用している ID に一致する例については、「認証」セクションを参照してください。
- キー コンテナー参照が App Configuration で見つかりましたが、'spec.secret' が構成されていません: 選択したキー値には 1 つ以上のキー コンテナー参照が含まれていますが、キー コンテナーの認証情報が提供されていません。 構成の整合性を維持するために、構成全体の読み込みに失敗します。
spec.secret
セクションを構成して、必要な認証情報を指定します。 例と詳細情報については、Key Vault のドキュメントをご覧ください。
生成された ConfigMap に予期されるデータが含まれていないのはなぜですか?
予期されるデータと一致する正しいキー/値セレクターを指定していることを確認します。 セレクターが指定されていない場合、ラベルのないすべてのキー値が App Configuration ストアからダウンロードされます。 キー フィルターを使用する場合は、予期されるキー値のプレフィックスと一致することを確認します。 キー値にラベルがある場合は、セレクターでラベル フィルターを指定していることを確認してください。 その他の例については、キー値の選択に関するドキュメントを参照してください。
Azure App Configuration Kubernetes プロバイダーのインストールをカスタマイズするにはどうすればよいですか?
Azure App Configuration Kubernetes プロバイダーのインストール時に追加の Helm 値を指定することで、インストールをカスタマイズできます。 たとえば、ログ レベルを設定したり、特定のノードで実行するようにプロバイダーを構成したり、ワークロード ID を無効にしたりできます。 詳細については、インストール ガイドをご覧ください。
ConfigMap と Secret のオンデマンド更新をトリガーする方法
データの自動更新を設定することもできますが、オンデマンド更新をトリガーして、App Configuration と Key Vault から最新のデータを取得したい場合があるかもしれません。 これを実行するには、Azure App Configuration Kubernetes プロバイダー コントローラーのデプロイを再起動します。 その後、Kubernetes プロバイダーは、App Configuration ストアと Key Vault の最新データを使用して ConfigMap と Secret の調整と更新を行います。
Kubernetes プロバイダーによって生成された ConfigMap と Secret を削除または変更することは推奨されません。 最新のデータから新しいものが生成はされますが、これによって何らかの障害が発生した場合にアプリケーションのダウンタイムが引き起こされる可能性があります。
プロバイダーをバージョン 2.0.0 にアップグレードした後、ワークロード ID を使用して Azure App Configuration で認証できないのはなぜですか?
バージョン 2.0.0 以降では、ワークロード ID を使用して Azure App Configuration と認証するには、ユーザー指定のサービス アカウントが必要になります。 この変更により、名前空間の分離によってセキュリティが強化されます。 以前は、Kubernetes プロバイダーのサービス アカウントがすべての名前空間に使用されていました。 更新された手順については、ワークロード ID の使用に関するドキュメントを参照してください。 バージョン 2.0.0 にアップグレードするときに移行する時間が必要な場合は、プロバイダーのインストール中に workloadIdentity.globalServiceAccountEnabled=true
を一時的に設定できます。 プロバイダーのサービス アカウントの使用のサポートは、今後のリリースで非推奨になることに注意してください。
リソースをクリーンアップする
AKS クラスターを維持する場合は、AKS クラスターから App Configuration Kubernetes プロバイダーをアンインストールします。
helm uninstall azureappconfiguration.kubernetesprovider --namespace azappconfig-system
この記事で作成したリソースを継続して使用しない場合は、ここで作成したリソース グループを削除して課金されないようにしてください。
重要
リソース グループを削除すると、元に戻すことができません。 リソース グループとそのすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 この記事のリソースを、保持したい他のリソースを含むリソース グループ内に作成した場合は、リソース グループを削除する代わりに、各リソースをそれぞれのペインから個別に削除します。
- Azure portal にサインインし、 [リソース グループ] を選択します。
- [名前でフィルター] ボックスにリソース グループの名前を入力します。
- 結果一覧でリソース グループ名を選択し、概要を表示します。
- [リソース グループの削除] を選択します。
- リソース グループの削除の確認を求めるメッセージが表示されます。 確認のためにリソース グループの名前を入力し、 [削除] を選択します。
しばらくすると、リソース グループとそのすべてのリソースが削除されます。
Note
Azure Developer CLI を使用してリソースを設定する場合は、azd down
コマンドを実行して、azure-appconfig-aks
テンプレートによって作成されたすべてのリソースを削除できます。
次のステップ
このクイック スタートでは次の作業を行います。
- Azure Kubernetes Service (AKS) で実行されているアプリケーションを作成しました。
- App Configuration Kubernetes プロバイダーを使用して、AKS クラスターを App Configuration ストアに接続しました。
- App Configuration ストアのデータを含む ConfigMap を作成しました。
- アプリケーション コードを変更せずに、App Configuration ストアからの構成を使用してアプリケーションを実行しました。
構成が動的に更新されるように AKS ワークロードを更新する方法については、次のチュートリアルに進んでください。
Azure App Configuration Kubernetes プロバイダーの詳細については、「Azure App Configuration Kubernetes プロバイダー リファレンス」を参照してください。