Dans l'article précédent Guide étape par étape pour déployer et gérer Kubernetes, nous avons couvert les fondamentaux de Kubernetes: son architecture, ses composants clés (tels que les pods, les déploiements et les services) et les principes généraux de déploiement et de gestion des clusters. Nous allons maintenant approfondir l'utilisation de Pods—les plus petites unités exécutables dans Kubernetes. Pour gérer efficacement leur communication et leur disponibilité, Kubernetes Usages Services, dont l’objectif général a été mentionné plus haut.
Dans cet article, nous explorerons les fonctionnalités des services à travers des exemples pratiques : leurs types (ClusterIP, NodePort, LoadBalancer), les configurations de manifeste YAML et les cas d'utilisation pour garantir une communication stable entre les composants de l'application.
Kubernetes Services revisités
Tout d’abord, rappelons ce que Kubernetes Services En bref, ce sont des objets qui fournissent un accès stable aux applications d'un cluster, même lorsque les pods changent dynamiquement. Plus précisément, Kubernetes Services constituent un mécanisme essentiel pour assurer une communication réseau stable entre les composants applicatifs dans un environnement de cluster en constante évolution. En termes simples, les services agissent comme « points d'entrée stables » à un groupe de Pods, même si ces derniers sont recréés, mis à l'échelle ou déplacés entre nœuds. Voici une illustration des principaux types de services dans K8s :

Problèmes traités par Kubernetes Les services
Depuis que les Pods sont dans Kubernetes sont éphémères (leurs adresses IP changent lors des redémarrages, des mises à l'échelle ou des mises à jour), ce qui crée des défis pour les composants d'application (par exemple, frontend et backend) qui nécessitent une méthode de communication stable.
Kubernetes Les services résolvent ces problèmes grâce aux actions suivantes :
- Identifiants fixes: Les services attribuent une adresse IP stable (ClusterIP), DNS nom ou IP externe, indépendant du cycle de vie des Pods.
- Load Balancing: Le trafic est automatiquement réparti entre les pods sélectionnés via des étiquettes (par exemple, « app : backend »).
- Mise à jour automatique: Les services suivent dynamiquement les modifications dans l'ensemble des pods via EndpointSlices, en mettant à jour la liste des instances disponibles.
Core Kubernetes Types de services avec exemples
ClusterIP : pour l'accès interne aux pods du cluster
Exemple de configuration :
simple-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
Commande pour créer le service :
kubectl apply -f simple-service.yaml
Vérification :
kubectl get services # Viewing ClusterIP
kubectl describe service/my-service # Details Service and Endpoints
LoadBalancer est conçu pour un accès public via un équilibreur de charge cloud.
Exemple de configuration :
# nodeport-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 80
targetPort: 9376
nodePort: 30007 # Optional (default: random port in range)
Commande pour créer le service :
kubectl apply -f nodeport-service.yaml
Accès:
curl http://:30007 # replace with node IP
ExternalName est conçu pour créer un lien vers une ressource externe via DNS CNAME.
Exemple de configuration :
# loadbalancer-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer
spec:
type: LoadBalancer
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 80
targetPort: 9376
Commande pour créer le service :
kubectl apply -f loadbalancer-service.yaml
Vérification de l'IP externe :
kubectl get service/my-loadbalancer -o wide # Viewing EXTERNAL-IP
Le service sans tête (sans ClusterIP) est conçu pour un accès direct aux pods sans équilibrage de charge.
Exemple de configuration :
# externalname-service.yaml
apiVersion: v1
kind: Service
metadata:
name: external-db
spec:
type: ExternalName
externalName: my.database.example.com
Commande pour créer le service :
kubectl apply -f externalname-service.yaml
Usage:
D'autres pods peuvent accéder à « external-db » en tant que DNS prénom
Le service sans tête (sans ClusterIP) est conçu pour un accès direct aux pods sans équilibrage de charge.
Exemple de configuration :
# headless-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-headless
spec:
clusterIP: None
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 80
targetPort: 9376
Commande pour créer le service :
kubectl apply -f headless-service.yaml
DNS vérification:
nslookup my-headless.default.svc.cluster.local # Returns the IPs of all Pods
Exemples supplémentaires :
La configuration du service multiport est conçue pour simplifier la configuration des applications nécessitant plusieurs ports.
Configuration:
# multi-port-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-multi-port
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
- name: metrics
protocol: TCP
port: 9090
targetPort: 9090
Commande:
kubectl apply -f multi-port-service.yaml
La configuration du service sans sélecteur (EndpointSlices manuels) est utilisée pour s'intégrer aux ressources extérieures Kubernetes
Configuration du service :
# service-without-selector.yaml
apiVersion: v1
kind: Service
metadata:
name: my-external-service
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
La configuration d'EndpointSlice est conçue pour une gestion flexible des points de terminaison (y compris les systèmes externes) :
Configuration:
# endpointslice.yaml
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: my-service-1
labels:
kubernetes.io/service-name: my-external-service
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 9376
endpoints:
- addresses: ["10.4.5.6"]
- addresses: ["10.1.2.3"]
commandes:
kubectl apply -f service-without-selector.yaml
kubectl apply -f endpointslice.yaml
Commandes utiles :
L'affichage de tous les services permet d'afficher une liste de tous les services dans l'espace de noms actuel :
kubectl get services
L'affichage des points de terminaison vise à afficher une liste de points de terminaison : les adresses IP et les ports des pods associés au service :
kubectl get endpoints
DNS la vérification d'un service est destinée à vérifier DNS résolution du nom du service au sein d'un Pod :
kubectl exec -it -- nslookup
La suppression d'un service vise à supprimer le service du cluster :
kubectl delete service/