# Déclarer une politique réseau (NetworkPolicy)

LLMS index: [llms.txt](/llms.txt)

---

<!-- aperçu -->
Ce document vous aide à utiliser l'[API NetworkPolicy de Kubernetes](/docs/concepts/services-networking/network-policies/) pour déclarer des politiques réseau qui gouvernent la communication entre les pods.

<div class="alert alert-secondary callout third-party-content" role="note"><strong>Note</strong>&puncsp;Cette section renvoie à des projets tiers qui fournissent des fonctionnalités requises par Kubernetes. Les auteurs du projet Kubernetes ne sont pas responsables de ces projets, classés par ordre alphabétique. Pour ajouter un projet à cette liste, lisez le <a href="/docs/contribute/style/content-guide/#third-party-content">guide</a> avant de soumettre une modification. <a href="#third-party-content-disclaimer">Plus d'informations.</a></div>


## Pré-requis

<p>Vous devez disposer d'un cluster Kubernetes et l'outil de ligne de commande kubectl doit être configuré pour communiquer avec votre cluster.
Si vous ne possédez pas déjà de cluster, vous pouvez en créer un en utilisant <a href="/docs/setup/minikube">Minikube</a>, ou vous pouvez utiliser l'un de ces environnements Kubernetes:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>
 
 
 Votre serveur Kubernetes doit être au moins à la version v1.8.
  <p>Pour consulter la version, entrez  <code>kubectl version</code>.</p>


Assurez-vous d'avoir configuré un fournisseur de réseau qui supporte les politiques réseau. De nombreux fournisseurs de réseau prennent en charge les NetworkPolicy, notamment :

* [Antrea](/docs/tasks/administer-cluster/network-policy-provider/antrea-network-policy/)
* [Calico](/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy/)
* [Cilium](/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy/)
* [Kube-router](/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy/)
* [Romana](/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy/)
* [Weave Net](/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy/)

<!-- steps -->

## Créer un Deployment `nginx` et l'exposer via un Service

Pour comprendre comment fonctionne les politiques réseau dans Kubernetes, commencez par créer un déploiement `nginx`.

```console
kubectl create deployment nginx --image=nginx
```
```none
deployment.apps/nginx created
```

Exposez le déploiement via un service appelé `nginx`.

```console
kubectl expose deployment nginx --port=80
```

```none
service/nginx exposed
```

Les commandes ci-dessus créent un déploiement avec un Pod nginx et exposent le déploiement via un service nommé `nginx`. Le Pod et le Deployment `nginx` se trouvent dans le namespace `default`.

```console
kubectl get svc,pod
```

```none
NAME                        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes          10.100.0.1    <none>        443/TCP    46m
service/nginx               10.100.0.16   <none>        80/TCP     33s

NAME                        READY         STATUS        RESTARTS   AGE
pod/nginx-701339712-e0qfq   1/1           Running       0          35s
```

## Tester le Service en y accédant depuis un autre Pod

Vous devriez pouvoir accéder au nouveau service `nginx` depuis d'autres pods. Pour accéder au service `nginx` depuis un autre pod dans le namespace `default`, démarrez un conteneur busybox :

```console
kubectl run busybox --rm -ti --image=busybox -- /bin/sh
```

Dans votre shell, exécutez la commande suivante :

```shell
wget --spider --timeout=1 nginx
```

```none
Connecting to nginx (10.100.0.16:80)
remote file exists
```

## Limiter l'accès au Service `nginx`

Pour limiter l'accès au service `nginx` afin que seuls les pods avec le label `access: true` puissent le consulter, créez un objet NetworkPolicy comme suit :


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/fr/examples/service/networking/nginx-policy.yaml" download="service/networking/nginx-policy.yaml"><code>service/networking/nginx-policy.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('service-networking-nginx-policy-yaml')" title="Copy service/networking/nginx-policy.yaml to clipboard"></img></div>
    <div class="includecode" id="service-networking-nginx-policy-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">networking.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">NetworkPolicy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">access-nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">podSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ingress</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">from</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">podSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">access</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;true&#34;</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Le nom d'un objet NetworkPolicy doit être un [nom de sous-domaine DNS valide](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names).


<div class="alert alert-info" role="note"><h4 class="alert-heading">Note</h4>Les NetworkPolicy incluent un <code>podSelector</code> qui sélectionne le regroupement de pods auxquels la politique s'applique. Vous pouvez voir que cette politique sélectionne les pods avec le label <code>app=nginx</code>. Ce label a été ajouté automatiquement au pod dans le déploiement <code>nginx</code>. Un <code>podSelector</code> vide sélectionne tous les pods dans le namespace.</div>


## Affecter la politique au Service

Utilisez kubectl pour créer une NetworkPolicy à partir du fichier `nginx-policy.yaml` ci-dessus :

```console
kubectl apply -f https://k8s.io/examples/service/networking/nginx-policy.yaml
```

```none
networkpolicy.networking.k8s.io/access-nginx created
```

## Tester l'accès au Service lorsque le label d'accès n'est pas défini
Lorsque vous tentez d'accéder au service `nginx` depuis un pod sans les bons labels, la requête échoue :

```console
kubectl run busybox --rm -ti --image=busybox -- /bin/sh
```

Dans votre shell, exécutez la commande :

```shell
wget --spider --timeout=1 nginx
```

```none
Connecting to nginx (10.100.0.16:80)
wget: download timed out
```

## Définir le label d'accès et tester à nouveau

Vous pouvez créer un pod avec le bon label pour voir que la requête est autorisée :

```console
kubectl run busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh
```

Dans votre shell, exécutez la commande :

```shell
wget --spider --timeout=1 nginx
```

```none
Connecting to nginx (10.100.0.16:80)
remote file exists
```
