Documentation Kubernetes : Services et Connectivité¶
Table des Matières¶
- Introduction aux Services
- Résolution DNS dans Kubernetes
- Types de Services
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- Services Avancés
- Services sans Selector
- Ingress
- Outils de Débogage
- 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 |
+---------------------+