Cuándo usar ClusterIP Vs LoadBalancer Vs NodePort Vs ingress en Kubernetes

Kubernetes_services

Kubernetes_services


Alguna vez he visto que a la hora de definir un servicio el tipo de acceso al servicio que se establece no es el correcto, o no se esta seguro cuál asignar. En esta entrada sobre cuándo usar ClusterIP vs LoadBalancer vs NodePort vs Ingress en Kubernetes, analizaremos qué es cada tipo y cuál usar en función de nuestras necesidades cuando creamos un servicio.

ClusterIP en Kubernetes

ClusterIP es el servicio que establece por defecto Kubernetes. Este tipo de servicio únicamente va a ser accesible dentro de tu clúster por otros servicios o aplicaciones, es decir, no va a tener acceso externo.

 ClusterIP en Kubernetes | Cuándo usar ClusterIP Vs LoadBalancer Vs NodePort  Vs ingress en Kubernetes
ClusterIP en Kubernetes

Por ejemplo una definición de servicio con ClusterIP puede ser:

apiVersion: v1
kind: Service
metadata:
  name: myservice
  namespace: mynamespace
spec:
  selector:
    app: myservice
  ports:
    - protocol: TCP
      port: 10007
      targetPort:10007
  type: ClusterIP

Y qué pasa si queremos tener acceso desde internet, pues podemos hacer uso del Kubernetes proxy. El cual se ejecuta en cada nodo y se puede específicar para conectarnos desde fuera del clúster indicando el puerto. Obviamente podemos hacer esto para entornos NO productivos o de pruebas.

Para poder utilizar el proxy de kubernetes para lanzar un proxy server ejecutamos el siguiente comando:

$ kubectl proxy --port=8080

De manera que cuando el proxy esta funcionando podemos mediante un curl inspeccionar el API de Kubernetes y acceder al servicio:

http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>/proxy

Por ejemplo vamos a instalar el dahsboard de kubernetes ejecutando:

kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/alternative/kubernetes-dashboard.yaml

Ejecutamos kubernetes proxy;

kubectl proxy --address 0.0.0.0 --accept-hosts '.*'

y desde nuestro navegador o con un curl ejecutamos:

http://localhost:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy/#!/overview

Tal y como hemos comentado anteriormente Kubernetes proxy no lo usaremos en entornos productivos a no ser:

  • Necesitemos, como hemos visto en el ejemplo anterior, ver algún dashboard conectándonos desde fuera.
  • Permitir el tráfico interno
  • Tener que analizar algún problema y tener que hacer debug sobre un servicio.

NodePort en kubernetes

NodePort es una de las primeras formas que se tienen de dirigir tráfico externo de internet a tu servicio. Lo que hace NodePort, es abrir un puerto en los nodos, y todo el tráfico que llegue a ese port se dirige hacia el servicio definido.

NodePort en Kubernetes
NodePort en Kubernetes

Vamos a ver la definición de un servicio con NodePort, veremos que la diferencia lo marca el tipo de servicio:

apiVersion: v1
kind: Service
metadata:  
  name: myservice
spec:
  selector:    
    app: myapp
  type: NodePort
  ports:  
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30000
    protocol: TCP

Como vemos en la definición del servicio de arriba, hemos específicado el puerto para abrir en los nodos, en el caso en el que no se específique se seleccionará un puerto aleatorio.

El uso de este método para acceder a tu servicio, permitirá el acceso directo a través de la red, por lo que no esta recomendado para entornos productivos.

Puntos a tener en cuenta al usar NodePort en Kubernetes

  • Los puertos que podemos usar (en el ejemplo hemos hecho uso del 30036) son del 30000 al 32767.
  • Si la IP del nodo cambia habrá que re-configurar.
  • Un servicio es asignado a un Pod.

¿Cuándo usar un NodePort en Kubernetes?

Tal y como hemos comentado antes, el uso de NodePort va a dar acceso a través de la red a tu servicio, por lo que para entornos de producción no sería muy recomendado. Pero en cambio para hacer uso del servicio que has definido en momentos puntuales, por ejemplo, una demo a un cliente es un buen uso del NodePort.

LoadBalancer en Kubernetes

Un LoadBalancer en Kubernetes expone externamente el servicio usando por lo general un Load Balancer del provedor del cloud en el que te encuentres. La creación de un load balancer sucede de manera asíncrona y la información sobre el balanceador se plublica en el campo status.loadBalancer.

Load Balancer en Kubernetes
Load Balancer en Kubernetes

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  clusterIP: 10.0.121.221
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 192.0.1.127

El tráfico externo es dirigido a los Pods, el proveedor de cloud decide como balancear en cada caso. En algunos casos los proveedores permiten especificar el loadBalancerIP, sino se añade con una IP efímera.

¿Cuándo usar LoadBalancer en Kubernetes?

El uso de LoadBalancer nos va a permitir exponer un servicio directamente. El tráfico se dirigirá al puerto específicado en el servicio. La principal desventaja de hacer uso de LoadBalancer es que al obtener cada servicio su propia IP, puede que el proveedor de cloud cobre por servicio expuesto, lo que podría llegar a ser caro.

Ingress Controler en Kubernetes

A diferencia de los tipos de servicio comentados anteriormente, un Ingress no es realmente un tipo de servicio, sino que es una «pieza» que se encuentra en frente de muchos servicios y actúa como un punto de entrada a nuestro clúster.

Ingress Controler en Kubernetes | Cuándo usar ClusterIP Vs LoadBalancer Vs NodePort  Vs ingress en Kubernetes
Ingress Controler en Kubernetes

Hay muchos y diferentes tipos de Ingress, incluso dependiendo del proveedor de cloud puedes utilizar el suyo propio. Uno de los más comunes para utilizar es el de Nginx.

A parte con un Ingres podemos añadir diversas funcionalidades y plugins como el cert-manager para dar establecer una conexión SSL a nuestros servicios.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    meta.helm.sh/release-name: api-ingress
    meta.helm.sh/release-namespace: my-namespace
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  labels:
    app: api-ingress
  name: api-ingress
  namespace: my-namespace
spec:
  tls:
  - hosts:
    - api.services
    secretName: api-ingress-tls
  rules:
  - host: api.services
    http:
      paths:
      - backend:
          serviceName: myserviceA
          servicePort: 10030
        path: /my-service-a/(.*)
      - backend:
          serviceName: myserviceB
          servicePort: 10031
        path: /my-service-b/(.*)      

¿Cuándo usar Ingress Controller?

Ingress es la herramienta más utilizada cuando se quiere exponer múltiples servicios a través de la misma IP, además los servicios harán uso del protocolo L7, el cual opera en el más alto nivel de la capa de aplicación, la cual trata con los mensajes.

También el uso de un Ingress, obviamente reduce el coste en un proveedor de cloud, ya que pagarás por un Load Balancer únicamente, además podrás añadir diferentes funcionalidades como SSL, Auth, etc…

Conclusión

El tipo de servicios que suemos con Kubernetes nos va a permitir acceder a una red externa de una u otra manera, en este artículo sobre cuándo usar ClusterIP Vs LoadBalancer Vs NodePort Vs ingress en Kubernetes, hemos podido entender su uso y cuando es mejor usarlo.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *