le réseau dans Kubernetes Managé
Objectifs
Ce tutoriel a pour objectif de vous familiariser avec les concepts réseau fondamentaux de l'offre Managed Kubernetes. À la fin de ce guide, vous serez en mesure de :
- Comprendre le plan d'adressage IP de votre cluster (nœuds, pods, services).
- Connaître les différents mécanismes pour exposer vos applications (Ingress, LoadBalancer).
- Visualiser les flux réseau et les politiques de sécurité avec Hubble.
Nous prendrons comme exemple un cluster "ctodev", dont le range attribué est 10.20.0.0/22
Ce range d'IP privées X.Y.Z.0/22 (RFC 1918) est défini avec le client lors de la mise en place du cluster. Il ne peut pas être modifié plus tard.
Plan d'adressage IP
Votre cluster Kubernetes Managé dispose d'un VLAN multi-zonal avec un range d'adresses IPv4 en /22.
Le range de notre exemple 10.20.0.0/22 est découpé de manière logique en sous-ranges.
-
10.20.0.0/24 est attribué aux Noeuds du cluster:
-
10.20.0.10 : ctodev-gitrunner (la machine qui pilote l'infrastructure)
-
10.20.0.20 : IP virtuelle (load balancée) du service API Kubernetes
-
10.20.0.21 : ctodev-cp-01 (control plane 01)
-
10.20.0.22 : ctodev-cp-02 (control plane 02)
-
10.20.0.23 : ctodev-cp-03 (control plane 03)
-
10.20.0.41 : ctodev-ceph-01 (Ceph Storage 01)
-
10.20.0.42 : ctodev-ceph-02 (Ceph Storage 02)
-
10.20.0.43 : ctodev-ceph-03 (Ceph Storage 03)
-
10.20.0.51 : ctodev-wrk-01 (Worker 01)
-
10.20.0.52 : ctodev-wrk-02 (Worker 02)
-
10.20.0.53 : ctodev-wrk-03 (Worker 03)
-
...
-
10.20.0.151 : ctodev-wrk-100 (Worker 100)
-
-
MetalLB interne : 10.20.1.1 – 10.20.1.127
- 10.20.1.1 : ingress
nginx-internal
- 10.20.1.1 : ingress
-
MetalLB externe : 10.20.1.128 – 10.20.1.254
- 10.20.1.128 : ingress
nginx-external - 10.20.1.129 : ingress
nginx-external-secure
- 10.20.1.128 : ingress
-
Pods: 10.241.0.0/16
-
Services: 10.95.0.0/12
Les ranges Pods et Services sont définis avec le client lors de la mise en place du cluster. Ils ne peuvent pas être modifiés plus tard.
Utilisation de MetalLB
MetalLB est le composant qui permet d'exposer des services de couche 3 (non web / L7) directement sur une adresse IP, qu'elle soit interne ou externe, en utilisant le type de service LoadBalancer. C'est une alternative aux Ingress pour les applications non-HTTP ou pour des cas d'usage spécifiques.
Pour utiliser MetalLB, il vous suffit de créer un service de type LoadBalancer. MetalLB lui assignera automatiquement une adresse IP depuis les plages préconfigurées. La distinction entre les plages interne et externe est une mesure de sécurité pour garantir qu'une application destinée à un usage interne ne soit pas exposée sur un réseau public par erreur.
Exemple : Exposer un service sur le réseau interne
apiVersion: v1
kind: Service
metadata:
name: mon-service-interne
namespace: mon-namespace
spec:
selector:
app: mon-app
ports:
- protocol: TCP
port: 8080
targetPort: 80
type: LoadBalancer
Après avoir appliqué ce manifeste, votre service se verra attribuer une adresse IP dans la plage 10.20.1.1 – 10.20.1.127 et sera accessible depuis votre réseau interne connecté au cluster.
Exemple : Exposer un service sur le réseau externe
Pour demander une adresse IP depuis la plage externe (10.20.1.128 – 10.20.1.254), vous devez ajouter le label lb-type: external à votre service.
apiVersion: v1
kind: Service
metadata:
name: mon-service-externe
namespace: mon-namespace
labels:
lb-type: external
spec:
selector:
app: mon-app
ports:
- protocol: TCP
port: 8080
targetPort: 80
type: LoadBalancer
Important : Cette plage reste dans un espace d’adressage privé. Pour une exposition publique, il est nécessaire de créer une règle NAT (DNAT) sur le firewall de votre infrastructure afin de rediriger le trafic d'une de vos IP publiques externes vers l’adresse IP privée attribuée par MetalLB.
IP Publiques
Votre cluster Kubernetes Managé a été livré d'origine avec 2 adresses IPv4 publiques.
La 1ère IP est utilisée sur le port 6443 pour l'API Kubernetes (dans notre exemple ctodev.mk.ms-cloud-temple.com:6443)
Cette même IP est aussi NATée sur l'ingress controller "nginx-external-secured" pour le port 443. Ceci permet l'exposition des différentes consoles mises à votre disposition (voir le guide quickstart). Les accès à cette IP publique sont filtrés avec une liste d'IP autorisées.
La 2ème IP publique est NAtée sur l'ingress controller "nginx-external", sur les ports 80 et 443.
Les applications exposées avec l'ingress class "nginx-external" seront donc directement accessible depuis Internet sur cette IP.
Si vous souhaitez une modification des règles de firewall (ajout/retrait d'IP autorisées), vous devez faire une demande de support.
Il est possible d'ajouter d'autres IP publiques si vous le souhaitez.
DNS
Pour le DNS interne (CoreDNS), le cluster aura ces paramètres:
- Nom du cluster :
<identifiant du cluster> - Domaine interne :
<identifiant du cluster>-cluster.local(dans notre exemple : ctodev-cluster.local)
Ce domaine interne est crucial pour la communication inter-services au sein du cluster. Il permet à une application de contacter une autre application en utilisant simplement son nom de service Kubernetes, sans avoir à connaître son adresse IP interne.
Par exemple, un service nommé api-backend dans le namespace production sera automatiquement résolvable à l'adresse api-backend.production.svc.ctodev-cluster.local.
La zone DNS publique utilisée pour les clusters Kubernetes Managé est .mk.ms-cloud-temple.com
L'ingress "nginx-external" (mappé sur l'IP publique n°2) est accessible sur "*.external.<votre identifiant de cluster>.mk.ms-cloud-temple.com".
Si vous publiez une application avec cet ingress-class, vous pourrez y accéder directement via ce nom de domaine. Voir le tutoriel : Déployer votre première application