ClusterIP: les services sont accessibles par des modules / services dans le cluster
Si je crée un service appelé myservice dans l'espace de noms par défaut de type: ClusterIP, l'adresse DNS statique prévisible suivante pour le service sera créée:
myservice.default.svc.cluster.local (ou simplement myservice.default, ou par des pods dans l'espace de noms par défaut, juste "myservice" fonctionnera)
Et ce nom DNS ne peut être résolu que par des pods et des services à l'intérieur du cluster.
NodePort: Les services sont accessibles par les clients sur le même LAN / clients qui peuvent envoyer une requête ping aux nœuds hôtes K8 (et aux pods / services du cluster) (Remarque pour la sécurité, vos nœuds hôtes k8 devraient être sur un sous-réseau privé, donc les clients sur Internet ont gagné ne pourra pas accéder à ce service)
Si je crée un service appelé mynodeportservice dans l'espace de noms mynamespace de type: NodePort sur un cluster Kubernetes à 3 nœuds. Ensuite, un service de type: ClusterIP sera créé et il sera accessible par les clients à l'intérieur du cluster à l'adresse DNS statique prévisible suivante:
mynodeportservice.mynamespace.svc.cluster.local (ou simplement mynodeportservice.mynamespace)
Pour chaque port que mynodeportservice écoute sur un port de noeud dans la plage de 30000 à 32767 sera choisi au hasard. Pour que les clients externes situés en dehors du cluster puissent accéder au service ClusterIP qui existe à l'intérieur du cluster. Disons que nos 3 nœuds hôtes K8 ont des adresses IP 10.10.10.1, 10.10.10.2, 10.10.10.3, le service Kubernetes écoute sur le port 80 et le Nodeport choisi au hasard était 31852.
Un client qui existe en dehors du cluster pourrait visiter 10.10.10.1:31852, 10.10.10.2:31852 ou 10.10.10.3:31852 (car NodePort est écouté par chaque nœud hôte Kubernetes) Kubeproxy transmet la demande au port 80 de mynodeportservice.
LoadBalancer: les services sont accessibles à tous ceux qui sont connectés à Internet * (L'architecture courante est que L4 LB est accessible au public sur Internet en le plaçant dans une DMZ ou en lui donnant à la fois une IP privée et publique et les nœuds hôtes k8s se trouvent sur un sous-réseau privé)
( Remarque: Il s'agit du seul type de service qui ne fonctionne pas dans 100% des implémentations de Kubernetes, comme Kubernetes bare metal, il fonctionne lorsque Kubernetes a des intégrations de fournisseur de cloud.)
Si vous créez mylbservice, une machine virtuelle L4 LB sera générée (un service IP de cluster et un service NodePort seront également implicitement générés). Cette fois, notre NodePort est 30222. L'idée est que le L4 LB aura une IP publique de 1.2.3.4 et qu'il chargera l'équilibre et acheminera le trafic vers les 3 nœuds hôtes K8 qui ont des adresses IP privées. (10.10.10.1:30222, 10.10.10.2:30222, 10.10.10.3:30222), puis Kube Proxy le transmettra au service de type ClusterIP qui existe à l'intérieur du cluster.
Vous avez également demandé: le type de service NodePort utilise-t-il toujours le ClusterIP? Oui *
Ou le NodeIP est-il réellement l'IP trouvé lorsque vous exécutez kubectl get nodes? Aussi Oui *
Permet de dessiner un parallèle entre les principes de base:
un conteneur est à l'intérieur d'un pod. un pod se trouve à l'intérieur d'un jeu de répliques. un jeu de répliques se trouve dans un déploiement.
De même,
un service ClusterIP fait partie d'un service NodePort. Un service NodePort fait partie d'un service d'équilibrage de charge.
Dans ce diagramme que vous avez montré, le client serait un pod à l'intérieur du cluster.
externalIPs
change l'équation ici? Plus précisément, il est possible d'affecter unexternalIPs
tableau à unClusterIP
service de type, puis le service devient également accessible sur l'IP externe? Quand choisiriez-vous cela sur un NodePort?