Delen via


Ondersteuning voor meerdere naamruimten inschakelen in een AKS-cluster met behulp van AGIC

Met Kubernetes-naamruimten kan een Kubernetes-cluster worden gepartitioneerd en toegewezen aan subgroepen van een groter team. Deze subgroepen kunnen vervolgens infrastructuur implementeren en beheren met nauwkeurige controle over resources, beveiliging en configuratie. Met Kubernetes kunnen een of meer toegangsbeheerobjectresources onafhankelijk binnen elke naamruimte worden gedefinieerd.

Vanaf versie 0.7 kan de Application Gateway Kubernetes Ingress Controller (AGIC) gebeurtenissen opnemen uit en meerdere naamruimten observeren. Als een AKS-beheerder (Azure Kubernetes Service) besluit Azure-toepassing Gateway te gebruiken als inkomend verkeer, gebruiken alle naamruimten dezelfde implementatie van Application Gateway. Eén installatie van AGIC bewaakt toegankelijke naamruimten en configureert de Application Gateway-implementatie waaraan deze is gekoppeld.

Versie 0.7 van AGIC blijft exclusief de default naamruimte observeren, tenzij u deze expliciet wijzigt in een of meer andere naamruimten in de Helm-configuratie.

Tip

Overweeg Application Gateway for Containers voor uw Kubernetes-oplossing voor inkomend verkeer.

Ondersteuning voor meerdere naamruimten inschakelen

  1. Wijzig het helm-config.yaml-bestand op een van de volgende manieren:

    • Verwijder de watchNamespace sleutel volledig uit helm-config.yaml. AGIC bekijkt alle naamruimten.
    • Ingesteld watchNamespace op een lege tekenreeks. AGIC bekijkt alle naamruimten.
    • Voeg meerdere naamruimten toe, gescheiden door een komma (bijvoorbeeld watchNamespace: default,secondNamespace). AGIC bekijkt deze naamruimten uitsluitend.
  2. Wijzigingen in Helm-sjablonen toepassen door uit te voeren helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure.

Nadat u AGIC hebt geïmplementeerd met de mogelijkheid om meerdere naamruimten te observeren, worden de volgende acties uitgevoerd:

  • Hiermee worden toegangsbeheerobjectbronnen van alle toegankelijke naamruimten weergegeven
  • Filters voor inkomend verkeer met resources met aantekeningen kubernetes.io/ingress.class: azure/application-gateway
  • Stelt een gecombineerde Application Gateway-configuratie samen
  • De configuratie toepassen op de gekoppelde Application Gateway-implementatie via Azure Resource Manager

Conflicterende configuraties verwerken

Resources met meerdere naamruimten voor inkomend verkeer kunnen AGIC instrueren om conflicterende configuraties te maken voor één Application Gateway-implementatie. Dat wil zeggen dat twee ingresses hetzelfde domein kunnen claimen.

Boven aan de hiërarchie kan AGIC listeners maken (IP-adres, poort en host) en routeringsregels (bindinglistener, back-endpool en HTTP-instellingen). Meerdere naamruimten en ingresses kunnen deze delen.

Aan de andere kant kan AGIC paden, back-endpools, HTTP-instellingen en TLS-certificaten voor slechts één naamruimte maken en duplicaten verwijderen.

Denk bijvoorbeeld aan de volgende dubbele toegangsbeheerobjectbronnen die zijn gedefinieerd in de staging en production naamruimten voor 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

Ondanks de twee toegangsbeheerobjectbronnen die veel verkeer www.contoso.com eisen om naar de respectieve Kubernetes-naamruimten te worden gerouteerd, kan slechts één back-end het verkeer onderhouden. AGIC maakt een configuratie op basis van 'first in, first out' voor een van de resources. Als twee toegangsbeheerobjectbronnen tegelijkertijd worden gemaakt, heeft de eerder in het alfabet prioriteit. Op basis van deze eigenschap maakt AGIC instellingen voor het production inkomend verkeer. Application Gateway is geconfigureerd met de volgende resources:

  • Luisteraar: fl-www.contoso.com-80
  • Routeringsregel: rr-www.contoso.com-80
  • Back-endpool: pool-production-contoso-web-service-80-bp-80
  • HTTP-instellingen: bp-production-contoso-web-service-80-80-websocket-ingress
  • Statustest: pb-production-contoso-web-service-80-websocket-ingress

Notitie

Met uitzondering van de listener- en routeringsregel bevatten de gemaakte Application Gateway-resources de naam van de naamruimte (production) waarvoor AGIC deze heeft gemaakt.

Als de twee toegangsbeheerresources op verschillende tijdstippen in het AKS-cluster worden geïntroduceerd, eindigt AGIC waarschijnlijk in een scenario waarin Application Gateway opnieuw wordt geconfigureerd en verkeer wordt omgeleid van namespace-B naar namespace-A.

Als u bijvoorbeeld eerst toevoegt staging , configureert AGIC Application Gateway om verkeer te routeren naar de back-endpool voor fasering. In een later stadium zorgt de introductie van inkomend production verkeer ervoor dat AGIC Application Gateway opnieuw programmeert, waardoor verkeer naar de production back-endpool wordt gerouteerd.

Toegang tot naamruimten beperken

Standaard configureert AGIC Application Gateway op basis van geannoteerde toegangsbeheerobjecten binnen een naamruimte. Als u dit gedrag wilt beperken, hebt u de volgende opties:

  • Beperk de naamruimten door expliciet naamruimten te definiëren die AGIC moet observeren via de watchNamespace YAML-sleutel in helm-config.yaml.
  • Gebruik Role- en RoleBinding-objecten om AGIC te beperken tot specifieke naamruimten.

Voorbeeld van Helm-configuratiebestand

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