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.
Conseil
Consultez également Présentation de Passerelle d’application pour conteneurs.
Activer la prise en charge de plusieurs espaces de noms
Pour activer la prise en charge de plusieurs espaces de noms :
- 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
- supprimer entièrement la clé
- 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>