2 minute read

Partimos del escenario donde tenemos desplegado nuestras dos aplicaciones con las que hemos estado trabajando en prácticas anteriores: guestbook y letschat.

kubectl get deploy,services
NAME                                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/guestbook      3         3         3            3           1d
deployment.extensions/letschat       3         3         3            3           1d
deployment.extensions/mongo          1         1         1            1           1d
deployment.extensions/redis-master   1         1         1            1           1d
deployment.extensions/redis-slave    3         3         3            3           1d

NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/frontend       ClusterIP   10.104.59.122    <none>        80/TCP           1d
service/kubernetes     ClusterIP   10.96.0.1        <none>        443/TCP          1d
service/letschat       ClusterIP   10.111.18.129    <none>        8080/TCP         1d
service/mongo          ClusterIP   10.104.219.60    <none>        27017/TCP        1d
service/redis-master   ClusterIP   10.98.46.85      <none>        6379/TCP         1d
service/redis-slave    ClusterIP   10.110.200.207   <none>        6379/TCP         1d

Como podemos ver los servicios que dan acceso a las aplicaciones lo hemos creado del tipo ClusterIP por lo que ahora mismo no tenemos forma de acceder a ellos desde el exterior. Vamos a crear un recurso Ingress para acceder de ello por medio de dos nombres, para ello lo definimos en el fichero ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name-based
  annotations:
    traefik.ingress.kubernetes.io/affinity: "true"
spec:
  rules:
  - host: www.guestbook.com
    http:
      paths:
      - path: "/"
        backend:
          serviceName: frontend
          servicePort: 80
  - host: www.letschat.com
    http:
      paths:
      - path: "/"
        backend:
          serviceName: letschat
          servicePort: 8080
  • Como vemos en un fichero podemos definir varías reglas de encaminamiento.
  • Podemos configurar el proxy inverso utilizando Annotations, en este caso traefik.ingress.kubernetes.io/affinity nos permite activa la persistencia en las sesiones. Para ver más opciones de configuración en traefik puedes ver la documentación oficial.

Creamos el recurso ingress:

kubectl create -f ingress.yaml 
ingress.extensions "ingress-name-based" created

kubectl get ingress
NAME                 HOSTS                                ADDRESS   PORTS     AGE
ingress-name-based   www.guestbook.com,www.letschat.com             80        15s

Vamos a utilizar resolución estática, por lo tanto añado la resolución a la IP de cualquier nodo del cluster al fichero /etc/hosts:

172.22.200.178  www.guestbook.com  www.letschat.com

Y ya podemos acceder:

ingress

ingress

Para seguir investigando

  • Las distintas aplicaciones que podemos usar para crear un Ingress Controller (HAproxy, nginx, traefik,…) nos dan diferentes opciones de configuración.
  • Traefik también ofrece la posibilidad de usar rutas basadas en path, trabajar con certificados TLS, autentificación básica, …
  • Otra opción para acceder al Ingress controller es desplegarlo con un Deployment y crear un servicio del tipo LoadBalancer para acceder a él, en este caso es muy fácil escalarlo.

Índice de entradas sobre Kubernetes

Este artículo corresponde a una serie de entradas donde he hablado sobre Kubernetes:

Comments

Javier Cóndor

Hola, muy interesante. Cuando muestras los servicios se muestra que usan los puertos 80 y 8080, pero cuando se hace el ejemplo se ve que toman puertos por encima de los 30000. ¿Cómo hiciste para que tome esos puertos? Si se usa tal cual no funciona el ingress, supongo que tengo que modificarlo con los puertos que me dio el kubectl no?
No me llegó a funcionar =(

Leave a Comment

Your email address will not be published. Required fields are marked *

Loading...