Passer au contenu principal

Fondamentaux (Kubernetes)

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 omis

NodePort

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 omis

LoadBalancer

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: 8443

ExternalName

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.com

Services 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: cassandra

Endpoints 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-svc

DNS 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

Sources