Partilhar via


Habilite o suporte a vários namespaces em um cluster AKS usando o AGIC

Os namespaces do Kubernetes possibilitam que um cluster do Kubernetes seja particionado e alocado para subgrupos de uma equipe maior. Esses subgrupos podem implantar e gerenciar a infraestrutura com controles mais precisos de recursos, segurança e configuração. 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 Application Gateway Kubernetes Ingress Controller (AGIC) pode ingerir eventos e observar vários namespaces. Se um administrador do Serviço Kubernetes do Azure (AKS) decidir usar o Gateway de Aplicativo do Azure como uma entrada, todos os namespaces usarão a mesma implantação do Gateway de Aplicativo. Uma única instalação do AGIC monitora namespaces acessíveis e configura a implantação do Application Gateway à qual ele está associado.

A versão 0.7 do AGIC continua a observar exclusivamente o namespace, a default menos que você o altere explicitamente para um ou mais namespaces diferentes na configuração do Helm.

Gorjeta

Considere o Application Gateway for Containers para sua solução de ingresso do Kubernetes.

Habilitar suporte a vários namespaces

  1. Modifique o arquivo helm-config.yaml de uma das seguintes maneiras:

    • Exclua a watchNamespace chave inteiramente de helm-config.yaml. A AGIC observa todos os namespaces.
    • Defina watchNamespace como uma cadeia de caracteres vazia. A AGIC observa todos os namespaces.
    • Adicione vários namespaces separados por uma vírgula (por exemplo, watchNamespace: default,secondNamespace). A AGIC observa exclusivamente esses namespaces.
  2. Aplique as alterações de modelo do Helm executando helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure.

Depois de implantar o AGIC com a capacidade de observar vários namespaces, ele executa as seguintes ações:

  • Lista recursos de entrada de todos os namespaces acessíveis
  • Filtra para ingressar recursos anotados com kubernetes.io/ingress.class: azure/application-gateway
  • Compõe uma configuração combinada do Application Gateway
  • Aplica a configuração à implantação do Gateway de Aplicativo associada por meio do Azure Resource Manager

Lidar com configurações conflitantes

Recursos de entrada com vários namespaces podem instruir a AGIC a criar configurações conflitantes para uma única implantação do Application Gateway. Ou seja, duas entradas poderiam reivindicar o mesmo domínio.

No topo da hierarquia, a AGIC pode criar ouvintes (endereço IP, porta e host) e regras de roteamento (ouvinte de ligação, pool de back-end e configurações HTTP). Vários namespaces e entradas podem compartilhá-los.

Por outro lado, o AGIC poderia criar caminhos, pools de back-end, configurações HTTP e certificados TLS para apenas um namespace e remover duplicatas.

Por exemplo, considere os seguintes recursos de entrada duplicados staging definidos nos namespaces 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 com base no princípio "primeiro a entrar, primeiro a sair" para um dos recursos. Se dois recursos de entrada forem criados ao mesmo tempo, o anterior no alfabeto terá precedência. Com base nessa propriedade, a AGIC cria configurações 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 Application Gateway criados incluem o nome do namespace (production) para o qual a AGIC os criou.

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 reconfigura o Application Gateway e redireciona o tráfego de namespace-B para namespace-A.

Por exemplo, se você adicionar staging primeiro, a AGIC configurará 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:

  • Limite os namespaces definindo explicitamente namespaces que a AGIC deve observar por meio da watchNamespace chave YAML em helm-config.yaml.
  • Use os objetos Role e 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 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>