¿Cuál es la diferencia entre los tipos de servicios ClusterIP, NodePort y LoadBalancer en Kubernetes?
Pregunta 1 : Estoy leyendo la documentación y estoy un poco confundido con la redacción. Dice:
ClusterIP : expone el servicio en una IP interna del clúster. Al elegir este valor, solo se puede acceder al servicio desde dentro del clúster. Este es el tipo de servicio predeterminado
NodePort : Expone el servicio en la IP de cada Nodo en un puerto estático (el NodePort). Se crea automáticamente un servicio ClusterIP, al que se enrutará el servicio NodePort. Podrás contactar con el servicio NodePort, desde fuera del cluster, solicitando
<NodeIP>:<NodePort>
.LoadBalancer : expone el servicio externamente utilizando el equilibrador de carga de un proveedor de la nube. Los servicios NodePort y ClusterIP, a los que se enrutará el equilibrador de carga externo, se crean automáticamente.
¿El tipo de servicio NodePort todavía utiliza pero ClusterIP
solo en un puerto diferente, que está abierto a clientes externos? Entonces en este caso es <NodeIP>:<NodePort>
lo mismo que <ClusterIP>:<NodePort>
?
¿O en realidad es NodeIP
la IP que se encuentra cuando ejecuta kubectl get nodes
y no la IP virtual utilizada para el tipo de servicio ClusterIP?
Pregunta 2 : también en el diagrama del siguiente enlace:
¿Hay alguna razón en particular por la que Client
está dentro del Node
? Supuse que tendría que estar dentro de a Cluster
en el caso de un tipo de servicio ClusterIP.
Si se dibujó el mismo diagrama para NodePort, ¿sería válido dibujar al cliente completamente fuera de ambos Node
y Cluster
o me estoy perdiendo por completo el punto?
Un ClusterIP expone lo siguiente:
spec.clusterIp:spec.ports[*].port
Solo puede acceder a este servicio mientras esté dentro del clúster. Es accesible desde su spec.clusterIp
puerto. Si spec.ports[*].targetPort
se establece a, se enrutará desde el puerto al puerto de destino. La IP del CLUSTER que obtienes al llamar kubectl get services
es la IP asignada a este servicio dentro del cluster internamente.
Un NodePort expone lo siguiente:
<NodeIP>:spec.ports[*].nodePort
spec.clusterIp:spec.ports[*].port
Si accede a este servicio en un nodePort desde la IP externa del nodo, enrutará la solicitud a spec.clusterIp:spec.ports[*].port
, que a su vez la enrutará a su spec.ports[*].targetPort
, si está configurado. También se puede acceder a este servicio de la misma forma que ClusterIP.
Sus NodeIP son las direcciones IP externas de los nodos. No puedes acceder a tu servicio desde spec.clusterIp:spec.ports[*].nodePort
.
Un LoadBalancer expone lo siguiente:
spec.loadBalancerIp:spec.ports[*].port
<NodeIP>:spec.ports[*].nodePort
spec.clusterIp:spec.ports[*].port
Puede acceder a este servicio desde la dirección IP de su balanceador de carga, que enruta su solicitud a un nodePort, que a su vez enruta la solicitud al puerto IP del clúster. Puede acceder a este servicio como lo haría con un servicio NodePort o ClusterIP también.
Para aclarar a cualquiera que esté buscando cuál es la diferencia entre los 3 a un nivel más simple. Puede exponer su servicio con un ClusterIp mínimo (dentro del clúster k8s) o una exposición mayor con NodePort (dentro del clúster externo al clúster k8s) o LoadBalancer (mundo externo o lo que haya definido en su LB).
Exposición ClusterIp < exposición NodePort < exposición LoadBalancer
Servicio ClusterIp Expose a través del clúster k8s conip/name:port
Servicio NodePort Expose a través de VM de red interna también externa a k8sip/name:port
- LoadBalancer
Expone el servicio a través del mundo externo o lo que hayas definido en tu LB.
ClusterIP: los pods/servicios en el clúster pueden acceder a los servicios.
Si creo un servicio llamado myservice en el espacio de nombres predeterminado de tipo: ClusterIP, se creará la siguiente dirección DNS estática predecible para el servicio:
myservice.default.svc.cluster.local (o simplemente myservice.default, o por pods en el espacio de nombres predeterminado, solo funcionará "myservice")
Y ese nombre DNS solo puede ser resuelto por pods y servicios dentro del clúster.
NodePort: los servicios son accesibles para clientes en la misma LAN/clientes que pueden hacer ping a los nodos host K8s (y pods/servicios en el clúster) (Nota por seguridad, sus nodos host k8s deben estar en una subred privada, por lo tanto, los clientes en Internet ganarán No podré acceder a este servicio)
Si creo un servicio llamado mynodeportservice en el espacio de nombres mynamespace de tipo: NodePort en un clúster de Kubernetes de 3 nodos. Luego se creará un servicio de tipo: ClusterIP y los clientes dentro del clúster podrán acceder a él en la siguiente dirección DNS estática predecible:
mynodeportservice.mynamespace.svc.cluster.local (o simplemente mynodeportservice.mynamespace)
Para cada puerto que mynodeportservice escucha en un nodoport en el rango de 30000 - 32767 se elegirá aleatoriamente. Para que los clientes externos que están fuera del clúster puedan acceder al servicio ClusterIP que existe dentro del clúster. Digamos que nuestros 3 nodos host K8 tienen las IP 10.10.10.1, 10.10.10.2, 10.10.10.3, el servicio Kubernetes está escuchando en el puerto 80 y el puerto de nodo elegido al azar fue 31852.
Un cliente que existe fuera del clúster podría visitar 10.10.10.1:31852, 10.10.10.2:31852 o 10.10.10.3:31852 (ya que cada nodo host de Kubernetes escucha NodePort), Kubeproxy reenviará la solicitud al puerto 80 de mynodeportservice.
LoadBalancer: todos los conectados a Internet pueden acceder a los servicios* (la arquitectura común es L4. LB es accesible públicamente en Internet colocándolo en una DMZ o dándole una IP pública y privada y los nodos host k8s están en una subred privada)
( Nota: Este es el único tipo de servicio que no funciona en el 100% de las implementaciones de Kubernetes, como Kubernetes bare metal, funciona cuando Kubernetes tiene integraciones de proveedores de nube).
Si crea mylbservice, se generará una máquina virtual LB L4 (una servicio IP del clúster y también se generará implícitamente un servicio NodePort). Esta vez nuestro NodePort es 30222. La idea es que el L4 LB tenga una IP pública de 1.2.3.4 y equilibrará la carga y reenviará el tráfico a los 3 nodos host K8 que tienen direcciones IP privadas. (10.10.10.1:30222, 10.10.10.2:30222, 10.10.10.3:30222) y luego Kube Proxy lo reenviará al servicio de tipo ClusterIP que existe dentro del clúster.
También preguntó: ¿El tipo de servicio NodePort todavía usa ClusterIP? Sí*
¿O es en realidad NodeIP la IP que se encuentra cuando ejecuta kubectl get nodes? También Sí*
Tracemos un paralelo entre los Fundamentos:
un contenedor está dentro de un pod. una cápsula está dentro de un conjunto de réplicas. un conjunto de réplicas está dentro de una implementación.
De manera similar:
un servicio ClusterIP es parte de un servicio NodePort. Un servicio NodePort es parte de un servicio de equilibrador de carga.
En ese diagrama que mostró, el Cliente sería un pod dentro del clúster.