24.14. Configuration d'une adresse IP de sortie
En tant qu'administrateur de cluster, vous pouvez configurer le plugin réseau OVN-Kubernetes Container Network Interface (CNI) pour attribuer une ou plusieurs adresses IP de sortie à un espace de noms, ou à des pods spécifiques dans un espace de noms.
24.14.1. Conception architecturale et mise en œuvre de l'adresse IP de sortie
La fonctionnalité d'adresse IP de sortie d'OpenShift Container Platform vous permet de vous assurer que le trafic d'un ou plusieurs pods dans un ou plusieurs espaces de noms a une adresse IP source cohérente pour les services en dehors du réseau du cluster.
Par exemple, vous pouvez avoir un pod qui interroge périodiquement une base de données hébergée sur un serveur extérieur à votre cluster. Pour appliquer les conditions d'accès au serveur, un dispositif de filtrage des paquets est configuré pour n'autoriser le trafic qu'à partir d'adresses IP spécifiques. Pour garantir la fiabilité de l'accès au serveur à partir de ce module spécifique, vous pouvez configurer une adresse IP de sortie spécifique pour le module qui envoie les requêtes au serveur.
Une adresse IP de sortie attribuée à un espace de noms est différente d'un routeur de sortie, qui est utilisé pour envoyer le trafic vers des destinations spécifiques.
Dans certaines configurations de cluster, les pods d'application et les pods de routeur d'entrée fonctionnent sur le même nœud. Si vous configurez une adresse IP de sortie pour un projet d'application dans ce scénario, l'adresse IP n'est pas utilisée lorsque vous envoyez une requête à une route à partir du projet d'application.
Les adresses IP de sortie ne doivent pas être configurées dans les fichiers de configuration du réseau Linux, tels que ifcfg-eth0
.
24.14.1.1. Soutien à la plate-forme
La prise en charge de la fonctionnalité d'adresse IP de sortie sur diverses plates-formes est résumée dans le tableau suivant :
Plate-forme | Soutenu |
---|---|
Métal nu | Oui |
VMware vSphere | Oui |
Plate-forme Red Hat OpenStack (RHOSP) | Oui |
Amazon Web Services (AWS) | Oui |
Google Cloud Platform (GCP) | Oui |
Microsoft Azure | Oui |
L'attribution d'adresses IP de sortie aux nœuds du plan de contrôle avec la fonctionnalité EgressIP n'est pas prise en charge sur un cluster provisionné sur Amazon Web Services (AWS). (BZ#2039656)
24.14.1.2. Considérations relatives à la plateforme de cloud public
Pour les clusters provisionnés sur une infrastructure de cloud public, il existe une contrainte sur le nombre absolu d'adresses IP assignables par nœud. Le nombre maximal d'adresses IP assignables par nœud, ou le IP capacitypeut être décrit par la formule suivante :
IP capacity = public cloud default capacity - sum(current IP assignments)
Bien que la fonction Egress IPs gère la capacité d'adresses IP par nœud, il est important de tenir compte de cette contrainte dans vos déploiements. Par exemple, pour un cluster installé sur une infrastructure bare-metal avec 8 nœuds, vous pouvez configurer 150 adresses IP de sortie. Toutefois, si un fournisseur de cloud public limite la capacité d'adresses IP à 10 adresses IP par nœud, le nombre total d'adresses IP assignables n'est que de 80. Pour obtenir la même capacité d'adresses IP dans cet exemple de fournisseur de cloud, il faudrait allouer 7 nœuds supplémentaires.
Pour confirmer la capacité IP et les sous-réseaux de n'importe quel nœud de votre environnement de cloud public, vous pouvez entrer la commande oc get node <node_name> -o yaml
. L'annotation cloud.network.openshift.io/egress-ipconfig
comprend des informations sur la capacité et les sous-réseaux du nœud.
La valeur d'annotation est un tableau contenant un objet unique dont les champs fournissent les informations suivantes pour l'interface réseau primaire :
-
interface
: Spécifie l'ID de l'interface sur AWS et Azure et le nom de l'interface sur GCP. -
ifaddr
: Spécifie le masque de sous-réseau pour une ou les deux familles d'adresses IP. -
capacity
: Spécifie la capacité d'adresses IP pour le nœud. Sur AWS, la capacité d'adresses IP est fournie par famille d'adresses IP. Sur Azure et GCP, la capacité d'adresses IP comprend les adresses IPv4 et IPv6.
L'attachement et le détachement automatiques des adresses IP de sortie pour le trafic entre les nœuds sont disponibles. Cela permet au trafic de nombreux pods dans les espaces de noms d'avoir une adresse IP source cohérente vers des emplacements en dehors du cluster. Cela prend également en charge OpenShift SDN et OVN-Kubernetes, qui est le plugin de mise en réseau par défaut dans Red Hat OpenShift Networking dans OpenShift Container Platform 4.12.
La fonctionnalité RHOSP egress IP address crée un port de réservation Neutron appelé egressip-<IP address>
. En utilisant le même utilisateur RHOSP que celui utilisé pour l'installation du cluster OpenShift Container Platform, vous pouvez attribuer une adresse IP flottante à ce port de réservation afin de disposer d'une adresse SNAT prévisible pour le trafic de sortie. Lorsqu'une adresse IP de sortie sur un réseau RHOSP est déplacée d'un nœud à un autre, en raison d'un basculement de nœud, par exemple, le port de réservation Neutron est supprimé et recréé. Cela signifie que l'association IP flottante est perdue et que vous devez réassigner manuellement l'adresse IP flottante au nouveau port de réservation.
Lorsqu'un administrateur de cluster RHOSP assigne une IP flottante au port de réservation, OpenShift Container Platform ne peut pas supprimer le port de réservation. L'objet CloudPrivateIPConfig
ne peut pas effectuer d'opérations de suppression et de déplacement jusqu'à ce qu'un administrateur de cluster RHOSP désassigne l'IP flottante du port de réservation.
Les exemples suivants illustrent l'annotation des nœuds de plusieurs fournisseurs de nuages publics. Les annotations sont en retrait pour faciliter la lecture.
Exemple d'annotation cloud.network.openshift.io/egress-ipconfig
sur AWS
cloud.network.openshift.io/egress-ipconfig: [ { "interface":"eni-078d267045138e436", "ifaddr":{"ipv4":"10.0.128.0/18"}, "capacity":{"ipv4":14,"ipv6":15} } ]
Exemple cloud.network.openshift.io/egress-ipconfig
annotation sur GCP
cloud.network.openshift.io/egress-ipconfig: [ { "interface":"nic0", "ifaddr":{"ipv4":"10.0.128.0/18"}, "capacity":{"ip":14} } ]
Les sections suivantes décrivent la capacité d'adresses IP pour les environnements de cloud public pris en charge, à utiliser dans votre calcul de capacité.
24.14.1.2.1. Limites de capacité des adresses IP d'Amazon Web Services (AWS)
Sur AWS, les contraintes d'attribution des adresses IP dépendent du type d'instance configuré. Pour plus d'informations, voir Adresses IP par interface réseau par type d'instance
24.14.1.2.2. Limites de capacité des adresses IP de Google Cloud Platform (GCP)
Sur le GCP, le modèle de réseau met en œuvre des adresses IP de nœuds supplémentaires par le biais de l'alias d'adresses IP, plutôt que par l'attribution d'adresses IP. Toutefois, la capacité d'adresses IP est directement liée à la capacité d'alias d'adresses IP.
Les limites de capacité suivantes s'appliquent à l'attribution de l'alias IP :
- Le nombre maximum d'alias IP, tant IPv4 qu'IPv6, est de 10 par nœud.
- Par VPC, le nombre maximum d'alias IP n'est pas spécifié, mais les tests d'évolutivité d'OpenShift Container Platform révèlent que le maximum est d'environ 15 000.
Pour plus d'informations, voir Quotas par instance et Aperçu des plages d'adresses IP alias.
24.14.1.2.3. Limites de capacité des adresses IP de Microsoft Azure
Sur Azure, les limites de capacité suivantes existent pour l'attribution d'adresses IP :
- Par NIC, le nombre maximum d'adresses IP assignables, tant pour IPv4 que pour IPv6, est de 256.
- Par réseau virtuel, le nombre maximum d'adresses IP attribuées ne peut dépasser 65 536.
Pour plus d'informations, voir Limites de mise en réseau.
24.14.1.3. Attribution d'IP de sortie aux pods
Pour attribuer une ou plusieurs IP de sortie à un espace de noms ou à des modules spécifiques d'un espace de noms, les conditions suivantes doivent être remplies :
-
Au moins un nœud de votre cluster doit avoir le label
k8s.ovn.org/egress-assignable: ""
. -
Il existe un objet
EgressIP
qui définit une ou plusieurs adresses IP de sortie à utiliser comme adresse IP source pour le trafic quittant le cluster à partir des pods d'un espace de noms.
Si vous créez des objets EgressIP
avant d'étiqueter les nœuds de votre cluster pour l'attribution d'IP de sortie, OpenShift Container Platform risque d'attribuer chaque adresse IP de sortie au premier nœud avec l'étiquette k8s.ovn.org/egress-assignable: ""
.
Pour garantir que les adresses IP de sortie sont largement réparties entre les nœuds du cluster, appliquez toujours l'étiquette aux nœuds destinés à héberger les adresses IP de sortie avant de créer des objets EgressIP
.
24.14.1.4. Attribution des adresses IP de sortie aux nœuds
Lors de la création d'un objet EgressIP
, les conditions suivantes s'appliquent aux nœuds portant l'étiquette k8s.ovn.org/egress-assignable: ""
:
- Une adresse IP de sortie n'est jamais attribuée à plus d'un nœud à la fois.
- Une adresse IP de sortie est répartie équitablement entre les nœuds disponibles qui peuvent héberger l'adresse IP de sortie.
Si le tableau
spec.EgressIPs
d'un objetEgressIP
spécifie plus d'une adresse IP, les conditions suivantes s'appliquent :- Aucun nœud n'hébergera jamais plus d'une des adresses IP spécifiées.
- Le trafic est réparti de manière à peu près égale entre les adresses IP spécifiées pour un espace de noms donné.
- Si un nœud devient indisponible, les adresses IP de sortie qui lui sont attribuées sont automatiquement réattribuées, sous réserve des conditions décrites précédemment.
Lorsqu'un pod correspond au sélecteur de plusieurs objets EgressIP
, il n'est pas garanti que l'adresse IP de sortie spécifiée dans les objets EgressIP
soit attribuée en tant qu'adresse IP de sortie pour le pod.
En outre, si un objet EgressIP
spécifie plusieurs adresses IP de sortie, il n'y a aucune garantie quant à l'adresse IP de sortie qui sera utilisée. Par exemple, si un pod correspond à un sélecteur pour un objet EgressIP
avec deux adresses IP de sortie, 10.10.20.1
et 10.10.20.2
, l'une ou l'autre peut être utilisée pour chaque connexion TCP ou conversation UDP.
24.14.1.5. Schéma architectural d'une configuration d'adresses IP de sortie
Le diagramme suivant illustre une configuration d'adresses IP de sortie. Il décrit quatre pods dans deux espaces de noms différents fonctionnant sur trois nœuds d'un cluster. Les nœuds se voient attribuer des adresses IP à partir du bloc CIDR 192.168.126.0/18
sur le réseau hôte.
Le nœud 1 et le nœud 3 sont tous deux étiquetés avec k8s.ovn.org/egress-assignable: ""
et sont donc disponibles pour l'attribution d'adresses IP de sortie.
Les lignes en pointillé du diagramme représentent le flux de trafic provenant de pod1, pod2 et pod3 et transitant par le réseau de pods pour sortir de la grappe à partir du nœud 1 et du nœud 3. Lorsqu'un service externe reçoit du trafic de l'un des pods sélectionnés par l'objet EgressIP
, l'adresse IP source est soit 192.168.126.10
, soit 192.168.126.102
. Le trafic est réparti de manière à peu près égale entre ces deux nœuds.
Les ressources suivantes du diagramme sont illustrées en détail :
Namespace
objetsLes espaces de noms sont définis dans le manifeste suivant :
Objets de l'espace de noms
apiVersion: v1 kind: Namespace metadata: name: namespace1 labels: env: prod --- apiVersion: v1 kind: Namespace metadata: name: namespace2 labels: env: prod
EgressIP
objetL'objet
EgressIP
suivant décrit une configuration qui sélectionne tous les modules dans n'importe quel espace de noms avec l'étiquetteenv
définie surprod
. Les adresses IP de sortie pour les modules sélectionnés sont192.168.126.10
et192.168.126.102
.EgressIP
objetapiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: egressips-prod spec: egressIPs: - 192.168.126.10 - 192.168.126.102 namespaceSelector: matchLabels: env: prod status: items: - node: node1 egressIP: 192.168.126.10 - node: node3 egressIP: 192.168.126.102
Pour la configuration de l'exemple précédent, OpenShift Container Platform attribue les deux adresses IP egress aux nœuds disponibles. Le champ
status
indique si et où les adresses IP de sortie sont attribuées.
24.14.2. Objet EgressIP
Le fichier YAML suivant décrit l'API de l'objet EgressIP
. La portée de l'objet est à l'échelle du cluster ; il n'est pas créé dans un espace de noms.
apiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: <name> 1 spec: egressIPs: 2 - <ip_address> namespaceSelector: 3 ... podSelector: 4 ...
- 1
- Nom de l'objet
EgressIPs
. - 2
- Un tableau d'une ou plusieurs adresses IP.
- 3
- Un ou plusieurs sélecteurs pour les espaces de noms auxquels associer les adresses IP de sortie.
- 4
- Facultatif : Un ou plusieurs sélecteurs de modules dans les espaces de noms spécifiés auxquels associer les adresses IP de sortie. L'application de ces sélecteurs permet de sélectionner un sous-ensemble de modules dans un espace de noms.
Le fichier YAML suivant décrit la strophe du sélecteur d'espace de noms :
Strophe de sélecteur d'espace de noms
namespaceSelector: 1
matchLabels:
<label_name>: <label_value>
- 1
- Une ou plusieurs règles de correspondance pour les espaces de noms. Si plusieurs règles de correspondance sont fournies, tous les espaces de noms correspondants sont sélectionnés.
Le YAML suivant décrit la strophe optionnelle pour le sélecteur de pods :
Stance de sélection de pods
podSelector: 1
matchLabels:
<label_name>: <label_value>
- 1
- Facultatif : Une ou plusieurs règles de correspondance pour les pods dans les espaces de noms qui correspondent aux règles
namespaceSelector
spécifiées. Si cette option est spécifiée, seuls les pods qui correspondent aux règles sont sélectionnés. Les autres pods de l'espace de noms ne sont pas sélectionnés.
Dans l'exemple suivant, l'objet EgressIP
associe les adresses IP de sortie 192.168.126.11
et 192.168.126.102
aux pods dont l'étiquette app
est définie sur web
et qui se trouvent dans les espaces de noms dont l'étiquette env
est définie sur prod
:
Exemple d'objet EgressIP
apiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: egress-group1 spec: egressIPs: - 192.168.126.11 - 192.168.126.102 podSelector: matchLabels: app: web namespaceSelector: matchLabels: env: prod
Dans l'exemple suivant, l'objet EgressIP
associe les adresses IP de sortie 192.168.127.30
et 192.168.127.40
à tous les pods dont l'étiquette environment
n'est pas réglée sur development
:
Exemple d'objet EgressIP
apiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: egress-group2 spec: egressIPs: - 192.168.127.30 - 192.168.127.40 namespaceSelector: matchExpressions: - key: environment operator: NotIn values: - development
24.14.3. Étiquetage d'un nœud pour l'hébergement des adresses IP de sortie
Vous pouvez appliquer le label k8s.ovn.org/egress-assignable=""
à un nœud de votre cluster afin qu'OpenShift Container Platform puisse attribuer une ou plusieurs adresses IP de sortie au nœud.
Conditions préalables
-
Installez le CLI OpenShift (
oc
). - Connectez-vous au cluster en tant qu'administrateur du cluster.
Procédure
Pour étiqueter un nœud afin qu'il puisse héberger une ou plusieurs adresses IP de sortie, entrez la commande suivante :
$ oc label nodes <node_name> k8s.ovn.org/egress-assignable="" 1
- 1
- Le nom du nœud à étiqueter.
AstuceVous pouvez également appliquer le langage YAML suivant pour ajouter l'étiquette à un nœud :
apiVersion: v1 kind: Node metadata: labels: k8s.ovn.org/egress-assignable: "" name: <node_name>