Condividi tramite


Abilitare il supporto di più spazi dei nomi in un cluster del servizio Azure Kubernetes tramite AGIC

Gli spazi dei nomi Kubernetes consentono di partizionare e allocare un cluster Kubernetes ai sottogruppi di un team più grande. Questi sottogruppi possono quindi distribuire e gestire l'infrastruttura con controlli più avanzati di risorse, sicurezza e configurazione. Kubernetes consente di definire in modo indipendente una o più risorse di ingresso all'interno di ogni spazio dei nomi.

A partire dalla versione 0.7, il controller di ingresso kubernetes gateway applicazione può inserire eventi da e osservare più spazi dei nomi. Se un amministratore del servizio Azure Kubernetes servizio Azure Kubernetes decide di usare app Azure gateway di ingresso, tutti gli spazi dei nomi usano la stessa distribuzione di gateway applicazione. Una singola installazione di AGIC monitora gli spazi dei nomi accessibili e configura la distribuzione gateway applicazione a cui è associata.

La versione 0.7 di AGIC continua a osservare esclusivamente lo default spazio dei nomi, a meno che non venga modificato in modo esplicito in uno o più spazi dei nomi diversi nella configurazione Helm.

Suggerimento

Prendere in considerazione gateway applicazione per i contenitori per la soluzione di ingresso Kubernetes.

Abilitare il supporto di più spazi dei nomi

  1. Modificare il file helm-config.yaml in uno dei modi seguenti:

    • Eliminare completamente la watchNamespace chiave da helm-config.yaml. AGIC osserva tutti gli spazi dei nomi.
    • Impostare watchNamespace su una stringa vuota. AGIC osserva tutti gli spazi dei nomi.
    • Aggiungere più spazi dei nomi separati da una virgola , ad esempio watchNamespace: default,secondNamespace. AGIC osserva questi spazi dei nomi esclusivamente.
  2. Applicare le modifiche al modello Helm eseguendo helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure.

Dopo aver distribuito AGIC con la possibilità di osservare più spazi dei nomi, esegue le azioni seguenti:

  • Elenca le risorse di ingresso da tutti gli spazi dei nomi accessibili
  • Filtri per le risorse in ingresso annotate con kubernetes.io/ingress.class: azure/application-gateway
  • Compone una configurazione gateway applicazione combinata
  • Applica la configurazione alla distribuzione di gateway applicazione associata tramite Azure Resource Manager

Gestire configurazioni in conflitto

Le risorse di ingresso con più spazi dei nomi possono indicare a AGIC di creare configurazioni in conflitto per una singola distribuzione gateway applicazione. Ovvero, due ingresso potrebbero richiedere lo stesso dominio.

Nella parte superiore della gerarchia, AGIC potrebbe creare listener (indirizzo IP, porta e host) e regole di routing (listener di binding, pool back-end e impostazioni HTTP). Più spazi dei nomi e in ingresso possono condividerli.

D'altra parte, AGIC potrebbe creare percorsi, pool back-end, impostazioni HTTP e certificati TLS solo per uno spazio dei nomi e rimuovere duplicati.

Si considerino ad esempio le risorse di ingresso duplicate seguenti definite negli staging spazi dei nomi e production per 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

Nonostante le due risorse in ingresso che richiedono traffico per instradare www.contoso.com ai rispettivi spazi dei nomi Kubernetes, un solo back-end può gestire il traffico. AGIC crea una configurazione su base "first-in, first out" per una delle risorse. Se due risorse di ingresso vengono create contemporaneamente, quella precedente nell'alfabeto ha la precedenza. In base a questa proprietà, AGIC crea le impostazioni per l'ingresso production . Il gateway applicazione è configurato con le risorse seguenti:

  • Listener: fl-www.contoso.com-80
  • Regola di routing: rr-www.contoso.com-80
  • Pool back-end: pool-production-contoso-web-service-80-bp-80
  • Impostazioni HTTP: bp-production-contoso-web-service-80-80-websocket-ingress
  • Probe di integrità: pb-production-contoso-web-service-80-websocket-ingress

Nota

Ad eccezione del listener e della regola di routing, le risorse create gateway applicazione includono il nome dello spazio dei nomi (production) per cui sono stati creati da AGIC.

Se le due risorse di ingresso vengono introdotte nel cluster del servizio Azure Kubernetes in momenti diversi, è probabile che il gateway di accesso interno finirà in uno scenario in cui riconfigura gateway applicazione e reindirizza il traffico da namespace-B a namespace-A.

Ad esempio, se si aggiunge staging prima, AGIC configura gateway applicazione per instradare il traffico al pool back-end di staging. In un secondo momento, l'introduzione di production in ingresso causa la riprogrammazione del gateway applicazione da parte di AGIC, che avvia il routing del traffico al pool back-end production .

Limitare l'accesso agli spazi dei nomi

Per impostazione predefinita, AGIC configura gateway applicazione in base all'ingresso con annotazioni all'interno di qualsiasi spazio dei nomi. Per limitare questo comportamento, sono disponibili le opzioni seguenti:

  • Limitare gli spazi dei nomi definendo in modo esplicito gli spazi dei nomi che AGIC deve osservare tramite la watchNamespace chiave YAML in helm-config.yaml.
  • Usare gli oggetti Role e RoleBinding per limitare AGIC a spazi dei nomi specifici.

File di configurazione Helm di esempio

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