チュートリアル: Azure Arc 対応 Kubernetes で Azure Container Apps を有効にする

このチュートリアルは、Azure Container Appsを実行するためのサポート済みKubernetesクラスターを準備します。 Azure Arc対応のKubernetesクラスターを作成し、Container Apps拡張機能をインストールし、カスタムロケーションを作成し、コンテナアプリ接続環境を作成します。

このチュートリアルを完了すると、AzureのサブスクリプションとKubernetesクラスターの両方が変更されます。 リストされたリソースを作成するにはAzure権限と、クラスタ管理者権限が必要です。

このチュートリアルでは、Azure Arc対応のKubernetesクラスタ上でAzure Container Appsを有効にする方法を示しています。 このチュートリアルでは、次の操作を行います。

  • もし未接続であれば、KubernetesクラスターをAzure Arcに接続してください。
  • オプションでLog Analyticsワークスペースを作成することもできます。
  • Container Apps 拡張機能をインストールして検証してください。
  • カスタムロケーションを作成・検証します。
  • コンテナアプリ接続環境を作成・検証すること。

始める前に、Azure ArcのAzure Container Appsを必ず確認してください。リソースやクラスター内のコンポーネントが準備できない場合は、「Azure Arc enabled Kubernetes のAzure Container Appsのトラブルシューティング」をご覧ください。

前提条件

始める前に、以下の要件を確認してください:

  • アクティブなサブスクリプションが含まれる Azure アカウント。 お持ちでない場合は、 無料で作成してください。
  • リソースプロバイダーの登録権限やリソースグループの作成、Azure Arc対応のKubernetesリソース、クラスタ拡張機能、カスタムロケーション、コンテナアプリ接続環境、そしてオプションでLog Analyticsワークスペース。
  • Azure CLI とその前提条件。
  • Kubernetesクラスターと互換性のある kubectl バージョンで、ワークステーションからKubernetes APIサーバーへのネットワークアクセスが欲しいです。
  • Linux amd64 ワーカーノードとアクティブな kubectl コンテキストを通じたクラスタ管理者アクセスを備えたサポートされたKubernetesクラスタです。
  • 動作するKubernetes LoadBalancer サービスの実装。
  • Azure Arcおよびコンテナアプリで必要とされるエンドポイントへのアウトバウンド接続。
  • 拡張やアプリケーションのワークロードに十分な割り当て可能なCPUとメモリ。

本番クラスタを変更する前に、Azure Arc対応KubernetesでのPlan a Container Apps deploymentをご確認ください。

セットアップ

次の 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 Service でクラスターを作成します。

    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になった時のみ続けてください。 コマンドがタイムアウトした場合、「 Connected cluster is not ready」を確認してください。

Log Analytics ワークスペースの作成

Log Analyticsワークスペースは、Azure Arc対応のKubernetesクラスターで動作するコンテナアプリのアプリケーションログへのアクセスを提供します。 Log Analyticsのワークスペースは任意ですが、アプリケーション診断には推奨されます。

重要

Container Apps 拡張機能をインストールする前に 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 ワークスペース用の、エンコードされたワークスペース ID と共有キーを取得します。 これらは、次のステップで必要になります。

    Caution

    ワークスペース共有キーは認証情報です。 印刷せず、ソース管理にコミットせず、シェル履歴に保存せず、サポートバンドルに含めないでください。 以下のコマンドはシェル変数に保持し、保護された拡張設定として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インストールを削除したり、非公開の拡張機能設定を適用したりしないでください。他のワークロードがそれを必要とするかもしれません。

Container Apps 拡張機能をインストールする

重要

Azure LocalでAKSにデプロイする場合は、拡張機能をインストールする前に必ずHAProxyやカスタムロードバランサーを設定してください。 また、 az containerapp arc setup-core-dns --distro AksAzureLocal を使ってローカルコンテキスト用のCoreDNSを設定することもできます。

  1. Container Apps拡張機能、その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 に接続されたクラスターに Container Apps 拡張機能をインストールします。 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連携なしで拡張機能をインストールするには、コマンドからログ関連の3つのパラメータを削除してください。

    カスタムロードバランサーを使用するクラスターの場合、 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 この拡張機能に対して作成された Container Apps 拡張機能 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. 後で使用できるように、Container Apps 拡張機能の 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
    

    拡張ポッドが保留中、繰り返し再起動されている、あるいは予期せず準備ができていない状態のままカスタムロケーションを作成しないでください。 これらのポッドとシステムでのそれらの役割の詳細については、Azure Arc の概要に関するページを参照してください。

  6. Log Analyticsを設定している場合は、ワークスペースキーを含むローカル変数をクリアしてください。

    unset LOG_ANALYTICS_KEY LOG_ANALYTICS_KEY_ENC
    

カスタムの場所を作成する

カスタムの場所は、Azure Container Apps 接続環境に割り当てる Azure の場所です。

  1. カスタムの場所の目的の名前と、Azure Arc 接続クラスターの ID に次の環境変数を設定します。

    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
    

    注記

    クラスタ上でカスタムロケーションの作成に問題がある場合は、 クラスタ上でカスタムロケーション機能を有効にする必要があるかもしれません。 CLI にサインインする際に、サービス プリンシパルまたはクラスター リソースに対するアクセス許可が制限された Microsoft Entra ユーザーを使用する場合は、この機能を有効にしてください。

  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 Container Apps 接続環境を作成する

カスタムの場所でアプリの作成を開始するには、Azure Container Apps 接続環境が必要です。

  1. Container Apps 接続環境を次のように作成します。

    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設定用に保存してください。 プロビジョニングが失敗した場合は、「Connected environment creation fails」を参照してください。

次の手順