新しい Application Gateway デプロイを使用して AGIC をインストールする
この記事の手順では、既存のコンポーネントがない環境に Application Gateway イングレス コントローラー (AGIC) をインストールすることを前提としています。
ヒント
Kubernetes イングレス ソリューションには Application Gateway for Containers を検討してください。 詳細については、「クイックスタート: Application Gateway for Containers ALB コントローラーをデプロイする」を参照してください。
必要なコマンドライン ツールをインストールする
この記事のすべてのコマンドライン操作には、Azure Cloud Shell を使用することをお勧めします。 [Cloud Shell の起動] ボタンを選択すると、Cloud Shell を開くことができます。
または、Azure portal からアイコンを選択して Cloud Shell を開きます。
Cloud Shell インスタンスには、すべての必要なツールが既に備わっています。 別の環境を使用する場合は、次のコマンドライン ツールがインストールされていることを確認してください。
az
: Azure CLI (インストール手順)kubectl
: Kubernetes コマンドライン ツール (インストール手順)helm
: Kubernetes パッケージ マネージャー (インストール手順)jq
: コマンドライン JSON プロセッサ (インストール手順)
ID の作成
以下の手順に従って、Microsoft Entra サービス プリンシパル オブジェクトを作成します。
Azure ロールベースのアクセス制御 (RBAC) ロールを含む Active Directory サービス プリンシパルを作成します。
az ad sp create-for-rbac --role Contributor --scopes /subscriptions/mySubscriptionID -o json > auth.json appId=$(jq -r ".appId" auth.json) password=$(jq -r ".password" auth.json)
JSON 出力からの
appId
とpassword
の値を記録します。 次の手順で使用します。前のコマンドの出力からの
appId
値を使用して、新しいサービス プリンシパルのid
を取得します。objectId=$(az ad sp show --id $appId --query "id" -o tsv)
このコマンドの出力は
objectId
です。 次の手順で使用するため、この値を記録します。Azure Resource Manager テンプレート (ARM テンプレート) のデプロイで使用するパラメーター ファイルを作成します。
cat <<EOF > parameters.json { "aksServicePrincipalAppId": { "value": "$appId" }, "aksServicePrincipalClientSecret": { "value": "$password" }, "aksServicePrincipalObjectId": { "value": "$objectId" }, "aksEnableRBAC": { "value": false } } EOF
Kubernetes RBAC が有効のクラスターをデプロイするには、
aksEnableRBAC
をtrue
に設定します。
コンポーネントをデプロイする
以下の手順では、これらのコンポーネントをサブスクリプションに追加します。
- Azure Kubernetes Service (AKS)
- Azure Application Gateway v2
- 2 つのサブネットを含む Azure Virtual Network
- パブリック IP アドレス
- Microsoft Entra ポッド ID で使用される、マネージド ID。
コンポーネントをデプロイするには:
ARM テンプレートをダウンロードします。
wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/deploy/azuredeploy.json -O template.json
Azure CLI を使用して ARM テンプレートをデプロイし、必要に応じて変更します。 展開には、最大 5 分かかる場合があります。
resourceGroupName="MyResourceGroup" location="westus2" deploymentName="ingress-appgw" # create a resource group az group create -n $resourceGroupName -l $location # modify the template as needed az deployment group create \ -g $resourceGroupName \ -n $deploymentName \ --template-file template.json \ --parameters parameters.json
デプロイが完了したら、デプロイ出力を
deployment-outputs.json
という名前のファイルにダウンロードします。az deployment group show -g $resourceGroupName -n $deploymentName --query "properties.outputs" -o json > deployment-outputs.json
AGIC を設定する
前のセクションの手順に従って、新しい AKS クラスターと Application Gateway デプロイを作成して構成しました。 これで、新しい Kubernetes インフラストラクチャにサンプル アプリとイングレス コントローラーをデプロイする準備ができました。
Kubernetes 資格情報を設定する
以下の手順では、新しい Kubernetes クラスターに接続するために使用する kubectl コマンドを設定する必要があります。 Cloud Shell には kubectl
が既にインストールされています。 az
(Azure CLI) を使用して Kubernetes の資格情報を取得します。
新しくデプロイされた AKS インスタンスの資格情報を取得します。 次のコマンドの詳細については、「kubectl で Kubernetes 認可に Azure RBAC を使用する」を参照してください。
# use the deployment-outputs.json file created after deployment to get the cluster name and resource group name
aksClusterName=$(jq -r ".aksClusterName.value" deployment-outputs.json)
resourceGroupName=$(jq -r ".resourceGroupName.value" deployment-outputs.json)
az aks get-credentials --resource-group $resourceGroupName --name $aksClusterName
Microsoft Entra ポッド ID をインストールする
Microsoft Entra ポッド ID は、Azure Resource Manager へのトークンベースのアクセスを提供します。
Microsoft Entra ポッド ID によって、次のコンポーネントが Kubernetes クラスターに追加されます。
- Kubernetes カスタム リソース定義 (CRD):
AzureIdentity
、AzureAssignedIdentity
、AzureIdentityBinding
- Managed Identity Controller (MIC) コンポーネント
- Node Managed Identity (NMI) コンポーネント
Microsoft Entra ポッド ID をクラスターにインストールするには、次のコマンドのいずれかを使用します。
Kubernetes RBAC が有効の AKS クラスター:
kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment-rbac.yaml
Kubernetes RBAC が無効の AKS クラスター:
kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment.yaml
Helm リポジトリを追加します
Helm は、Kubernetes 用のパッケージ マネージャーです。 これを使用して、application-gateway-kubernetes-ingress
パッケージをインストールします。
Cloud Shell を使用する場合は、Helm をインストールする必要はありません。 Cloud Shell には Helm バージョン 3 が付属しています。 次のコマンドのいずれかを実行して、AGIC Helm リポジトリを追加します。
Kubernetes RBAC が有効の AKS クラスター:
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
Kubernetes RBAC が無効の AKS クラスター:
helm init
イングレス コントローラーの Helm chart をインストールする
前に作成した
deployment-outputs.json
ファイルを使用して、次の変数を作成します。applicationGatewayName=$(jq -r ".applicationGatewayName.value" deployment-outputs.json) resourceGroupName=$(jq -r ".resourceGroupName.value" deployment-outputs.json) subscriptionId=$(jq -r ".subscriptionId.value" deployment-outputs.json) identityClientId=$(jq -r ".identityClientId.value" deployment-outputs.json) identityResourceId=$(jq -r ".identityResourceId.value" deployment-outputs.json)
AGIC を構成する
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 will manage # appgw: subscriptionId: <subscriptionId> resourceGroup: <resourceGroupName> name: <applicationGatewayName> # Setting appgw.shared to "true" will create 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 will 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: AAD-Pod-Identity (https://github.com/Azure/aad-pod-identity) armAuth: type: aadPodIdentity identityResourceID: <identityResourceId> identityClientID: <identityClientId> ## Alternatively you can use Service Principal credentials # armAuth: # type: servicePrincipal # secretJSON: <<Generate this value with: "az ad sp create-for-rbac --subscription <subscription-uuid> --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
のセクションに記入します。sed -i "s|<subscriptionId>|${subscriptionId}|g" helm-config.yaml sed -i "s|<resourceGroupName>|${resourceGroupName}|g" helm-config.yaml sed -i "s|<applicationGatewayName>|${applicationGatewayName}|g" helm-config.yaml sed -i "s|<identityResourceId>|${identityResourceId}|g" helm-config.yaml sed -i "s|<identityClientId>|${identityClientId}|g" helm-config.yaml
Note
ソブリン クラウド (Azure Government など) にデプロイする場合は、
appgw.environment
構成パラメーターを追加し、適切な値に設定する必要があります。の値を次に示します。
verbosityLevel
: AGIC ログ インフラストラクチャの詳細レベルを設定します。 指定できる値については、「ログ レベル」を参照してください。appgw.environment
: クラウド環境を設定します。 指定できる値:AZURECHINACLOUD
、AZUREGERMANCLOUD
、AZUREPUBLICCLOUD
、AZUREUSGOVERNMENTCLOUD
。appgw.subscriptionId
: Application Gateway が存在する Azure サブスクリプション ID。 例:aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
。appgw.resourceGroup
: Application Gateway デプロイを作成した Azure リソース グループの名前。 例:app-gw-resource-group
。appgw.name
: Application Gateway デプロイの名前。 例:applicationgatewayd0f0
。appgw.shared
:false
を既定値とするブール値フラグ。 共有 Application Gateway デプロイが必要な場合は、true
に設定します。kubernetes.watchNamespace
: AGIC で監視する必要がある名前空間を指定します。 名前空間の値には、単一の文字列値、または名前空間のコンマ区切り一覧を指定できます。armAuth.type
:aadPodIdentity
またはservicePrincipal
にできます。armAuth.identityResourceID
: Azure マネージド ID のリソース ID。armAuth.identityClientID
: ID のクライアント ID。armAuth.secretJSON
: シークレットの種類としてサービス プリンシパルを選択した場合 (つまり、armAuth.type
をservicePrincipal
に設定した場合) にのみ必要です。
Note
identityResourceID
とidentityClientID
の値は、コンポーネントをデプロイするための以前の手順で作成しました。 それらは、次のコマンドを使用して再度取得できます。az identity show -g <resource-group> -n <identity-name>
コマンドの
<resource-group>
は、Application Gateway デプロイのリソース グループです。<identity-name>
プレースホルダーは、作成された ID の名前です。az identity list
を使用すると、特定のサブスクリプションのすべての ID を一覧表示できます。AGIC パッケージをインストールします。
helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
サンプル アプリをインストールする
Application Gateway、AKS、AGIC がインストールされたので、Azure Cloud Shell を使用してサンプル アプリをインストールできます。
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: aspnetapp
labels:
app: aspnetapp
spec:
containers:
- image: "mcr.microsoft.com/dotnet/samples:aspnetapp"
name: aspnetapp-image
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: aspnetapp
spec:
selector:
app: aspnetapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aspnetapp
annotations:
kubernetes.io/ingress.class: azure/application-gateway
spec:
rules:
- http:
paths:
- path: /
pathType: Exact
backend:
service:
name: aspnetapp
port:
number: 80
pathType: Exact
EOF
または、次を実行できます。
上記の YAML ファイルをダウンロードします。
curl https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/aspnetapp.yaml -o aspnetapp.yaml
YAML ファイルを適用します。
kubectl apply -f aspnetapp.yaml