既存の 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 コントローラーをデプロイする」を参照してください。
前提条件
この記事では、次のツールとインフラストラクチャが既にインストールされているものとします。
- AKS クラスターと Azure Container Networking Interface (CNI)。
- AKS クラスターと同じ仮想ネットワーク内の Application Gateway v2。
- AKS クラスター用に構成された Microsoft Entra ワークロード ID。
az
(Azure CLI)、kubectl
、helm
がインストールされている Azure シェル環境としての Azure Cloud Shell。 これらのツールは、このデプロイの構成をサポートするコマンドに必要です。
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 デプロイの構成をバックアップします。
- Azure portal で、Application Gateway デプロイに移動します。
- [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 要求を行うには、認可が必要です。
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"
ロールの割り当てでは、次のコマンドを実行して、新しく作成された ID の
principalId
の値を特定します。$resourceGroup="resource-group-name" $identityName="identity-name" az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
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
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 に提供することもできます。
Active Directory のサービス プリンシパルを作成し、Base64 でエンコードします。 JSON BLOB を Kubernetes に保存するには、Base64 エンコードが必要です。
az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
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 パッケージをインストールします。
Helm の更新を実行します。
helm repo update
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>
helm-config.yaml
を編集して、appgw
とarmAuth
の値を指定します。Note
<identity-client-id>
は、前のセクションで設定した Microsoft Entra ワークロード ID の値のプロパティです。 この情報は、az identity show -g <resourcegroup> -n <identity-name>
コマンドを実行して取得できます。 そのコマンドの<resourcegroup>
は、AKS クラスター、Application Gateway、マネージド ID に関連するインフラストラクチャ リソースをホストしているリソース グループです。前のステップの
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
新しく作成されたポッドのログを調べて、正常に開始したことを確認します。
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 の変更を適用します:
AzureIngressProhibitedTarget
CRD がインストールされていることを確認します。kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
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 のアクセス許可を拡大する必要があります。
ユーザーに固有の設定を含む次のスニペットを使って、
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
独自のカスタム禁止を作成したので、範囲が広すぎる既定のものを削除できます。
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 portal、Resource Manager API、または Terraform を使って) 手動で調整すると、AGIC が持っている完全な所有権と競合します。 ユーザーが変更を適用しても、AGIC によってすぐに上書きまたは削除されます。
ユーザーは AGIC による構成のサブセットの変更を禁止できます。
次のスニペットを使って
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
新しく作成されたオブジェクトを表示します:
kubectl get AzureIngressProhibitedTargets
Azure portal で Application Gateway の構成を変更します。 たとえば、リスナー、ルーティング規則、バックエンドを追加します。 ユーザーが作成した新しいオブジェクト (
manually-configured-staging-environment
) により、AGIC はstaging.contoso.com
に関連する Application Gateway の構成を上書きできなくなります。