次の方法で共有


既存の Application Gateway デプロイを使用して AGIC をインストールする

Application Gateway イングレス コントローラー (AGIC) は、Azure Kubernetes Service (AKS) クラスター内のポッドです。 AGIC は、Kubernetes のイングレス リソースを監視します。 Kubernetes クラスターの状態に基づいて Azure Application Gateway の構成を作成して適用します。

ヒント

Kubernetes イングレス ソリューションの場合は Application Gateway for Containers を検討してください。 詳細については、「クイックスタート: Application Gateway for Containers ALB コントローラーをデプロイする」を参照してください。

前提条件

この記事では、次のツールとインフラストラクチャが既にインストールされているものとします。

Helm リポジトリを追加します

Helm は、Kubernetes 用のパッケージ マネージャーです。 それを使って application-gateway-kubernetes-ingress パッケージをインストールします。

Cloud Shell を使用する場合は、Helm をインストールする必要はありません。 Cloud Shell には Helm バージョン 3 が付属しています。 次のコマンドを実行し、Kubernetes ロールベースのアクセス制御 (RBAC) によって有効にされる AKS クラスター用の AGIC Helm リポジトリを追加します。

kubectl create serviceaccount --namespace kube-system tiller-sa
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller-sa
helm init --tiller-namespace kube-system --service-account tiller-sa

Application Gateway デプロイをバックアップする

AGIC をインストールする前に、Application Gateway デプロイの構成をバックアップします。

  1. Azure portal で、Application Gateway デプロイに移動します。
  2. [Automation] セクションで、[テンプレートのエクスポート] を選んでから、[ダウンロード] を選びます。

ダウンロードされた .zip ファイルには、Application Gateway の復元が必要になった場合に使用できる JSON テンプレート、Bash スクリプト、PowerShell スクリプトが含まれます。

Resource Manager の認証用の ID を設定する

AGIC は、Kubernetes API サーバーおよび Azure Resource Manager と通信します。 これらの API にアクセスするには ID が必要です。 Microsoft Entra ワークロード ID またはサービス プリンシパルを使用できます。

Microsoft Entra ワークロード ID を設定する

Microsoft Entra ワークロード ID は、ユーザーがソフトウェア ワークロードに割り当てる ID です。 AKS ポッドは、この ID を使って、他の Azure リソースでの認証を行うことができます。

この構成で AGIC ポッドが Azure Resource Manager に対して HTTP 要求を行うには、認可が必要です。

  1. Azure CLI の az account set コマンドを使って、特定のサブスクリプションを現在のアクティブなサブスクリプションに設定します。

    az account set --subscription "subscriptionID"
    

    次に、[az identity 作成] コマンドを使用してマネージド ID を作成します。 ノード リソース グループに ID を作成する必要があります。 ノード リソース グループには、MC_myResourceGroup_myAKSCluster_eastus のような名前が既定で割り当てられています。

    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. ロールの割り当てでは、次のコマンドを実行して、新しく作成された ID の principalId の値を特定します。

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Application Gateway デプロイに対する共同作成者アクセスを、ID に許可します。 Application Gateway デプロイの ID が必要です (例: /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C)。

    最初に、次のコマンドを実行して、サブスクリプション内の Application Gateway ID の一覧を取得します。

    az network application-gateway list --query '[].id'
    

    ID に共同作成者アクセス権を割り当てるには、次のコマンドを実行します。

    $resourceGroup="resource-group-name"
    $identityName="identity-Name"
    # Get the Application Gateway ID
    $AppGatewayID=$(az network application-gateway list --query '[].id' -o tsv)
    $role="contributor"
    # Get the principal ID for the user-assigned identity
    $principalId=$(az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv)
    az role assignment create --assignee $principalId --role $role --scope $AppGatewayID
    
  4. Application Gateway リソース グループへの閲覧者アクセスを、ID に許可します。 リソース グループ ID は /subscriptions/A/resourceGroups/B のようになります。 az group list --query '[].id' を実行すると、すべてのリソース グループを取得できます。

    $resourceGroup="resource-group-name"
    $identityName="identity-Name"
    # Get the Application Gateway resource group
    $AppGatewayResourceGroup=$(az network application-gateway list --query '[].resourceGroup' -o tsv)
    # Get the Application Gateway resource group ID
    $AppGatewayResourceGroupID=$(az group show --name $AppGatewayResourceGroup --query id -o tsv)
    $role="Reader"
    # Get the principal ID for the user-assigned identity
    $principalId=$(az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv)
    # Assign the Reader role to the user-assigned identity at the resource group scope
    az role assignment create --role $role --assignee $principalId  --scope $AppGatewayResourceGroupID
    

Note

AGIC が使う ID に、Application Gateway デプロイ先のサブネットに委任された Microsoft.Network/virtualNetworks/subnets/join/action アクセス許可があることを確認します。 このアクセス許可を持つカスタム役割を定義していない場合は、組み込みのネットワーク共同作成者ロールを使用できます。

サービス プリンシパルを設定する

Kubernetes のシークレットを使って、Azure Resource Manager へのアクセス権を AGIC に提供することもできます。

  1. Active Directory のサービス プリンシパルを作成し、Base64 でエンコードします。 JSON BLOB を Kubernetes に保存するには、Base64 エンコードが必要です。

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Base64 でエンコードされた JSON BLOB を helm-config.yaml ファイルに追加します。 helm-config.yaml ファイルによって AGIC が構成されます。

    armAuth:
        type: servicePrincipal
        secretJSON: <Base64-Encoded-Credentials>
    

AGIC アドオンをデプロイする

イングレス コントローラーの配置マニフェストを作成する

---
# file: pet-supplies-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pet-supplies-ingress
spec:
  ingressClassName: azure-application-gateway
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: store-front
            port:
              number: 80
      - path: /order-service
        pathType: Prefix
        backend:
          service:
            name: order-service
            port:
              number: 3000
      - path: /product-service
        pathType: Prefix
        backend:
          service:
            name: product-service
            port:
              number: 3002

イングレス コントローラーをデプロイする

$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace

イングレス コントローラーを Helm Chart としてインストールする

Cloud Shell を使用して、AGIC Helm パッケージをインストールします。

  1. Helm の更新を実行します。

    helm repo update
    
  2. helm-config.yaml をダウンロードします。

    wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
    

    または、次の YAML ファイルをコピーします。

    # This file contains the essential configs for the ingress controller helm chart
    
    # Verbosity level of the App Gateway Ingress Controller
    verbosityLevel: 3
    
    ################################################################################
    # Specify which application gateway the ingress controller must manage
    #
    appgw:
        subscriptionId: <subscriptionId>
        resourceGroup: <resourceGroupName>
        name: <applicationGatewayName>
    
        # Setting appgw.shared to "true" creates an AzureIngressProhibitedTarget CRD.
        # This prohibits AGIC from applying config for any host/path.
        # Use "kubectl get AzureIngressProhibitedTargets" to view and change this.
        shared: false
    
    ################################################################################
    # Specify which kubernetes namespace the ingress controller must watch
    # Default value is "default"
    # Leaving this variable out or setting it to blank or empty string would
    # result in Ingress Controller observing all accessible namespaces.
    #
    # kubernetes:
    #   watchNamespace: <namespace>
    
    ################################################################################
    # Specify the authentication with Azure Resource Manager
    #
    # Two authentication methods are available:
    # - Option 1: Azure-AD-workload-identity
    armAuth:
        type: workloadIdentity
        identityClientID:  <identityClientId>
    
    ## Alternatively you can use Service Principal credentials
    # armAuth:
    #    type: servicePrincipal
    #    secretJSON: <<Generate this value with: "az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0" >>
    
    ################################################################################
    # Specify if the cluster is Kubernetes RBAC enabled or not
    rbac:
        enabled: false # true/false
    
    # Specify aks cluster related information. THIS IS BEING DEPRECATED.
    aksClusterConfiguration:
        apiServerAddress: <aks-api-server-address>
    
  3. helm-config.yaml を編集して、appgwarmAuth の値を指定します。

    Note

    <identity-client-id> は、前のセクションで設定した Microsoft Entra ワークロード ID の値のプロパティです。 この情報は、az identity show -g <resourcegroup> -n <identity-name> コマンドを実行して取得できます。 そのコマンドの <resourcegroup> は、AKS クラスター、Application Gateway、マネージド ID に関連するインフラストラクチャ リソースをホストしているリソース グループです。

  4. 前のステップの helm-config.yaml の構成を使って、Helm Chart をインストールします。

    helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
    

    または、helm-config.yaml と Helm コマンドを 1 つのステップにまとめることもできます。

    helm install oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \
         --name agic-controller \
         --version 1.7.5 \
         --namespace default \
         --debug \
         --set appgw.name=applicationgatewayABCD \
         --set appgw.resourceGroup=your-resource-group \
         --set appgw.subscriptionId=subscription-uuid \
         --set appgw.shared=false \
         --set armAuth.type=servicePrincipal \
         --set armAuth.secretJSON=$(az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0) \
         --set rbac.enabled=true \
         --set verbosityLevel=3 \
         --set kubernetes.watchNamespace=default \
         --set aksClusterConfiguration.apiServerAddress=aks-abcdefg.hcp.westus2.azmk8s.io
    
  5. 新しく作成されたポッドのログを調べて、正常に開始したことを確認します。

Azure Application Gateway デプロイを使って、HTTP または HTTPS 経由で AKS サービスをインターネットに公開する方法については、こちらの攻略ガイドをご覧ください。

共有 Application Gateway デプロイを設定する

既定では、AGIC はリンク先の Application Gateway デプロイの完全な所有権を持っています。 AGIC バージョン 0.8.0 以降では、1 つの Application Gateway デプロイを他の Azure コンポーネントと共有できます。 たとえば、同じ Application Gateway デプロイを、Azure 仮想マシン スケール セットと AKS クラスターでホストされているアプリに対して使用できます。

サンプル シナリオ

2 つの Web サイトのトラフィックを管理する架空の Application Gateway デプロイがあるとします。

  • dev.contoso.com: Application Gateway と AGIC を使って、新しい AKS クラスターでホストされています。
  • prod.contoso.com: 仮想マシン スケール セットでホストされています。

既定の設定では、AGIC は、それが指し示す Application Gateway デプロイの所有権を 100% 持っています。 AGIC は、Application Gateway のすべての構成を上書きします。 prod.contoso.com 用のリスナーを、Kubernetes イングレスで定義するのではなく、Application Gateway で手動で作成すると、prod.contoso.com の構成は AGIC によって数秒以内に削除されます。

AGIC をインストールし、仮想マシン スケール セットを使うマシンから prod.contoso.com も提供するには、dev.contoso.com のみを構成するように AGIC を制限する必要があります。 この制限を容易にするには、次のカスタム リソース定義 (CRD) をインスタンス化します。

cat <<EOF | kubectl apply -f -
apiVersion: "appgw.ingress.k8s.io/v1"
kind: AzureIngressProhibitedTarget
metadata:
  name: prod-contoso-com
spec:
  hostname: prod.contoso.com
EOF

前記のコマンドでは、AzureIngressProhibitedTarget オブジェクトが作成されます。 このオブジェクトにより、AGIC (バージョン 0.8.0 以降) は、prod.contoso.com 用の Application Gateway の構成があることを認識します。 また、このオブジェクトは、そのホスト名に関連する構成を変更しないように AGIC に明示的に指示します。

AGIC の新しいインストールを使用して共有 Application Gateway デプロイを有効にする

AGIC (バージョン 0.8.0 以降) を Application Gateway の構成のサブセットに制限するには、helm-config.yaml テンプレートを変更します。 appgw: セクションに shared キーを追加して、それを true に設定します。

appgw:
    subscriptionId: <subscriptionId>    # existing field
    resourceGroup: <resourceGroupName>  # existing field
    name: <applicationGatewayName>      # existing field
    shared: true                        # Add this field to enable shared Application Gateway

Helm の変更を適用します:

  1. AzureIngressProhibitedTarget CRD がインストールされていることを確認します。

    kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
    
  2. Helm を更新します:

    helm upgrade \
        --recreate-pods \
        -f helm-config.yaml \
        agic-controller
        oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure
    

その結果、AKS クラスターには prohibit-all-targets という AzureIngressProhibitedTarget の新しいインスタンスが作成されます。

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

prohibit-all-targets オブジェクトがあると、AGIC は "すべての" ホストとパスの構成を変更できません。 appgw.shared=true を指定して Helm をインストールすると、AGIC はデプロイされますが、Application Gateway は何も変更されません。

アクセス許可を拡大する

appgw.shared=true と既定の prohibit-all-targets を指定した Helm では、AGIC による構成の適用がブロックされるため、AGIC のアクセス許可を拡大する必要があります。

  1. ユーザーに固有の設定を含む次のスニペットを使って、AzureIngressProhibitedTarget という名前の新しい YAML ファイルを作成します。

    cat <<EOF | kubectl apply -f -
    apiVersion: "appgw.ingress.k8s.io/v1"
    kind: AzureIngressProhibitedTarget
    metadata:
      name: your-custom-prohibitions
    spec:
      hostname: your.own-hostname.com
    EOF
    
  2. 独自のカスタム禁止を作成したので、範囲が広すぎる既定のものを削除できます。

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

AGIC の既存のインストール用に共有 Application Gateway デプロイを有効にする

動作している AKS クラスターと Application Gateway デプロイが既にあり、クラスターで AGIC を構成してあるとします。 prod.contoso.com 用のイングレスがあり、クラスターからそれにトラフィックを正常に提供しています。

既存の Application Gateway デプロイに staging.contoso.com を追加しようと思いますが、それを仮想マシンでホストする必要があります。 既存の Application Gateway デプロイを再利用し、staging.contoso.com 用のリスナーとバックエンド プールを手動で構成することにします。 しかし、Application Gateway の構成を (Azure portalResource Manager API、または Terraform を使って) 手動で調整すると、AGIC が持っている完全な所有権と競合します。 ユーザーが変更を適用しても、AGIC によってすぐに上書きまたは削除されます。

ユーザーは AGIC による構成のサブセットの変更を禁止できます。

  1. 次のスニペットを使って AzureIngressProhibitedTarget という名前の新しい YAML ファイルを作成します。

    cat <<EOF | kubectl apply -f -
    apiVersion: "appgw.ingress.k8s.io/v1"
    kind: AzureIngressProhibitedTarget
    metadata:
      name: manually-configured-staging-environment
    spec:
      hostname: staging.contoso.com
    EOF
    
  2. 新しく作成されたオブジェクトを表示します:

    kubectl get AzureIngressProhibitedTargets
    
  3. Azure portal で Application Gateway の構成を変更します。 たとえば、リスナー、ルーティング規則、バックエンドを追加します。 ユーザーが作成した新しいオブジェクト (manually-configured-staging-environment) により、AGIC は staging.contoso.com に関連する Application Gateway の構成を上書きできなくなります。