22.4. Configuration de la politique multi-réseaux
En tant qu'administrateur de cluster, vous pouvez configurer le multi-réseau pour les réseaux supplémentaires. Vous pouvez spécifier une politique multi-réseaux pour les réseaux supplémentaires SR-IOV et macvlan. Les réseaux supplémentaires macvlan sont entièrement pris en charge. Les autres types de réseaux supplémentaires, tels que ipvlan, ne sont pas pris en charge.
La prise en charge de la configuration de politiques multi-réseaux pour les réseaux supplémentaires SR-IOV est une fonctionnalité de l'aperçu technologique et n'est prise en charge qu'avec les cartes d'interface réseau (NIC) du noyau. SR-IOV n'est pas pris en charge pour les applications du kit de développement du plan de données (DPDK).
Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.
Les politiques de réseau configurées sont ignorées dans les réseaux IPv6.
22.4.1. Différences entre la politique multi-réseaux et la politique des réseaux
Bien que l'API MultiNetworkPolicy
mette en œuvre l'API NetworkPolicy
, il existe plusieurs différences importantes :
Vous devez utiliser l'API
MultiNetworkPolicy
:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy
-
Vous devez utiliser le nom de la ressource
multi-networkpolicy
lorsque vous utilisez le CLI pour interagir avec les politiques multi-réseaux. Par exemple, vous pouvez afficher un objet de politique multi-réseaux avec la commandeoc get multi-networkpolicy <name>
où<name>
est le nom d'une politique multi-réseaux. Vous devez spécifier une annotation avec le nom de la définition de l'attachement au réseau qui définit le réseau supplémentaire macvlan ou SR-IOV :
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for: <network_name>
où :
<network_name>
- Spécifie le nom d'une définition de pièce jointe au réseau.
22.4.2. Activation de la politique multi-réseaux pour le cluster
En tant qu'administrateur de cluster, vous pouvez activer la prise en charge des politiques multi-réseaux sur votre cluster.
Conditions préalables
-
Installez le CLI OpenShift (
oc
). -
Connectez-vous au cluster avec un utilisateur disposant des privilèges
cluster-admin
.
Procédure
Créez le fichier
multinetwork-enable-patch.yaml
avec le YAML suivant :apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: useMultiNetworkPolicy: true
Configurer le cluster pour activer la politique multi-réseaux :
$ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
Exemple de sortie
network.operator.openshift.io/cluster patched
22.4.3. Travailler avec une politique multi-réseaux
En tant qu'administrateur de cluster, vous pouvez créer, modifier, afficher et supprimer des politiques multi-réseaux.
22.4.3.1. Conditions préalables
- Vous avez activé la prise en charge des stratégies multi-réseaux pour votre cluster.
22.4.3.2. Création d'une politique multi-réseaux à l'aide de l'interface CLI
Pour définir des règles granulaires décrivant le trafic réseau entrant ou sortant autorisé pour les espaces de noms de votre cluster, vous pouvez créer une stratégie multi-réseaux.
Conditions préalables
-
Votre cluster utilise un plugin réseau qui prend en charge les objets
NetworkPolicy
, tel que le fournisseur de réseau OpenShift SDN avecmode: NetworkPolicy
. Ce mode est le mode par défaut pour OpenShift SDN. -
Vous avez installé l'OpenShift CLI (
oc
). -
Vous êtes connecté au cluster avec un utilisateur disposant des privilèges
cluster-admin
. - Vous travaillez dans l'espace de noms auquel s'applique la politique multi-réseaux.
Procédure
Créer une règle de politique :
Créer un fichier
<policy_name>.yaml
:$ touch <policy_name>.yaml
où :
<policy_name>
- Spécifie le nom du fichier de stratégie multi-réseaux.
Définissez une politique multi-réseaux dans le fichier que vous venez de créer, comme dans les exemples suivants :
Refuser l'entrée de tous les pods dans tous les espaces de noms
Il s'agit d'une politique fondamentale, qui bloque tout réseau inter-pods autre que le trafic inter-pods autorisé par la configuration d'autres politiques de réseau.
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: ingress: []
où :
<network_name>
- Spécifie le nom d'une définition de pièce jointe au réseau.
Autoriser l'entrée de tous les pods dans le même espace de noms
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-same-namespace annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: ingress: - from: - podSelector: {}
où :
<network_name>
- Spécifie le nom d'une définition de pièce jointe au réseau.
Autoriser le trafic entrant vers un pod à partir d'un espace de noms particulier
Cette politique autorise le trafic vers les pods étiquetés
pod-a
à partir des pods fonctionnant surnamespace-y
.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-traffic-pod annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: pod: pod-a policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace-y
où :
<network_name>
- Spécifie le nom d'une définition de pièce jointe au réseau.
Restreindre le trafic vers un service
Cette politique, lorsqu'elle est appliquée, garantit que tous les pods portant les étiquettes
app=bookstore
etrole=api
ne sont accessibles qu'aux pods portant l'étiquetteapp=bookstore
. Dans cet exemple, l'application pourrait être un serveur d'API REST, marqué par les étiquettesapp=bookstore
etrole=api
.Cet exemple traite des cas d'utilisation suivants :
- Restreindre le trafic d'un service aux seuls autres microservices qui doivent l'utiliser.
Restreindre les connexions à une base de données pour n'autoriser que l'application qui l'utilise.
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: api-allow annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore
où :
<network_name>
- Spécifie le nom d'une définition de pièce jointe au réseau.
Pour créer l'objet de politique multiréseau, entrez la commande suivante :
oc apply -f <policy_name>.yaml -n <namespace>
où :
<policy_name>
- Spécifie le nom du fichier de stratégie multi-réseaux.
<namespace>
- Facultatif : Spécifie l'espace de noms si l'objet est défini dans un espace de noms différent de l'espace de noms actuel.
Exemple de sortie
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
Si vous vous connectez à la console web avec les privilèges cluster-admin
, vous avez le choix de créer une politique de réseau dans n'importe quel espace de noms du cluster directement dans YAML ou à partir d'un formulaire dans la console web.
22.4.3.3. Modification d'une politique multi-réseaux
Vous pouvez modifier une politique multi-réseaux dans un espace de noms.
Conditions préalables
-
Votre cluster utilise un plugin réseau qui prend en charge les objets
NetworkPolicy
, tel que le fournisseur de réseau OpenShift SDN avecmode: NetworkPolicy
. Ce mode est le mode par défaut pour OpenShift SDN. -
Vous avez installé l'OpenShift CLI (
oc
). -
Vous êtes connecté au cluster avec un utilisateur disposant des privilèges
cluster-admin
. - Vous travaillez dans l'espace de noms où la politique multi-réseaux existe.
Procédure
Facultatif : Pour répertorier les objets de stratégie multi-réseaux d'un espace de noms, entrez la commande suivante :
$ oc get multi-networkpolicy
où :
<namespace>
- Facultatif : Spécifie l'espace de noms si l'objet est défini dans un espace de noms différent de l'espace de noms actuel.
Modifier l'objet de politique multi-réseaux.
Si vous avez enregistré la définition de la stratégie multi-réseaux dans un fichier, éditez le fichier et apportez les modifications nécessaires, puis entrez la commande suivante.
$ oc apply -n <namespace> -f <policy_file>.yaml
où :
<namespace>
- Facultatif : Spécifie l'espace de noms si l'objet est défini dans un espace de noms différent de l'espace de noms actuel.
<policy_file>
- Spécifie le nom du fichier contenant la politique de réseau.
Si vous devez mettre à jour l'objet de stratégie multi-réseau directement, entrez la commande suivante :
oc edit multi-networkpolicy <nom_de_la_politique> -n <espace_de_noms>
où :
<policy_name>
- Spécifie le nom de la politique de réseau.
<namespace>
- Facultatif : Spécifie l'espace de noms si l'objet est défini dans un espace de noms différent de l'espace de noms actuel.
Confirmez la mise à jour de l'objet de stratégie multi-réseaux.
oc describe multi-networkpolicy <nom_de_la_politique> -n <espace_de_noms>
où :
<policy_name>
- Spécifie le nom de la politique multi-réseaux.
<namespace>
- Facultatif : Spécifie l'espace de noms si l'objet est défini dans un espace de noms différent de l'espace de noms actuel.
Si vous vous connectez à la console web avec les privilèges cluster-admin
, vous avez le choix entre éditer une politique de réseau dans n'importe quel espace de noms du cluster directement dans YAML ou à partir de la politique dans la console web via le menu Actions.
22.4.3.4. Visualisation des politiques multi-réseaux à l'aide de la CLI
Vous pouvez examiner les politiques multi-réseaux dans un espace de noms.
Conditions préalables
-
Vous avez installé l'OpenShift CLI (
oc
). -
Vous êtes connecté au cluster avec un utilisateur disposant des privilèges
cluster-admin
. - Vous travaillez dans l'espace de noms où la politique multi-réseaux existe.
Procédure
Liste des politiques multi-réseaux dans un espace de noms :
Pour afficher les objets de stratégie multi-réseaux définis dans un espace de noms, entrez la commande suivante :
$ oc get multi-networkpolicy
En outre, il est possible d'examiner une politique multi-réseaux spécifique : Pour examiner une politique multi-réseaux spécifique, entrez la commande suivante :
oc describe multi-networkpolicy <nom_de_la_politique> -n <espace_de_noms>
où :
<policy_name>
- Spécifie le nom de la politique multi-réseaux à inspecter.
<namespace>
- Facultatif : Spécifie l'espace de noms si l'objet est défini dans un espace de noms différent de l'espace de noms actuel.
Si vous vous connectez à la console web avec les privilèges cluster-admin
, vous avez le choix d'afficher une politique de réseau dans n'importe quel espace de noms du cluster directement dans YAML ou à partir d'un formulaire dans la console web.
22.4.3.5. Suppression d'une politique multi-réseaux à l'aide de la CLI
Vous pouvez supprimer une politique multi-réseaux dans un espace de noms.
Conditions préalables
-
Votre cluster utilise un plugin réseau qui prend en charge les objets
NetworkPolicy
, tel que le fournisseur de réseau OpenShift SDN avecmode: NetworkPolicy
. Ce mode est le mode par défaut pour OpenShift SDN. -
Vous avez installé l'OpenShift CLI (
oc
). -
Vous êtes connecté au cluster avec un utilisateur disposant des privilèges
cluster-admin
. - Vous travaillez dans l'espace de noms où la politique multi-réseaux existe.
Procédure
Pour supprimer un objet de stratégie multi-réseaux, entrez la commande suivante :
oc delete multi-networkpolicy <nom_de_la_politique> -n <espace_de_noms>
où :
<policy_name>
- Spécifie le nom de la politique multi-réseaux.
<namespace>
- Facultatif : Spécifie l'espace de noms si l'objet est défini dans un espace de noms différent de l'espace de noms actuel.
Exemple de sortie
multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted
Si vous vous connectez à la console web avec les privilèges cluster-admin
, vous avez le choix entre supprimer une politique de réseau dans n'importe quel espace de noms du cluster directement dans YAML ou à partir de la politique dans la console web via le menu Actions.
22.4.3.6. Création d'une politique de refus de tout par défaut pour les réseaux multiples
Il s'agit d'une politique fondamentale, qui bloque tout réseau inter-pods autre que le trafic réseau autorisé par la configuration d'autres politiques de réseau déployées. Cette procédure applique une politique par défaut : deny-by-default
.
Si vous vous connectez avec un utilisateur ayant le rôle cluster-admin
, vous pouvez créer une stratégie de réseau dans n'importe quel espace de noms du cluster.
Conditions préalables
-
Votre cluster utilise un plugin réseau qui prend en charge les objets
NetworkPolicy
, tel que le fournisseur de réseau OpenShift SDN avecmode: NetworkPolicy
. Ce mode est le mode par défaut pour OpenShift SDN. -
Vous avez installé l'OpenShift CLI (
oc
). -
Vous êtes connecté au cluster avec un utilisateur disposant des privilèges
cluster-admin
. - Vous travaillez dans l'espace de noms auquel s'applique la politique multi-réseaux.
Procédure
Créez le fichier YAML suivant qui définit une politique
deny-by-default
pour refuser l'entrée de tous les pods dans tous les espaces de noms. Enregistrez le YAML dans le fichierdeny-by-default.yaml
:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default namespace: default 1 annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> 2 spec: podSelector: {} 3 ingress: [] 4
- 1
namespace: default
déploie cette politique dans l'espace de nomsdefault
.- 2
podSelector:
est vide, cela signifie qu'elle correspond à tous les pods. Par conséquent, la politique s'applique à tous les modules de l'espace de noms par défaut.- 3
network_name
: spécifie le nom d'une définition de pièce jointe au réseau.- 4
- Aucune règle
ingress
n'est spécifiée. Le trafic entrant est donc supprimé pour tous les pods.
Appliquez la politique en entrant la commande suivante :
$ oc apply -f deny-by-default.yaml
Exemple de sortie
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
22.4.3.7. Création d'une stratégie multi-réseaux pour autoriser le trafic provenant de clients externes
La politique deny-by-default
étant en place, vous pouvez configurer une politique qui autorise le trafic des clients externes vers un pod portant l'étiquette app=web
.
Si vous vous connectez avec un utilisateur ayant le rôle cluster-admin
, vous pouvez créer une stratégie de réseau dans n'importe quel espace de noms du cluster.
Suivez cette procédure pour configurer une politique qui autorise un service externe à partir de l'Internet public directement ou en utilisant un équilibreur de charge pour accéder au module. Le trafic n'est autorisé que vers un pod portant l'étiquette app=web
.
Conditions préalables
-
Votre cluster utilise un plugin réseau qui prend en charge les objets
NetworkPolicy
, tel que le fournisseur de réseau OpenShift SDN avecmode: NetworkPolicy
. Ce mode est le mode par défaut pour OpenShift SDN. -
Vous avez installé l'OpenShift CLI (
oc
). -
Vous êtes connecté au cluster avec un utilisateur disposant des privilèges
cluster-admin
. - Vous travaillez dans l'espace de noms auquel s'applique la politique multi-réseaux.
Procédure
Créez une politique qui autorise le trafic provenant de l'Internet public directement ou en utilisant un équilibreur de charge pour accéder au pod. Enregistrez le YAML dans le fichier
web-allow-external.yaml
:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-external namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}
Appliquez la politique en entrant la commande suivante :
$ oc apply -f web-allow-external.yaml
Exemple de sortie
multinetworkpolicy.k8s.cni.cncf.io/web-allow-external created
Cette politique autorise le trafic en provenance de toutes les ressources, y compris le trafic externe, comme l'illustre le diagramme suivant :
22.4.3.8. Création d'une politique multi-réseaux autorisant le trafic vers une application à partir de tous les espaces de noms
Si vous vous connectez avec un utilisateur ayant le rôle cluster-admin
, vous pouvez créer une stratégie de réseau dans n'importe quel espace de noms du cluster.
Suivez cette procédure pour configurer une stratégie qui autorise le trafic de tous les pods de tous les espaces de noms vers une application particulière.
Conditions préalables
-
Votre cluster utilise un plugin réseau qui prend en charge les objets
NetworkPolicy
, tel que le fournisseur de réseau OpenShift SDN avecmode: NetworkPolicy
. Ce mode est le mode par défaut pour OpenShift SDN. -
Vous avez installé l'OpenShift CLI (
oc
). -
Vous êtes connecté au cluster avec un utilisateur disposant des privilèges
cluster-admin
. - Vous travaillez dans l'espace de noms auquel s'applique la politique multi-réseaux.
Procédure
Créez une politique qui autorise le trafic de tous les pods dans tous les espaces de noms vers une application particulière. Enregistrez le YAML dans le fichier
web-allow-all-namespaces.yaml
:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-all-namespaces namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: {} 2
NotePar défaut, si vous ne précisez pas
namespaceSelector
, aucun espace de noms n'est sélectionné, ce qui signifie que la stratégie n'autorise que le trafic provenant de l'espace de noms dans lequel la stratégie de réseau est déployée.Appliquez la politique en entrant la commande suivante :
$ oc apply -f web-allow-all-namespaces.yaml
Exemple de sortie
multinetworkpolicy.k8s.cni.cncf.io/web-allow-all-namespaces created
Vérification
Démarrez un service web dans l'espace de noms
default
en entrant la commande suivante :$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
Exécutez la commande suivante pour déployer une image
alpine
dans l'espace de nomssecondary
et pour démarrer un shell :$ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
Exécutez la commande suivante dans l'interpréteur de commandes et observez que la demande est autorisée :
# wget -qO- --timeout=2 http://web.default
Résultats attendus
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
22.4.3.9. Création d'une politique multi-réseaux autorisant le trafic vers une application à partir d'un espace de noms
Si vous vous connectez avec un utilisateur ayant le rôle cluster-admin
, vous pouvez créer une stratégie de réseau dans n'importe quel espace de noms du cluster.
Suivez cette procédure pour configurer une politique qui autorise le trafic vers un pod avec l'étiquette app=web
à partir d'un espace de noms particulier. Vous pourriez vouloir faire ceci pour :
- Restreindre le trafic vers une base de données de production aux seuls espaces de noms dans lesquels des charges de travail de production sont déployées.
- Permet aux outils de surveillance déployés dans un espace de noms particulier de récupérer les mesures de l'espace de noms actuel.
Conditions préalables
-
Votre cluster utilise un plugin réseau qui prend en charge les objets
NetworkPolicy
, tel que le fournisseur de réseau OpenShift SDN avecmode: NetworkPolicy
. Ce mode est le mode par défaut pour OpenShift SDN. -
Vous avez installé l'OpenShift CLI (
oc
). -
Vous êtes connecté au cluster avec un utilisateur disposant des privilèges
cluster-admin
. - Vous travaillez dans l'espace de noms auquel s'applique la politique multi-réseaux.
Procédure
Créez une politique qui autorise le trafic de tous les pods dans un espace de noms particulier avec un label
purpose=production
. Sauvegardez le YAML dans le fichierweb-allow-prod.yaml
:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-prod namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production 2
Appliquez la politique en entrant la commande suivante :
$ oc apply -f web-allow-prod.yaml
Exemple de sortie
multinetworkpolicy.k8s.cni.cncf.io/web-allow-prod created
Vérification
Démarrez un service web dans l'espace de noms
default
en entrant la commande suivante :$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
Exécutez la commande suivante pour créer l'espace de noms
prod
:$ oc create namespace prod
Exécutez la commande suivante pour étiqueter l'espace de noms
prod
:$ oc label namespace/prod purpose=production
Exécutez la commande suivante pour créer l'espace de noms
dev
:$ oc create namespace dev
Exécutez la commande suivante pour étiqueter l'espace de noms
dev
:$ oc label namespace/dev purpose=testing
Exécutez la commande suivante pour déployer une image
alpine
dans l'espace de nomsdev
et pour démarrer un shell :$ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
Exécutez la commande suivante dans l'interpréteur de commandes et observez que la demande est bloquée :
# wget -qO- --timeout=2 http://web.default
Résultats attendus
wget: download timed out
Exécutez la commande suivante pour déployer une image
alpine
dans l'espace de nomsprod
et démarrer un shell :$ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
Exécutez la commande suivante dans l'interpréteur de commandes et observez que la demande est autorisée :
# wget -qO- --timeout=2 http://web.default
Résultats attendus
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>