Chapitre 20. Politique des réseaux
20.1. A propos de la politique de réseau
En tant qu'administrateur de cluster, vous pouvez définir des politiques de réseau qui restreignent le trafic vers les pods de votre cluster.
Les politiques de réseau configurées sont ignorées dans les réseaux IPv6.
20.1.1. A propos de la politique de réseau
Dans un cluster utilisant un plugin réseau qui prend en charge la politique réseau de Kubernetes, l'isolation du réseau est entièrement contrôlée par les objets NetworkPolicy
. Dans OpenShift Container Platform 4.12, OpenShift SDN prend en charge l'utilisation de la politique réseau dans son mode d'isolation réseau par défaut.
La politique de réseau ne s'applique pas à l'espace de noms du réseau hôte. Les pods dont le réseau d'hôtes est activé ne sont pas affectés par les règles de la politique de réseau.
Par défaut, tous les modules d'un projet sont accessibles aux autres modules et aux points d'extrémité du réseau. Pour isoler un ou plusieurs pods dans un projet, vous pouvez créer des objets NetworkPolicy
dans ce projet pour indiquer les connexions entrantes autorisées. Les administrateurs de projet peuvent créer et supprimer des objets NetworkPolicy
dans leur propre projet.
Si un pod est associé à des sélecteurs dans un ou plusieurs objets NetworkPolicy
, il n'acceptera que les connexions autorisées par au moins un de ces objets NetworkPolicy
. Un module qui n'est sélectionné par aucun objet NetworkPolicy
est entièrement accessible.
Les exemples suivants d'objets NetworkPolicy
illustrent la prise en charge de différents scénarios :
Refuser tout le trafic :
Pour qu'un projet soit refusé par défaut, ajoutez un objet
NetworkPolicy
qui correspond à tous les pods mais n'accepte aucun trafic :kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: {} ingress: []
N'autoriser que les connexions provenant du contrôleur d'entrée de la plate-forme OpenShift Container :
Pour qu'un projet n'autorise que les connexions provenant du contrôleur d'ingestion de la plate-forme OpenShift Container, ajoutez l'objet
NetworkPolicy
suivant.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-ingress spec: ingress: - from: - namespaceSelector: matchLabels: network.openshift.io/policy-group: ingress podSelector: {} policyTypes: - Ingress
N'accepte que les connexions provenant de pods au sein d'un projet :
Pour que les pods acceptent les connexions d'autres pods du même projet, mais rejettent toutes les autres connexions de pods d'autres projets, ajoutez l'objet suivant
NetworkPolicy
:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: {} ingress: - from: - podSelector: {}
N'autoriser le trafic HTTP et HTTPS qu'en fonction des étiquettes de pods :
Pour permettre uniquement l'accès HTTP et HTTPS aux pods avec un label spécifique (
role=frontend
dans l'exemple suivant), ajoutez un objetNetworkPolicy
similaire à ce qui suit :kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-http-and-https spec: podSelector: matchLabels: role: frontend ingress: - ports: - protocol: TCP port: 80 - protocol: TCP port: 443
Accepter les connexions en utilisant des sélecteurs d'espace de noms et de pods :
Pour faire correspondre le trafic réseau en combinant les sélecteurs d'espace de noms et de pods, vous pouvez utiliser un objet
NetworkPolicy
similaire à ce qui suit :kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-pod-and-namespace-both spec: podSelector: matchLabels: name: test-pods ingress: - from: - namespaceSelector: matchLabels: project: project_name podSelector: matchLabels: name: test-pods
NetworkPolicy
sont additifs, ce qui signifie que vous pouvez combiner plusieurs objets NetworkPolicy
pour répondre à des exigences complexes en matière de réseau.
Par exemple, pour les objets NetworkPolicy
définis dans les exemples précédents, vous pouvez définir les politiques allow-same-namespace
et allow-http-and-https
dans le même projet. Cela permet aux pods portant l'étiquette role=frontend
d'accepter toutes les connexions autorisées par chaque politique. C'est-à-dire des connexions sur n'importe quel port à partir de pods dans le même espace de noms, et des connexions sur les ports 80
et 443
à partir de pods dans n'importe quel espace de noms.
20.1.1.1. Utilisation de la stratégie réseau allow-from-router
Utilisez l'adresse NetworkPolicy
pour autoriser le trafic externe quelle que soit la configuration du routeur :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-router
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group.network.openshift.io/ingress:""1
podSelector: {}
policyTypes:
- Ingress
- 1
policy-group.network.openshift.io/ingress:""
prend en charge à la fois Openshift-SDN et OVN-Kubernetes.
20.1.1.2. Utilisation de la stratégie réseau allow-from-hostnetwork
Ajoutez l'objet suivant allow-from-hostnetwork
NetworkPolicy
pour diriger le trafic des pods du réseau hôte :
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-hostnetwork spec: ingress: - from: - namespaceSelector: matchLabels: policy-group.network.openshift.io/host-network:"" podSelector: {} policyTypes: - Ingress
20.1.2. Optimisations de la politique réseau avec OpenShift SDN
Utilisez une stratégie de réseau pour isoler les pods qui sont différenciés les uns des autres par des étiquettes au sein d'un espace de noms.
Il est inefficace d'appliquer les objets NetworkPolicy
à un grand nombre de pods individuels dans un seul espace de noms. Les étiquettes de pods n'existent pas au niveau de l'adresse IP, de sorte qu'une stratégie de réseau génère une règle de flux Open vSwitch (OVS) distincte pour chaque lien possible entre chaque pod sélectionné à l'aide d'une adresse podSelector
.
Par exemple, si la spécification podSelector
et l'entrée podSelector
dans un objet NetworkPolicy
correspondent chacune à 200 pods, 40 000 (200*200) règles de flux OVS sont générées. Cela peut ralentir un nœud.
Lors de l'élaboration de votre politique de réseau, reportez-vous aux lignes directrices suivantes :
Réduisez le nombre de règles de flux OVS en utilisant des espaces de noms pour contenir des groupes de pods qui doivent être isolés.
NetworkPolicy
les objets qui sélectionnent un espace de noms entier, en utilisant le sitenamespaceSelector
ou un site videpodSelector
, ne génèrent qu'une seule règle de flux OVS correspondant à l'ID de réseau virtuel VXLAN (VNID) de l'espace de noms.- Conservez les modules qui n'ont pas besoin d'être isolés dans leur espace de noms d'origine et déplacez les modules qui ont besoin d'être isolés dans un ou plusieurs espaces de noms différents.
- Créez des stratégies réseau supplémentaires ciblées pour l'espace de nommage afin d'autoriser le trafic spécifique que vous souhaitez autoriser à partir des modules isolés.
20.1.3. Optimisations de la politique réseau avec OpenShift OVN
Lors de l'élaboration de votre politique de réseau, reportez-vous aux lignes directrices suivantes :
-
Pour les politiques de réseau ayant la même spécification
spec.podSelector
, il est plus efficace d'utiliser une politique de réseau avec plusieurs règlesingress
ouegress
que plusieurs politiques de réseau avec des sous-ensembles de règlesingress
ouegress
. Chaque règle
ingress
ouegress
basée sur les spécificationspodSelector
ounamespaceSelector
génère un nombre de flux OVS proportionnel ànumber of pods selected by network policy number of pods selected by ingress or egress rule
. Il est donc préférable d'utiliser les spécificationspodSelector
ounamespaceSelector
qui permettent de sélectionner autant de pods que nécessaire dans une règle, plutôt que de créer des règles individuelles pour chaque pod.Par exemple, la politique suivante contient deux règles :
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchLabels: role: frontend - from: - podSelector: matchLabels: role: backend
La politique suivante exprime ces deux règles en une seule :
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchExpressions: - {key: role, operator: In, values: [frontend, backend]}
La même règle s'applique à la spécification
spec.podSelector
. Si vous avez les mêmes règlesingress
ouegress
pour différentes politiques de réseau, il peut être plus efficace de créer une politique de réseau avec une spécificationspec.podSelector
commune. Par exemple, les deux politiques suivantes ont des règles différentes :metadata: name: policy1 spec: podSelector: matchLabels: role: db ingress: - from: - podSelector: matchLabels: role: frontend metadata: name: policy2 spec: podSelector: matchLabels: role: client ingress: - from: - podSelector: matchLabels: role: frontend
La politique de réseau suivante exprime ces deux règles en une seule :
metadata: name: policy3 spec: podSelector: matchExpressions: - {key: role, operator: In, values: [db, client]} ingress: - from: - podSelector: matchLabels: role: frontend
Vous pouvez appliquer cette optimisation lorsque seuls plusieurs sélecteurs sont exprimés comme un seul. Dans les cas où les sélecteurs sont basés sur des étiquettes différentes, il peut être impossible d'appliquer cette optimisation. Dans ce cas, envisagez d'appliquer de nouvelles étiquettes pour l'optimisation de la politique de réseau en particulier.