Partilhar via


Habilite o suporte a vários namespaces em um cluster AKS com o Application Gateway Ingress Controller

Motivação

Os namespaces do Kubernetes possibilitam que um cluster do Kubernetes seja particionado e alocado para subgrupos de uma equipe maior. Essas subequipes podem então implantar e gerenciar a infraestrutura com controles mais precisos de recursos, segurança, configuração, etc. O Kubernetes permite que um ou mais recursos de entrada sejam definidos independentemente dentro de cada namespace.

A partir da versão 0.7 , o Kubernetes IngressController (AGIC) do Gateway de Aplicativo do Azure pode ingerir eventos e observar vários namespaces. Se o administrador do AKS decidir usar o Application Gateway como entrada, todos os namespaces usarão a mesma instância do Application Gateway. Uma única instalação do Ingress Controller monitora namespaces acessíveis e configura o Application Gateway ao qual está associado.

A versão 0.7 do AGIC continua a observar exclusivamente o namespace, a default menos que ele seja explicitamente alterado para um ou mais namespaces diferentes na configuração do Helm. Consulte a secção seguinte.

Ativar suporte de múltiplos espaços de nomes

Para habilitar o suporte a vários namespaces:

  1. Modifique o arquivo helm-config.yaml de uma das seguintes maneiras:
    • excluir a watchNamespace chave inteiramente de helm-config.yaml - AGIC observa todos os namespaces
    • definido watchNamespace como uma cadeia de caracteres vazia - AGIC observa todos os namespaces
    • adicionar vários namespaces separados por uma vírgula (watchNamespace: default,secondNamespace) - a AGIC observa esses namespaces exclusivamente
  2. aplicar alterações de modelo do Helm com: helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure

Uma vez implantado com a capacidade de observar vários namespaces, o AGIC executa as seguintes ações:

  • lista recursos de entrada de todos os namespaces acessíveis
  • filtros para ingressar recursos anotados com kubernetes.io/ingress.class: azure/application-gateway
  • compõe a configuração combinada do Application Gateway
  • aplica a configuração ao Application Gateway associado via ARM

Configurações conflitantes

Vários recursos de entrada de namespace podem instruir a AGIC a criar configurações conflitantes para um único Application Gateway. (Duas entradas reivindicando o mesmo domínio, por exemplo.)

No topo da hierarquia - ouvintes (endereço IP, porta e host) e regras de roteamento (ouvinte de ligação, pool de back-end e configurações HTTP) podem ser criados e compartilhados por vários namespaces/ingressos.

Por outro lado, caminhos, pools de back-end, configurações HTTP e certificados TLS podem ser criados apenas por um namespace e as duplicatas são removidas.

Por exemplo, considere os seguintes recursos de entrada duplicados definidos namespaces staging e production para www.contoso.com:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: websocket-ingress
  namespace: staging
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
    - host: www.contoso.com
      http:
        paths:
          - backend:
              serviceName: web-service
              servicePort: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: websocket-ingress
  namespace: production
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
    - host: www.contoso.com
      http:
        paths:
          - backend:
              serviceName: web-service
              servicePort: 80

Apesar dos dois recursos de entrada exigirem tráfego para www.contoso.com ser roteado para os respetivos namespaces do Kubernetes, apenas um back-end pode atender ao tráfego. O AGIC cria uma configuração baseada em uma base "primeiro a entrar, primeiro a sair" para um dos recursos. Se dois recursos de entrada são criados ao mesmo tempo, o anterior no alfabeto tem precedência. Com base nessa propriedade, as configurações são criadas para a production entrada. O Application Gateway é configurado com os seguintes recursos:

  • Ouvinte: fl-www.contoso.com-80
  • Regra de roteamento: rr-www.contoso.com-80
  • Pool de back-end: pool-production-contoso-web-service-80-bp-80
  • Configurações HTTP: bp-production-contoso-web-service-80-80-websocket-ingress
  • Sonda de Saúde: pb-production-contoso-web-service-80-websocket-ingress

Nota

Exceto para o ouvinte e a regra de roteamento, os recursos do Gateway de Aplicativo criados incluem o nome do namespace (production) para o qual foram criados.

Se os dois recursos de entrada forem introduzidos no cluster AKS em momentos diferentes, é provável que o AGIC acabe em um cenário em que reconfigure o Application Gateway e redirecione o tráfego de namespace-B para namespace-A.

Por exemplo, se você adicionou staging primeiro, a AGIC configura o Application Gateway para rotear o tráfego para o pool de back-end de preparação. Em um estágio posterior, a introdução production da entrada faz com que a AGIC reprograme o Application Gateway, que inicia o roteamento do tráfego para o pool de production back-end.

Restringir o acesso a namespaces

Por padrão, a AGIC configura o Application Gateway com base na Entrada anotada em qualquer namespace. Se você quiser limitar esse comportamento, você tem as seguintes opções:

  • limitar os namespaces, definindo explicitamente namespaces AGIC deve observar através da watchNamespace chave YAML em helm-config.yaml
  • use Role/RoleBinding para limitar o AGIC a namespaces específicos

Exemplo de arquivo de configuração do Helm

    # 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 manages
    #
    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 watches
    # Default value is "default"
    # Leaving this variable out or setting it to blank or empty string would
    # result in Ingress Controller observing all acessible 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>