Partilhar via


Instalar o AGIC usando uma implantação existente do Application Gateway

O Application Gateway Ingress Controller (AGIC) é um pod dentro do cluster do Serviço Kubernetes do Azure (AKS). A AGIC monitora os recursos do Kubernetes Ingress . Ele cria e aplica uma configuração do Gateway de Aplicativo do Azure com base no status do cluster Kubernetes.

Gorjeta

Considere o Application Gateway for Containers para sua solução de ingresso do Kubernetes. Para obter mais informações, consulte Guia de início rápido: implantar o Application Gateway for Containers ALB Controller.

Pré-requisitos

Este artigo pressupõe que você já instalou as seguintes ferramentas e infraestrutura:

Adicionar o repositório Helm

Helm é um gerenciador de pacotes para o Kubernetes. Você o usa para instalar o application-gateway-kubernetes-ingress pacote.

Se você usa o Cloud Shell, não precisa instalar o Helm. O Cloud Shell vem com o Helm versão 3. Execute os seguintes comandos para adicionar o repositório AGIC Helm para um cluster AKS habilitado com o RBAC (controle de acesso baseado em função) do Kubernetes:

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

Fazer backup da implantação do Application Gateway

Antes de instalar o AGIC, faça backup da configuração da implantação do Application Gateway:

  1. No portal do Azure, vá para sua implantação do Gateway de Aplicativo.
  2. Na seção Automação, selecione Exportar modelo e, em seguida, selecione Download.

O arquivo .zip baixado contém modelos JSON, scripts Bash e scripts PowerShell que você pode usar para restaurar o Application Gateway, se uma restauração se tornar necessária.

Configurar uma identidade para autenticação do Resource Manager

A AGIC se comunica com o servidor de API do Kubernetes e o Azure Resource Manager. Ele requer uma identidade para acessar essas APIs. Você pode usar a ID de carga de trabalho do Microsoft Entra ou uma entidade de serviço.

Configurar o ID de carga de trabalho do Microsoft Entra

Microsoft Entra Workload ID é uma identidade que você atribui a uma carga de trabalho de software. Essa identidade permite que seu pod AKS se autentique com outros recursos do Azure.

Para essa configuração, você precisa de autorização para o pod AGIC fazer solicitações HTTP ao Azure Resource Manager.

  1. Use o comando Azure CLI az account set para definir uma assinatura específica como sendo a assinatura ativa atual:

    az account set --subscription "subscriptionID"
    

    Em seguida, use o comando az identity create para criar uma identidade gerenciada. Você deve criar a identidade no grupo de recursos do nó. O grupo de recursos do nó recebe um nome por padrão, como MC_myResourceGroup_myAKSCluster_eastus.

    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. Para a atribuição de função, execute o seguinte comando para identificar o principalId valor da identidade recém-criada:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Conceda ao Colaborador de identidade acesso à sua implantação do Application Gateway. Você precisa da ID da implantação do Application Gateway, que se parece com /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C.

    Primeiro, obtenha a lista de IDs do Application Gateway em sua assinatura executando o seguinte comando:

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

    Para atribuir o acesso de Colaborador de identidade, execute o seguinte comando:

    $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. Conceda ao Leitor de identidade acesso ao grupo de recursos do Gateway de Aplicativo. O ID do grupo de recursos tem a aparência de /subscriptions/A/resourceGroups/B. Você pode obter todos os grupos de recursos executando 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
    

Nota

Verifique se a identidade que a AGIC usa tem a permissão Microsoft.Network/virtualNetworks/subnets/join/action delegada à sub-rede onde o Application Gateway está implantado. Se você não definiu uma função personalizada que tenha essa permissão, poderá usar a função interna de Colaborador de Rede .

Configurar uma entidade de serviço

Também é possível fornecer acesso AGIC ao Azure Resource Manager usando um segredo do Kubernetes:

  1. Crie uma entidade de serviço do Ative Directory e codifice-a com Base64. A codificação Base64 é necessária para que o blob JSON seja salvo no Kubernetes.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Adicione o blob JSON codificado em Base64 ao helm-config.yaml arquivo. O helm-config.yaml arquivo configura o AGIC.

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

Implantar o complemento AGIC

Criar um manifesto de implantação para o controlador de entrada

---
# 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

Implantar o controlador de ingresso

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

Instale o controlador de entrada como um gráfico de leme

Use o Cloud Shell para instalar o pacote AGIC Helm:

  1. Execute uma atualização do Helm:

    helm repo update
    
  2. Baixar helm-config.yaml:

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

    Ou copie o seguinte arquivo 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. Edite helm-config.yaml e preencha os valores de appgw e armAuth.

    Nota

    <identity-client-id> é uma propriedade do valor Microsoft Entra Workload ID que você configurou na seção anterior. Você pode recuperar essas informações executando o seguinte comando: az identity show -g <resourcegroup> -n <identity-name>. Nesse comando, <resourcegroup> é o grupo de recursos que hospeda os recursos de infraestrutura relacionados ao cluster AKS, ao Application Gateway e à identidade gerenciada.

  4. Instale o gráfico Helm com a helm-config.yaml configuração da etapa anterior:

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

    Como alternativa, você pode combinar helm-config.yaml e o comando Helm em uma etapa:

    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. Verifique o log do pod recém-criado para verificar se ele foi iniciado corretamente.

Para entender como você pode expor um serviço AKS à Internet por HTTP ou HTTPS usando uma implantação do Gateway de Aplicativo do Azure, consulte este guia de instruções.

Configurar uma implantação compartilhada do Application Gateway

Por padrão, a AGIC assume a propriedade total da implantação do Application Gateway à qual está vinculada. O AGIC versão 0.8.0 e posterior pode compartilhar uma única implantação do Gateway de Aplicativo com outros componentes do Azure. Por exemplo, você pode usar a mesma implantação do Gateway de Aplicativo para um aplicativo hospedado em um conjunto de escala de máquina virtual do Azure e um cluster AKS.

Cenário de exemplo

Vejamos uma implantação imaginária do Application Gateway que gerencia o tráfego de dois sites:

  • dev.contoso.com: Hospedado em um novo cluster AKS usando o Application Gateway e o AGIC.
  • prod.contoso.com: Hospedado em um conjunto de escala de máquina virtual.

Com as configurações padrão, a AGIC assume 100% de propriedade da implantação do Application Gateway para a qual é apontada. O AGIC substitui toda a configuração do App Gateway. Se você criar manualmente um ouvinte para prod.contoso.com no Application Gateway sem defini-lo na entrada do Kubernetes, o AGIC excluirá a prod.contoso.com configuração em segundos.

Para instalar o AGIC e também servir prod.contoso.com a partir das máquinas que usam o conjunto de dimensionamento de máquina virtual, você deve restringir o AGIC apenas à configuração dev.contoso.com . Você facilita essa restrição instanciando a seguinte definição de recurso personalizada (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

O comando anterior cria um AzureIngressProhibitedTarget objeto. Este objeto torna o AGIC (versão 0.8.0 e posterior) ciente da existência da configuração do Application Gateway para prod.contoso.com. Este objeto também instrui explicitamente a AGIC a evitar alterar qualquer configuração relacionada a esse nome de host.

Habilitar uma implantação compartilhada do Application Gateway usando uma nova instalação AGIC

Para limitar o AGIC (versão 0.8.0 e posterior) a um subconjunto da configuração do Application Gateway, modifique o helm-config.yaml modelo. appgw: Na seção, adicione uma shared chave e defina-a comotrue:

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

Aplique as alterações do leme:

  1. Certifique-se de que o AzureIngressProhibitedTarget CRD está instalado:

    kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
    
  2. Atualizar leme:

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

Como resultado, seu cluster AKS tem uma nova instância chamada AzureIngressProhibitedTarget prohibit-all-targets:

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

O prohibit-all-targets objeto proíbe o AGIC de alterar a configuração de qualquer host e caminho. O Helm é instalado com appgw.shared=true implanta o AGIC, mas não faz alterações no Application Gateway.

Ampliar permissões

Como o Helm com appgw.shared=true e o padrão prohibit-all-targets impede que o AGIC aplique uma configuração, você deve ampliar as permissões do AGIC:

  1. Crie um novo arquivo YAML nomeado AzureIngressProhibitedTarget com o seguinte trecho que contém sua configuração específica:

    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. Agora que você criou sua própria proibição personalizada, você pode excluir a padrão, que é muito ampla:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Habilitar uma implantação compartilhada do Application Gateway para uma instalação AGIC existente

Suponha que você já tenha um cluster AKS em funcionamento e uma implantação do Application Gateway e tenha configurado o AGIC em seu cluster. Você tem um Ingress para prod.contoso.com e está servindo com êxito o tráfego para ele a partir do cluster.

Você deseja adicionar staging.contoso.com à sua implantação existente do Application Gateway, mas precisa hospedá-la em uma máquina virtual. Você vai reutilizar a implantação existente do Application Gateway e configurar manualmente um ouvinte e pools de back-end para staging.contoso.com. Mas ajustar manualmente a configuração do Gateway de Aplicativo (usando o portal do Azure, APIs do Gerenciador de Recursos ou Terraform) entraria em conflito com as suposições de propriedade total da AGIC. Logo após aplicar as alterações, a AGIC as substitui ou exclui.

Você pode proibir o AGIC de fazer alterações em um subconjunto da configuração:

  1. Crie um novo arquivo YAML nomeado AzureIngressProhibitedTarget usando o seguinte trecho:

    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. Exiba o objeto recém-criado:

    kubectl get AzureIngressProhibitedTargets
    
  3. Modifique a configuração do Gateway de Aplicativo no portal do Azure. Por exemplo, adicione ouvintes, regras de roteamento e back-ends. O novo objeto que você criou (manually-configured-staging-environment) proíbe o AGIC de substituir a configuração do Application Gateway relacionada ao staging.contoso.com.