ClusterIP, NodePort ou Ingress? Quand les utiliser –
Kubernetes prend en charge plusieurs façons d’obtenir du trafic externe dans votre cluster. ClusterIPs, NodePorts et Ingresses sont trois ressources largement utilisées qui jouent toutes un rôle dans le routage du trafic. Chacun vous permet d’exposer des services avec un ensemble unique de fonctionnalités et de compromis.
Sommaire
Les bases
Les charges de travail Kubernetes ne sont pas visibles sur le réseau par défaut. Vous mettez les conteneurs à disposition du monde extérieur en créant un un service. Les ressources de service acheminent le trafic vers les conteneurs au sein des pods.
Un service est un mécanisme abstrait pour exposer des pods sur un réseau. Chaque service se voit attribuer un type: ClusterIP, NodePort ou LoadBalancer. Celles-ci définissent la manière dont le trafic externe atteint le service.
ClusterIP
ClusterIP est le service Kubernetes par défaut. Votre service sera exposé sur un ClusterIP, sauf si vous définissez manuellement un autre type.
Un ClusterIP fournit une connectivité réseau dans votre cluster. Il n’est normalement pas accessible de l’extérieur. Vous utilisez ces services pour la mise en réseau interne entre vos charges de travail.
apiVersion: v1 kind: Service spec: selector: app: my-app type: ClusterIP ports: - name: http port: 80 targetPort: 80 protocol: TCP
Cet exemple de manifeste définit un service ClusterIP. Le trafic vers le port 80 sur le ClusterIP sera transféré vers le port 80 de vos pods (targetPort
). Pods avec le app: my-app
Le champ de métadonnées sera ajouté au service.
Vous pouvez voir l’adresse IP qui a été attribuée en exécutant kubectl get services
. D’autres charges de travail de votre cluster peuvent utiliser cette adresse IP pour interagir avec votre service.
Vous pouvez définir manuellement un ClusterIP sur une adresse IP spécifique à l’aide du spec.clusterIp
domaine:
spec: type: ClusterIP clusterIp: 123.123.123.123
le clusterIp
La valeur doit être une adresse IP valide dans la plage configurée pour votre cluster. Ceci est défini par le service-cluster-ip-range
dans le serveur d’API Kubernetes.
NodePort
Un NodePort expose publiquement un service sur un numéro de port fixe. Il vous permet d’accéder au service depuis l’extérieur de votre cluster. Vous devrez utiliser l’adresse IP du cluster et le NodePort
nombre — par exemple 123.123.123.123:30000
.
La création d’un NodePort ouvrira ce port sur chaque nœud de votre cluster. Kubernetes acheminera automatiquement le trafic du port vers le service auquel il est lié.
Voici un exemple de manifeste de service NodePort:
apiVersion: v1 kind: Service spec: selector: app: my-app type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP
Les définitions NodePort ont les mêmes propriétés obligatoires que les services ClusterIP. La seule différence est le passage à type: NodePort
. le targetPort
est toujours obligatoire, car NodePorts est soutenu par un service ClusterIP.
L’application du manifeste ci-dessus attribuera à votre NodePort un numéro de port aléatoire dans la plage disponible pour Kubernetes. Il s’agit généralement par défaut des ports 30000-32767. Vous pouvez spécifier manuellement un port en définissant le ports.nodePort
domaine:
spec: ports: - name: http port: 80 targetPort: 80 nodePort: 32000 protocol: TCP
Cela acheminera le trafic sur le port 32000 vers le port 80 dans vos pods.
Les NodePorts ne sont souvent pas idéaux pour les services publics. Ils utilisent des ports non standard, qui ne conviennent pas à la plupart du trafic HTTP. Vous pouvez utiliser un NodePort pour configurer rapidement un service à des fins de développement ou pour exposer un service TCP ou UDP sur son propre port. Lorsque vous proposez un environnement de production aux utilisateurs, vous souhaiterez plutôt utiliser une alternative.
Entrée
Une entrée est en fait une ressource complètement différente d’un service. Vous utilisez normalement Ingresses devant vos services pour fournir la configuration de routage HTTP. Ils vous permettent de configurer des URL externes, des hôtes virtuels basés sur le domaine, SSL et l’équilibrage de charge.
La configuration d’Ingresses nécessite l’existence d’un contrôleur d’entrée dans votre cluster. Il existe une large sélection de contrôleurs disponibles. La plupart des principaux fournisseurs de cloud ont leur propre contrôleur d’entrée qui s’intègre à leur infrastructure d’équilibrage de charge. nginx-ingress
est une option autonome populaire qui utilise le serveur Web NGINX comme proxy inverse pour acheminer le trafic vers vos services.
Vous créez des entrées à l’aide du Ingress
type de ressource. le kubernetes.io/ingress.class
L’annotation vous permet d’indiquer le type d’Ingress que vous créez. Ceci est utile si vous exécutez plusieurs contrôleurs de cluster.
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.class: nginx spec: rules: - host: example.com http: paths: - path: / backend: serviceName: my-service servicePort: 80 - host: another-example.com http: paths: - path: / backend: serviceName: second-service servicePort: 80
Ce manifeste définit deux points de terminaison Ingress. La première host
routes de règle example.com
trafic vers le port 80 sur le my-service
un service. La deuxième règle configure another-example.com
pour mapper aux pods qui font partie de second-service
.
Vous pouvez configurer SSL en définissant le tls
champ dans votre Ingress ‘ spec
:
spec: tls: - hosts: - example.com - another-example.com
Vous aurez besoin d’un émetteur tel que Cert Manager dans votre cluster pour que cela fonctionne. L’émetteur acquiert des certificats SSL pour vos domaines lors de la création de votre entrée.
Les entrées doivent être utilisées lorsque vous souhaitez gérer le trafic provenant de plusieurs domaines et chemins d’URL. Vous configurez vos points de terminaison à l’aide d’instructions déclaratives. Le contrôleur Ingress fournira vos itinéraires et les mappera aux services.
Équilibreurs de charge
Un dernier type de service est LoadBalancer. Ces services s’intègrent automatiquement aux équilibreurs de charge fournis par les environnements de cloud public. Vous devrez configurer votre propre équilibreur de charge si vous auto-hébergez votre cluster.
Les équilibreurs de charge sont utilisés pour mapper les adresses IP externes aux services de votre cluster. Contrairement à Ingresses, il n’y a pas de filtrage ou de routage automatique. Le trafic vers l’adresse IP externe et le port sera envoyé directement à votre service. Cela signifie qu’ils conviennent à tous les types de trafic.
L’implémentation de chaque équilibreur de charge dépend du fournisseur. Certaines plates-formes cloud offrent plus de fonctionnalités que d’autres. Sachez que la création d’un équilibreur de charge entraînera souvent des frais supplémentaires sur votre facture.
apiVersion: v1 kind: Service spec: selector: app: my-app type: LoadBalancer loadBalancerIP: 123.123.123.123 ports: - name: http port: 80 targetPort: 80 protocol: TCP
Les manifestes de l’équilibreur de charge ressemblent aux autres types de service. Trafic vers l’équilibreur de charge port
que vous définissez sera reçu par le targetPort
dans vos dosettes.
Votre environnement cloud créera un nouvel équilibreur de charge pour gérer votre trafic. Certains fournisseurs vous permettent de demander une adresse IP externe spécifique à l’aide du spec.loadBalancerIP
domaine. Vous recevrez une adresse IP aléatoire lorsque cela n’est pas pris en charge.
Conclusion
Les ClusterIP, NodePorts, Ingresses et Load Balancers acheminent le trafic externe vers les services de votre cluster. Chacun est conçu pour un cas d’utilisation différent. Certains de vos services auront le plus de sens avec un NodePort, tandis que d’autres auront besoin d’une entrée, généralement lorsque vous souhaitez fournir une URL.
Les quatre options fonctionnent en tandem avec le concept plus large de «service». Ce sont les gardiens qui permettent l’accès réseau à vos services. Ces services gèrent ensuite le dernier saut dans vos pods. Les deux couches d’abstraction maintiennent le routage totalement découplé de vos charges de travail: vos pods exposent simplement les ports, que les services rendent accessibles au public.