Déclarer une politique réseau (NetworkPolicy)

Ce document vous aide à utiliser l'API NetworkPolicy de Kubernetes pour déclarer des politiques réseau qui gouvernent la communication entre les pods.

Pré-requis

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 Minikube, ou vous pouvez utiliser l'un de ces environnements Kubernetes:

Votre serveur Kubernetes doit être au moins à la version v1.8. Pour consulter la version, entrez kubectl version.

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 :

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.

kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

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

kubectl expose deployment nginx --port=80
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.

kubectl get svc,pod
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 :

kubectl run busybox --rm -ti --image=busybox:1.28 -- /bin/sh

Dans votre shell, exécutez la commande suivante :

wget --spider --timeout=1 nginx
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 :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"

Le nom d'un objet NetworkPolicy doit être un nom de sous-domaine DNS valide.

Affecter la politique au Service

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

kubectl apply -f https://k8s.io/examples/service/networking/nginx-policy.yaml
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 :

kubectl run busybox --rm -ti --image=busybox:1.28 -- /bin/sh

Dans votre shell, exécutez la commande :

wget --spider --timeout=1 nginx
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 :

kubectl run busybox --rm -ti --labels="access=true" --image=busybox:1.28 -- /bin/sh

Dans votre shell, exécutez la commande :

wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists

Certains éléments sur cette page font référence à des produits ou projets tiers qui fournissent des fonctionnalités requises par Kubernetes. Les auteurs du projet Kubernetes ne sont pas responsables de ces produits ou projets tiers. Consultez les lignes directrices du site de la CNCF pour plus de détails.

Vous devriez lire le guide avant de proposer une modification qui ajoute un nouveau lien tiers.