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 el clúster. Este es el tipo de servicio predeterminado
NodePort : expone el servicio en cada IP de Node en un puerto estático (NodePort). Se crea automáticamente un servicio ClusterIP, al que se enrutará el servicio NodePort. Podrá ponerse en contacto con el servicio NodePort, desde fuera del clúster, mediante una solicitud
<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 usa ClusterIP
pero solo en un puerto diferente, que está abierto a clientes externos? Entonces, en este caso es <NodeIP>:<NodePort>
lo mismo que <ClusterIP>:<NodePort>
?
¿O se encuentra NodeIP
realmente la IP cuando se ejecuta kubectl get nodes
y no la IP virtual utilizada para el tipo de servicio ClusterIP?
2 - También en el diagrama del siguiente enlace:
http://kubernetes.io/images/docs/services-iptables-overview.svg
¿Hay alguna razón en particular por la cual 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 dibujara el mismo diagrama para NodePort, ¿sería válido dibujar el cliente completamente fuera de ambos Node
y Cluster
me estoy perdiendo completamente el punto?
fuente
externalIPs
cambia la ecuación aquí? Específicamente, ¿es posible asignar unaexternalIPs
matriz a unClusterIP
servicio de tipo, y luego el servicio también se vuelve accesible en la IP externa? ¿Cuándo elegirías esto sobre un NodePort?spec.clusterIp
? ¿Se puede mencionar explícitamente ClusterIP en service.yaml? Y de manera similarspec.loadBalancerIp
Para aclarar a cualquiera que esté buscando cuál es la diferencia entre los 3 en un nivel más simple. Puede exponer su servicio con ClusterIp mínimo (dentro del clúster k8s) o mayor exposición 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 de exposición ClusterIp a través del clúster k8s con
ip/name:port
servicio NodePort Expose a través de VM de red interna también externo a k8s
ip/name:port
Exponga el servicio a través del mundo externo o lo que haya definido en su LB.
fuente
ClusterIP: los servicios son accesibles por pods / services en el Cluster
Si hago 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:
Y ese nombre DNS solo puede resolverse mediante pods y servicios dentro del clúster.
NodePort: los clientes pueden acceder a los servicios en la misma LAN / clientes que pueden hacer ping a los nodos de host K8s (y pods / servicios en el clúster) (tenga en cuenta la seguridad de que sus nodos de host k8s deben estar en una subred privada, por lo tanto, los clientes en Internet ganaron no puedo llegar a este servicio)
Si hago un servicio llamado mynodeportservice en el espacio de nombres de mi espacio de nombres de tipo: NodePort en un clúster de Kubernetes de 3 nodos. Luego se creará un Servicio de tipo: ClusterIP y será accesible para los clientes dentro del clúster en la siguiente dirección de DNS estática predecible:
Para cada puerto que mynodeportservice escucha en un puerto de nodo en el rango de 30000 a 32767, se elegirá al azar. 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 IP 10.10.10.1, 10.10.10.2, 10.10.10.3, el servicio Kubernetes está escuchando en el puerto 80, y el Nodeport seleccionado 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 NodePort es escuchado por cada nodo host de Kubernetes) Kubeproxy reenviará la solicitud al puerto 80 de mynodeportservice.
LoadBalancer: todos los usuarios conectados a Internet pueden acceder a los servicios * (la arquitectura común es L4 LB es accesible públicamente en Internet al colocarlo en una DMZ o al proporcionarle una IP privada y pública, 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, funciona cuando Kubernetes tiene integraciones de proveedores en la nube).
Si realiza mylbservice, se generará una máquina virtual L4 LB (un servicio IP de clúster y un servicio NodePort también se generará implícitamente). Esta vez nuestro NodePort es 30222. La idea es que el L4 LB tendrá una IP pública de 1.2.3.4 y cargará el equilibrio 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 utiliza ClusterIP? Sí * ¿
O el NodeIP es realmente la IP encontrada cuando ejecuta kubectl get nodos? También Sí *
Vamos a dibujar un paralelo entre Fundamentos:
un contenedor está dentro de una cápsula. 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.
fuente
Supongamos que creó una VM de Ubuntu en su máquina local. Su dirección IP es 192.168.1.104 .
Inicie sesión en VM e instaló Kubernetes. Luego creaste un pod donde se ejecutaba la imagen nginx en él.
1- Si desea acceder a este pod nginx dentro de su VM, creará un ClusterIP vinculado a ese pod, por ejemplo:
Luego, en su navegador, puede escribir la dirección IP de nginxclusterip con el puerto 80, como:
http://10.152.183.2:80
2- Si desea acceder a este pod nginx desde su máquina host, deberá exponer su implementación con NodePort . Por ejemplo:
Ahora desde su máquina host puede acceder a nginx como:
http://192.168.1.104:31865/
En mi tablero aparecen como:
A continuación se muestra un diagrama que muestra la relación básica.
fuente
Incluso si esta pregunta ya tiene una respuesta, proporcionaré otra, tal vez con algunas fotos más para tener una mejor comprensión.
1. ClusterIP es el tipo de servicio predeterminado en Kubernetes y este tipo le brinda un servicio dentro del clúster. Al usar esto, otras aplicaciones del clúster pueden acceder al servicio a través del proxy Kubernetes.
Debo mencionar que este tipo de servicio no debe usarse para exponer servicios de producción. Sin embargo, se puede usar para
La forma en que va la solicitud es la siguiente: tráfico -> proxy K8s -> servicio K8s (ClusterIP) -> pods y se muestra en la siguiente imagen.
2. NodePort es la forma más primitiva de aceptar tráfico externo y reenviarlo a los servicios de kubernetes. Como su nombre lo indica, el tipo de servicio NodePort abre un puerto específico en todas las máquinas virtuales, que de hecho son los nodos de Kubernetes, para permitir que el tráfico que se envía a ese puerto específico se reenvíe al servicio.
El tipo de servicio NodePort tiene algunas desventajas:
La forma en que se realiza la solicitud es la siguiente: tráfico -> puerto expuesto en la máquina virtual -> servicio K8s (NodePort) -> pods y se muestra en la siguiente imagen:
3. LoadBalancer es la forma estándar de exponer un servicio a Internet. Si su deseo es exponer directamente un servicio y todo el tráfico en un puerto específico para ser reenviado al servicio, entonces esta es la manera de hacerlo. Además, el tipo de servicio LoadBalancer no implica ningún filtrado o enrutamiento. Además, puede enviarle tráfico TCP, UDP, HTTP gRPC.
Desventaja: cada servicio expuesto a través de un LoadBalancer tendrá su propia dirección IP y cada servicio estará expuesto a través de un solo LoadBalancer que puede ser costoso.
La solicitud tiene la siguiente ruta: tráfico -> LoadBalancer -> Servicio K8s -> pods y se muestra en la siguiente imagen.
fuente
pod3 puede hablar con pod1 a través de su red clusterIP.
puede acceder al servicio en el pod1 a través de nodeIPA: nodeportX O nodeIPB: nodeportX. De cualquier manera funcionará porque kube-proxy (que está instalado en cada nodo) recibirá su solicitud y la distribuirá [redirigirla (término de iptables)] entre los nodos que utilizan la red clusterIP.
básicamente, colocando LB al frente, para que el tráfico entrante se distribuya a nodeIPA: nodeportX y nodeIPB: nodeportX y luego continúe con el flujo de proceso número 2 anterior.
fuente