Share via


Activer la prise en charge de plusieurs espaces de noms dans un cluster AKS avec un contrôleur d’entrée Application Gateway

Motivation

Les espaces de noms Kubernetes permettent de partitionner un cluster Kubernetes et de l’allouer à des sous-groupes d’une équipe plus importante. Ces sous-équipes peuvent ensuite déployer et gérer l’infrastructure avec un contrôle affiné des ressources, de la sécurité, de la configuration, etc. Kubernetes permet de définir indépendamment une ou plusieurs ressources d’entrée au sein de chaque espace de noms.

À partir de la version 0.7, Azure Application Gateway Kubernetes IngressController (AGIC) peut observer plusieurs espaces de noms et en ingérer des événements. Si l’administrateur AKS décide d’utiliser application Gateway comme entrée, tous les espaces de noms utilisent la même instance d’Application Gateway. Une seule installation du contrôleur d’entrée surveille les espaces de noms accessibles et configure la passerelle Application Gateway associée.

La version 0.7 d’AGIC continue d’observer exclusivement l’espace de noms default , sauf s’il est explicitement remplacé par un ou plusieurs espaces de noms différents dans la configuration Helm. Voir la section suivante.

Activer la prise en charge de plusieurs espaces de noms

Pour activer la prise en charge de plusieurs espaces de noms :

  1. modifiez le fichier helm-config.yaml de l’une des manières suivantes :
    • supprimer entièrement la clé watchNamespace de helm-config.yaml - AGIC observe tous les espaces de noms
    • définir watchNamespace sur une chaîne vide - AGIC observe tous les espaces de noms
    • ajouter plusieurs espaces de noms séparés par une virgule (watchNamespace: default,secondNamespace) - AGIC observe ces espaces de noms exclusivement
  2. appliquez les modifications du modèle Helm avec : helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure

Une fois déployé avec la possibilité d’observer plusieurs espaces de noms, AGIC effectue les actions suivantes :

  • répertorie les ressources d’entrée de tous les espaces de noms accessibles
  • filtre les ressources d’entrée annotées avec kubernetes.io/ingress.class: azure/application-gateway
  • compose configuration Application Gateway combinée
  • applique la configuration à application Gateway associée via ARM

Configurations conflictuelles

Des ressources d’entrée à plusieurs espaces de noms peuvent demander à AGIC de créer des configurations conflictuelles pour une seule Application Gateway. (Deux entrées revendiquant le même domaine, par exemple.)

En haut de la hiérarchie : des écouteurs (adresse IP, port et hôte) et des règles d’acheminement (écouteur de liaison, pool principal et paramètres HTTP) peuvent être créés et partagés par plusieurs espaces de noms/entrées.

En revanche, les chemins d’accès, les pools principaux, les paramètres HTTP et les certificats TLS peuvent être créés par un seul espace de noms et les doublons sont supprimés.

Par exemple, considérez que les ressources d’entrée en double suivantes définissent les espaces de noms staging et production pour 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

Bien que les deux ressources d’entrée exigent que le trafic pour www.contoso.com soit acheminé vers les espaces de noms Kubernetes respectifs, un seul serveur principal peut fournir le trafic. AGIC crée une configuration basée sur une base « première entrée, première sortie » pour l’une des ressources. Si deux ressources d’ingresses sont créées en même temps, celle précédemment dans l’alphabet est prioritaire. En fonction de cette propriété, les paramètres sont créés pour l’entrée production . Application Gateway est configuré avec les ressources suivantes :

  • Écouteur : fl-www.contoso.com-80
  • Règle d’acheminement : rr-www.contoso.com-80
  • Pool principal : pool-production-contoso-web-service-80-bp-80
  • Paramètres HTTP : bp-production-contoso-web-service-80-80-websocket-ingress
  • Sonde d’intégrité : pb-production-contoso-web-service-80-websocket-ingress

Remarque

À l’exception de écouteur et règle de routage, les ressources Application Gateway créées incluent le nom de l’espace de noms (production) pour lequel elles ont été créées.

Si les deux ressources d’entrée sont introduites dans le cluster AKS à des moments différents, il est probable que L’AGIC se retrouve dans un scénario où il reconfigure Application Gateway et redirige le trafic de namespace-B vers namespace-A.

Par exemple, si vous avez ajouté staging en premier, AGIC configure Application Gateway pour router le trafic vers le pool principal intermédiaire. À un stade ultérieur, l’introduction de production entrée entraîne la réprogrammation d’Application Gateway par AGIC, qui commence à router le trafic vers le pool principal production .

Limiter l’accès aux espaces de noms

Par défaut, AGIC configure Application Gateway en fonction des entrées annotées dans n’importe quel espace de noms. Si vous souhaitez limiter ce comportement, vous disposez des options suivantes :

  • limitez les espaces de noms en définissant explicitement ceux qu’AGIC doit observer par le biais de la clé YAML watchNamespace dans helm-config.yaml
  • utilisez Role/RoleBinding pour limiter AGIC à des espaces de noms spécifiques

Exemple de fichier config 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>