Skip to content

Documentation Kubernetes : Services et Connectivité

Table des Matières

  1. Introduction aux Services
  2. Résolution DNS dans Kubernetes
  3. Types de Services
  4. ClusterIP
  5. NodePort
  6. LoadBalancer
  7. ExternalName
  8. Services Avancés
  9. Services sans Selector
  10. Ingress
  11. Outils de Débogage
  12. Architecture Globale

Introduction aux Services

Les Services dans Kubernetes fournissent une abstraction pour exposer une application exécutée sur un ensemble de Pods en tant que service réseau. Ils offrent :

  • Stabilité : Une IP et un nom DNS persistants même lorsque les Pods changent
  • Découverte de service : Mécanisme intégré pour localiser les services
  • Équilibrage de charge : Répartition du trafic entre les Pods sains

Résolution DNS dans Kubernetes

Kubernetes déploie automatiquement un service DNS (CoreDNS) qui permet la résolution des noms de services :

  • Même namespace : <service-name>
  • Autre namespace : <service-name>.<namespace-name>
  • FQDN complet : <service-name>.<namespace-name>.svc.cluster.local

Exemple pour un service db dans le namespace production : - Dans le même namespace : db - Depuis un autre namespace : db.production


Types de Services

ClusterIP

Type par défaut - accessible uniquement depuis l'intérieur du cluster.

apiVersion: v1
kind: Service
metadata:
  name: internal-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

NodePort

Expose le service sur un port statique de chaque nœud (plage 30000-32767 par défaut).

apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 31000

LoadBalancer

Crée un équilibreur de charge externe (cloud providers).

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

ExternalName

Mappe un service à un nom DNS externe.

apiVersion: v1
kind: Service
metadata:
  name: external-db
spec:
  type: ExternalName
  externalName: my.database.example.com

Services Avancés

Services sans Selector

Pour pointer vers des endpoints externes au cluster :

Service :

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

Endpoints :

apiVersion: v1
kind: Endpoints
metadata:
  name: external-service
subsets:
  - addresses:
      - ip: 192.0.2.42
    ports:
      - port: 9376

Ingress

Gère l'accès HTTP/HTTPS aux services :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

Outils de Débogage

Port Forwarding (accès direct à un Pod) :

kubectl port-forward pod/mon-pod 8080:8080

Vérification des Endpoints :

kubectl get endpoints <service-name>

Test DNS :

kubectl run -it --rm --image=busybox:1.28 dns-test -- nslookup <service-name>


Architecture Globale

      +---------------------+
      |     Cluster DNS     |
      +----------+----------+
                 |
      +----------v----------+
      |    Service IP      |
      +----------+----------+
                 |
+-----------+----------+--------------+
| ClusterIP | NodePort | LoadBalancer |
+-----------+----------+--------------+
                 |
      +----------v----------+
      |     Endpoints      |
      +----------+----------+
                 |
      +----------v----------+
      |       Pods         |
      +---------------------+