使用新的 應用程式閘道 部署來安裝 AGIC
本文中的指示假設您想要在沒有預先存在元件的環境中安裝 應用程式閘道 輸入控制器 (AGIC)。
提示
請考慮針對 Kubernetes 輸入解決方案的容器 應用程式閘道。 如需詳細資訊,請參閱快速入門:部署適用於容器 ALB 控制器的 應用程式閘道。
安裝必要的命令行工具
我們建議針對本文中的所有命令行作業使用 Azure Cloud Shell 。 您可以選取 [啟動 Cloud Shell] 按鈕來開啟 Cloud Shell 。
或者,從 Azure 入口網站 開啟 Cloud Shell,方法是選取其圖示。
您的 Cloud Shell 實例已經有所有必要的工具。 如果您選擇使用另一個環境,請確定已安裝下列命令列工具:
az
:Azure CLI(安裝指示)kubectl
:Kubernetes 命令行工具 (安裝指示)helm
:Kubernetes 套件管理員(安裝指示)jq
:命令行 JSON 處理器(安裝指示)
建立身分識別
使用下列步驟建立Microsoft Entra 服務主體物件。
建立 Active Directory 服務主體,其中包含 Azure 角色型存取控制 (RBAC) 角色:
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)
appId
記錄來自 JSON 輸出的 和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 應用程式閘道 v2
- 具有兩個子網的 Azure 虛擬網絡
- 公用 IP 位址
- 受控識別,Microsoft Entra Pod 身分識別 將使用。
若要部署元件:
下載 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 叢集和 應用程式閘道 部署。 您現在已準備好將範例應用程式和輸入控制器部署到新的 Kubernetes 基礎結構。
設定 Kubernetes 認證
針對下列步驟,您必須設定 kubectl 命令,您將用來連線到新的 Kubernetes 叢集。 Cloud Shell 已安裝 kubectl
。 您將使用 az
(Azure CLI) 來取得 Kubernetes 的認證。
取得新部署 AKS 實例的認證。 如需下列命令的詳細資訊,請參閱 搭配 kubectl 使用 Azure RBAC 進行 Kubernetes 授權。
# 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 Pod 身分識別
Microsoft Entra Pod 身分識別提供 Azure Resource Manager 的令牌型存取。
Microsoft Entra Pod 身分識別會將下列元件新增至 Kubernetes 叢集:
- Kubernetes 自訂資源定義 (CRDs):
AzureIdentity
、、AzureAssignedIdentity
AzureIdentityBinding
- 受控識別控制器 (MIC) 元件
- 節點受控識別 (NMI) 元件
若要將Microsoft Entra Pod 身分識別安裝到您的叢集,請使用下列其中一個命令:
已啟用 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 圖表
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)
下載
helm-config.yaml
,其會設定 AGIC: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
檔案,並填寫 和armAuth
的區段appgw
: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
注意
如果您要部署至主權雲端(例如 Azure Government),您必須新增
appgw.environment
組態參數並將其設定為適當的值。以下是 值:
verbosityLevel
:設定 AGIC 記錄基礎結構的詳細資訊層級。 如需可能的值,請參閱 記錄層級。appgw.environment
:設定雲端環境。 可能的值:AZURECHINACLOUD
、、、AZUREGERMANCLOUD
AZUREPUBLICCLOUD
。AZUREUSGOVERNMENTCLOUD
appgw.subscriptionId
:應用程式閘道 所在的 Azure 訂用帳戶標識碼。 範例:aaaa0000-bb11-2222-33cc-444444dddddd
。appgw.resourceGroup
:您在其中建立 應用程式閘道 部署的 Azure 資源群組名稱。 範例:app-gw-resource-group
。appgw.name
:應用程式閘道 部署的名稱。 範例:applicationgatewayd0f0
。appgw.shared
:預設為false
的布爾值旗標。 如果您需要共享 應用程式閘道 部署,請將它設定為true
。kubernetes.watchNamespace
:指定 AGIC 應該監看的命名空間。 命名空間值可以是單一字串值或以逗號分隔的命名空間清單。armAuth.type
:可以是aadPodIdentity
或servicePrincipal
。armAuth.identityResourceID
:Azure 受控識別的資源標識符。armAuth.identityClientID
:身分識別的用戶端識別碼。armAuth.secretJSON
:只有在您選擇服務主體做為秘密類型時才需要 (也就是當您將 設定armAuth.type
為servicePrincipal
時)。
注意
您在先前的步驟中建立
identityResourceID
和identityClientID
值,以部署 元件。 您可以使用下列命令再次取得它們:az identity show -g <resource-group> -n <identity-name>
在 命令中,
<resource-group>
是 應用程式閘道 部署的資源群組。 佔<identity-name>
位元是所建立身分識別的名稱。 您可以使用 列出特定訂az identity list
用帳戶的所有身分識別。安裝 AGIC 套件:
helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
安裝範例應用程式
現在您已安裝 應用程式閘道、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