Services et exposition
Les pods sont éphémères : leur IP change à chaque recréation. Le Service est l'abstraction qui fournit un point d'accès stable vers un ensemble de pods. Il s'appuie sur les labels pour sélectionner ses endpoints et configure kube-proxy (ou le CNI) pour router le trafic.
Types de Services
ClusterIP (défaut)
Accessible uniquement depuis l'intérieur du cluster. Chaque Service reçoit une IP virtuelle stable dans le réseau de Services (par défaut 10.96.0.0/12). C'est le type à utiliser pour la communication inter-services.
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web # Sélectionne les pods avec ce label
ports:
- port: 80 # Port exposé par le Service
targetPort: 8080 # Port du conteneur
type: ClusterIP # Défaut — peut être omisNodePort
Expose le Service sur un port statique de chaque noeud (30000-32767). Accessible depuis l'extérieur via NodeIP:NodePort. Rarement utilisé en production (ports non-standard, dépend des IPs des noeuds). Utile pour les labs et le debugging.
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # Optionnel — assigné automatiquement si omisLoadBalancer
Demande à l'intégration cloud de provisionner un load balancer externe. Sur AWS, crée un ELB. Sur GCP, un Network Load Balancer. On-premise avec MetalLB ou kube-vip : annonce l'IP via BGP ou ARP. C'est le type standard pour exposer des services en production sur cloud.
spec:
type: LoadBalancer
ports:
- port: 443
targetPort: 8443ExternalName
Alias DNS vers un service externe. Utile pour intégrer des services hors-cluster (base de données RDS, API tierce) avec une adresse interne stable.
spec:
type: ExternalName
externalName: mydb.rds.amazonaws.comServices headless
Un Service headless (clusterIP: None) ne fournit pas de VIP. DNS retourne directement les IPs des pods. Indispensable pour les StatefulSets et les applications qui ont besoin de découvrir leurs pairs (Cassandra, Elasticsearch, etcd).
spec:
clusterIP: None
selector:
app: cassandraEndpoints et EndpointSlices
Kubernetes maintient des objets Endpoints (ou EndpointSlices depuis v1.21, préférés en v1.35) qui listent les IPs et ports des pods sélectionnés par le Service.
kubectl get endpoints web-svc
kubectl get endpointslices -l kubernetes.io/service-name=web-svcDNS interne
CoreDNS résout automatiquement les Services en noms DNS. Format : <service>.<namespace>.svc.cluster.local. Depuis un pod dans le même namespace : juste web-svc suffit.
# Depuis un pod, tester la résolution
kubectl run debug --image=busybox:1.36 --rm -it -- sh
# nslookup web-svc
# nslookup web-svc.default.svc.cluster.local