Dans Kubernetes, un Service est une abstraction qui expose une application s'exécutant sur un ensemble de pods en tant que service réseau. Il fournit un nom DNS stable et assure l'équilibrage de charge pour les pods. Cette rubrique explique le fonctionnement des Services Kubernetes, présente les points d'attention importants et formule des recommandations pour choisir le type de Service approprié.
Concepts clés
Types de services
Si la version de Cloud Controller Manager est la v2.5.0 ou ultérieure, l'utilisation d'une instance CLB pour créer un Service dans la console devient une fonctionnalité sur liste blanche qui prend uniquement en charge la facturation au paiement à l'utilisation. Pour créer un Service de type CLB dans la console, soumettez une demande sur la page du Quota Center.
Nom | Description | Cas d'utilisation | Facturation |
Type de Service par défaut. Un Service ClusterIP reçoit une adresse IP virtuelle accessible uniquement depuis l'intérieur du cluster. | Idéal pour les services qui doivent communiquer uniquement au sein du même cluster. Par exemple, si un pod d'application frontend doit accéder à une base de données backend au sein du même cluster, vous pouvez exposer la base de données en tant que Service ClusterIP. | Gratuit. | |
Un Service NodePort ouvre un port spécifique sur chaque nœud du cluster. Vous pouvez accéder au Service depuis l'extérieur du cluster en utilisant | Convient pour exposer un service à Internet pour le développement, les tests ou d'autres applications à faible trafic. Par exemple, vous pouvez utiliser un Service NodePort pour déployer et déboguer une application web dans un environnement de test. Contrairement à un Service LoadBalancer, il ne fournit pas d'équilibrage de charge entre les nœuds. Le trafic est envoyé vers un seul nœud, ce qui peut facilement devenir un goulot d'étranglement des ressources. | Gratuit. Pour activer l'accès à Internet public, vous devez associer une EIP au nœud. Pour plus d'informations sur la facturation des EIP, consultez la Vue d'ensemble de la facturation. | |
Un Service LoadBalancer étend le type NodePort en provisionnant un équilibreur de charge externe qui distribue le trafic entre les pods du cluster. Le Service fournit automatiquement une adresse IP externe que les clients peuvent utiliser pour y accéder. Il prend en charge la gestion du trafic de couche 4 (TCP/UDP) et de couche 7 (HTTP/HTTPS). | Idéal pour les applications s'exécutant sur un cloud public qui nécessitent un point d'entrée externe stable et facile à gérer. Par exemple, les services publics dans un environnement de production qui doivent être accessibles depuis Internet et gérer de grands volumes de trafic externe avec une haute disponibilité, tels que les applications web ou les services API. Important Pour la communication intra-cluster, utilisez toujours un Service En revanche, l'accès à un Service de type
Par conséquent, l'accès à une IP LoadBalancer depuis l'intérieur du cluster peut varier considérablement, voire échouer, selon les environnements et les versions de Kubernetes. Scénario d'exemple : Flannel + IPVS + externalTrafficPolicy=Local | Pour plus d'informations sur les frais relatifs aux instances d'équilibrage de charge, consultez | |
Service Headless | Un Service Headless ne possède pas d'adresse IP virtuelle. Une requête DNS pour le nom du service renvoie une liste d'adresses IP de pods au lieu d'une seule IP de service. Cela vous permet de découvrir et de vous connecter directement à des pods spécifiques. | Idéal pour les applications qui doivent communiquer directement avec des pods backend spécifiques plutôt que via un proxy ou un équilibreur de charge. Par exemple, si vous déployez une application stateful telle qu'un service de base de données ClickHouse, vous pouvez utiliser un Service Headless. Cela permet aux pods d'application d'accéder directement à chaque pod ClickHouse, équilibrant ainsi les lectures de données ou effectuant des écritures ciblées pour améliorer l'efficacité du traitement des données. | Gratuit. |
ExternalName | Un Service ExternalName mappe un nom de service interne à un nom de domaine externe. Cela permet aux pods à l'intérieur du cluster d'accéder au domaine externe en utilisant le nom de service interne. | Idéal lorsqu'un cluster doit accéder à un service exposé sous un nom de domaine public. Par exemple, si vos pods d'application doivent accéder à un domaine de base de données externe, vous pouvez utiliser un Service ExternalName pour mapper le domaine à un nom de service interne, ce qui permet un accès direct depuis l'intérieur du cluster. | Gratuit. |
Fonctionnement
ClusterIP
-
Création et allocation
Lorsque vous créez un Service ClusterIP dans un cluster ACK, le plan de contrôle lui attribue une adresse IP virtuelle (ClusterIP) accessible uniquement depuis l'intérieur du cluster.
-
Transfert de trafic
Lorsque vous accédez au ClusterIP, kube-proxy intercepte le trafic et le transfère vers un pod backend en utilisant un algorithme d'ordonnancement round-robin.
-
Découverte de service
Lorsqu'un Service ClusterIP est créé, CoreDNS enregistre un enregistrement DNS pour celui-ci, permettant au service d'être résolu et consulté par son nom. Le format est
service-name.namespace.svc.cluster.local:port, par exemplenginx.default.svc.cluster.local:80. -
Étiquettes de pod et suivi des endpoints
Un Service utilise un sélecteur d'étiquettes pour identifier ses pods backend.
Le plan de contrôle surveille en continu les modifications des pods. Lorsque des pods correspondant au sélecteur d'étiquettes du Service sont ajoutés, mis à jour ou supprimés, le plan de contrôle met à jour l'endpoint.
NodePort
-
Création et allocation
Lorsque vous créez un Service NodePort, le cluster ouvre un port (le NodePort) sur ses nœuds pour permettre l'accès externe.
-
Transfert de trafic
kube-proxy écoute sur le NodePort, qui est choisi automatiquement dans une plage par défaut de 30000-32767. Il achemine les requêtes externes vers le ClusterIP, qui les transfère ensuite aux pods backend.
-
Accès externe
Vous pouvez accéder au Service de l'extérieur en utilisant l'adresse IP du nœud et le port statique (NodePort) au format
<NodeIP>:<NodePort>.
LoadBalancer
-
Création et allocation
Lorsque vous créez un Service LoadBalancer, le plan de contrôle interagit automatiquement avec le service d'équilibrage de charge pour créer une instance d'équilibreur de charge afin de gérer le trafic. Pour plus d'informations, consultez Utiliser une instance Server Load Balancer existante pour exposer une application et Exposer une application avec un service LoadBalancer provisionné automatiquement.
-
Transfert de trafic
Lorsque le trafic externe atteint l'IP externe de l'instance d'équilibreur de charge, il est acheminé vers le port sur les nœuds. Ensuite, kube-proxy transfère le trafic vers les pods backend.
-
Configuration des routes et des vérifications d'état
L'équilibreur de charge configure automatiquement les ports d'écoute et effectue des vérifications d'état pour garantir que le trafic n'est acheminé que vers des pods sains.
Stratégie de trafic externe
Les Services LoadBalancer et NodePort disposent d'un paramètre externalTrafficPolicy qui contrôle la manière dont le trafic externe est acheminé. Le comportement de ce paramètre diffère entre les clusters utilisant les plugins réseau Terway-Eniip et Flannel.
Connectez-vous à la console ACK. Sur la page Clusters, cliquez sur le nom de votre cluster. Dans l'onglet Basic Information, vous pouvez consulter le plugin réseau CNI utilisé par votre cluster.
Plugin réseau Flannel
|
Élément |
Local |
Cluster |
|
Ajout des serveurs backend |
Seuls les nœuds hébergeant des pods backend sont ajoutés en tant que serveurs backend à l'équilibreur de charge. |
Tous les nœuds du cluster sont ajoutés en tant que serveurs backend à l'équilibreur de charge. |
|
Quota d'équilibreur de charge |
Consomme moins de ressources de quota d'équilibreur de charge. Pour plus d'informations, consultez les Limites de quota. |
Consomme un grand nombre de ressources de quota d'équilibreur de charge car tous les nœuds du cluster sont attachés en tant que backends. Pour plus d'informations, consultez les Limites de quota. |
|
Accès intra-cluster au Service |
Seuls les nœuds hébergeant des pods backend pour le Service peuvent y accéder. |
N'importe quel nœud du cluster peut accéder au Service. |
|
Équilibrage de charge des pods |
L'équilibrage de charge entre les pods est désactivé par défaut. Pour activer l'équilibrage de charge, définissez l'ordonnanceur sur WRR en ajoutant l'annotation |
L'équilibrage de charge entre les pods est activé par défaut. |
|
Préservation de l'IP source |
Prise en charge. |
Non pris en charge. |
|
Persistance de session |
Prise en charge. |
Non pris en charge. |
|
Cas d'utilisation |
Applications nécessitant de préserver l'adresse IP client d'origine, par exemple pour la journalisation basée sur l'IP source. |
Lorsqu'une haute disponibilité du service est requise et que la préservation de l'IP source n'est pas une préoccupation, comme dans les grands clusters d'applications web. |
Plugin réseau Terway-Eniip
Élément | Local | Cluster |
Ajout des serveurs backend | Les pods sont directement ajoutés à l'équilibreur de charge en tant que serveurs backend. | |
Quota d'équilibreur de charge | Consomme moins de ressources de quota d'équilibreur de charge car seuls les pods d'application sont attachés. Pour plus d'informations, consultez les Limites de quota. | |
Accès intra-cluster au Service | Lors de l'accès au Service depuis l'intérieur du cluster, le trafic passe par kube-proxy sur le nœud et est soumis au paramètre | N'importe quel nœud du cluster peut accéder au Service. |
Équilibrage de charge des pods | L'équilibrage de charge entre les pods est activé par défaut. | |
Préservation de l'IP source | Prise en charge. | |
Persistance de session | Prise en charge. | |
Remarques d'utilisation
Avant d'utiliser la fonctionnalité d'équilibrage de charge des Services, examinez les considérations pertinentes. Pour plus d'informations, consultez la section Considérations pour la configuration de l'équilibrage de charge des Services.
Documents connexes
Utiliser une instance Server Load Balancer existante pour exposer une application
Exposer une application avec un service LoadBalancer provisionné automatiquement
Configurer Classic Load Balancer (CLB) à l'aide d'annotations
Configurer Network Load Balancer (NLB) à l'aide d'annotations
FAQ sur les Services et Résoudre les problèmes liés aux Services