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
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.
- Eliminare completamente la
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>