Wiki.Pilas.Guru

4. Exponer la aplicación mediante Ingress

Habilitar el controlador

minikube addons enable ingress

Comprobar:

kubectl get pods -n ingress-nginx
kubectl get service -n ingress-nginx

Crear el Ingress

Crear k8s/03-ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mern
  namespace: mern
spec:
  ingressClassName: nginx
  rules:
    - host: web.mern.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 4200
    - host: api.mern.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: api
                port:
                  number: 3000

Aplicar:

kubectl apply -f k8s/03-ingress.yaml
kubectl get ingress -n mern

Crear un único acceso local

El Service del controlador es NodePort. Para este laboratorio se utilizó un único port-forward:

kubectl port-forward \
  -n ingress-nginx \
  service/ingress-nginx-controller \
  8080:80

Dejar este proceso activo.

Configurar hosts locales

Añadir en /etc/hosts:

127.0.0.1 web.mern.local
127.0.0.1 api.mern.local

Cambiar la URL de la API del frontend

En k8s/02-web.yaml cambiar:

            - name: REACT_APP_API_URL
              value: "http://api.mern.local:8080"

Aplicar y esperar el rollout:

kubectl apply -f k8s/02-web.yaml
kubectl rollout status deployment/web -n mern

Acceder a:

http://web.mern.local:8080/

La ruta final es:

Navegador
  -> Ingress Controller
  -> Service web o Service api
  -> Pod correspondiente

Pruebas a realizar

  1. Revisar el estado del Ingress y los recursos que utiliza:

    kubectl describe ingress mern -n mern
    kubectl get service web api -n mern
    kubectl get endpointslice -n mern -o wide
    
  2. Comprobar el acceso a la web y a la API usando los nombres definidos en
    /etc/hosts:

    curl -i http://web.mern.local:8080/
    curl -i http://api.mern.local:8080/
    
  3. Verificar que el enrutamiento depende del encabezado Host, incluso si se
    utiliza la misma dirección local:

    curl -i -H 'Host: web.mern.local' http://127.0.0.1:8080/
    curl -i -H 'Host: api.mern.local' http://127.0.0.1:8080/
    
  4. Enviar una petición con un host inexistente y observar la respuesta del
    controlador:

    curl -i -H 'Host: desconocido.mern.local' http://127.0.0.1:8080/
    
  5. Revisar los logs del controlador mientras se realizan peticiones:

    kubectl logs -n ingress-nginx \
      deployment/ingress-nginx-controller --tail=50
    
  6. Eliminar y recrear el Pod de la web para comprobar que el Ingress sigue
    llegando al Service cuando cambia la dirección del Pod:

    kubectl delete pod -n mern -l app=web
    kubectl get endpointslice -n mern \
      -l kubernetes.io/service-name=web -w
    

Aprendizajes del despliegue