Cómo configurar el controlador de entrada NGINX en Kubernetes

Ingreso es uno de los conceptos importantes en Kubernetes, que permite a los usuarios externos acceder a aplicaciones en contenedores usando FQDN (nombre de dominio completo). Aunque Ingress no está habilitado ni instalado de forma predeterminada en el clúster de Kubernetes. Debemos habilitar este concepto central utilizando controladores de ingreso de terceros como Nginx, Traefik, HAProxy e Istio, etc.

En este tutorial, demostraremos cómo configurar y usar el controlador NGINX Ingress en Kubernetes Cluster.

NGINX-Ingress-Controller-Kubernetes

Como se muestra en la imagen de arriba, los usuarios externos acceden a las aplicaciones mediante el controlador de entrada NGINX a través de FQDN y el controlador de entrada interno enruta la solicitud al servicio y luego el servicio enruta la solicitud a los puntos finales o pods del back-end.

Habilitar el controlador de entrada NGINX en Minikube

Minikube es un clúster de Kubernetes de un solo nodo, podemos habilitar fácilmente el controlador de entrada nginx en minikube ejecutando «complementos minikube” comando.

Ejecute el siguiente comando para verificar el estado del controlador de ingreso,

# minikube addons list

Minikube-complementos-estado-linux

Ejecute el siguiente comando minikube para habilitar el controlador de ingreso,

[[email protected] ~]# minikube addons enable ingress
* The 'ingress' addon is enabled
[[email protected] ~]#

Si volvemos a ejecutar el comando «lista de complementos de minikube», esta vez debemos ver que el estado de ingreso está habilitado.

Ejecute el siguiente comando kubectl para verificar si el pod del controlador de ingreso se está ejecutando o no.

[[email protected] ~]# kubectl get pods --all-namespaces | grep -i nginx-controller
kube-system      ingress-nginx-controller-7bb4c67d67-gkjj5    1/1     Running            0          20m
[[email protected] ~]#

El resultado anterior confirma que nginx-controller se habilitó e inició correctamente su pod en el espacio de nombres del sistema kube.

Configurar el controlador de entrada NGINX en el clúster de Kubernetes

Nota: Supongo que el clúster de Kubernetes está en funcionamiento.

Vaya al nodo maestro o al nodo del plano de control y ejecute el siguiente comando kubectl,

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml

Obtendremos la siguiente salida,

Kubectl-Deploy-NGINX-Ingress-Controller-Kubernetes

Ejecute el siguiente comando kubectl para verificar el estado de los pods del controlador nginx-ingress,

[email protected]:~$ kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-v7ftn        0/1     Completed   0          6m12s
ingress-nginx-admission-patch-njdnf         0/1     Completed   0          6m12s
ingress-nginx-controller-75f84dfcd7-p5dct   1/1     Running     0          6m23s
[email protected]:~$

Perfecto, el resultado anterior confirma que NGINX Ingress Controller se implementó con éxito y su pod se está ejecutando actualmente.

Controlador de ingreso de prueba

Para probar el controlador de ingreso, crearemos dos aplicaciones basadas en el contenedor httpd y nginx y expondremos estas aplicaciones a través de sus respectivos servicios y luego crearemos un recurso de ingreso que permitirá a los usuarios externos acceder a estas aplicaciones usando sus respectivas URL.

Implemente la implementación basada en httpd y su servicio con el tipo NodePort escuchando en el puerto 80. Cree el siguiente archivo yaml que incluye la sección de implementación y servicio.

[[email protected] ~]# vi httpd-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: httpd-deployment
  template:
    metadata:
      labels:
        run: httpd-deployment
    spec:
      containers:
      - image: httpd
        name: httpd-webserver

---
apiVersion: v1
kind: Service
metadata:
  name: httpd-service
spec:
  type: NodePort
  selector:
    run: httpd-deployment
  ports:
    - port: 80

Guarde y cierre el archivo.

Ejecute el comando kubectl para implementar por encima de la implementación basada en httpd y su servicio,

[[email protected] ~]# kubectl create -f httpd-deployment.yaml
deployment.apps/httpd-deployment created
service/httpd-service created
[[email protected] ~]#

Implemente nuestra próxima implementación basada en NGINX y su servicio con NodePort como su tipo y puerto como 80, el contenido del archivo yaml se enumera a continuación,

[[email protected] ~]# vi nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-deployment
  template:
    metadata:
      labels:
        run: nginx-deployment
    spec:
      containers:
      - image: nginx
        name: nginx-webserver

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    run: nginx-deployment
  ports:
    - port: 80

Guardar y salir del archivo

Ahora ejecute el siguiente comando kubectl para implementar por encima de la implementación basada en nginx y su servicio,

[[email protected] ~]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
[[email protected] ~]#

Ejecute el siguiente comando para verificar el estado de ambas implementaciones y sus servicios

[[email protected] ~]# kubectl get deployments.apps httpd-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
httpd-deployment   1/1     1            1           19m
[[email protected] ~]#
[[email protected] ~]# kubectl get deployments.apps nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           24m
[[email protected] ~]#
[[email protected] ~]# kubectl get service nginx-service httpd-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.103.75.91 <none> 80:30042/TCP 78m
httpd-service NodePort 10.98.6.131 <none> 80:31770/TCP 73m
[[email protected] ~]#

Crear e implementar recursos de ingreso

Cree el siguiente archivo yaml de recursos de entrada que enrutará la solicitud a la ruta o URL basada en el servicio respectivo. En nuestro ejemplo, usaremos url o fqdn.

[[email protected] ~]# vim myweb-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: name-based-virtualhost-ingress
spec:
  rules:
  - host: httpd.example.com
    http:
      paths:
      - backend:
          serviceName: httpd-service
          servicePort: 80

  - host: nginx.example.com
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80

Guarde y cierre el archivo.

Ejecute debajo del comando kubectl para crear el recurso de ingreso anterior,

[[email protected] ~]# kubectl create -f myweb-ingress.yaml
ingress.networking.k8s.io/name-based-virtualhost-ingress created
[[email protected] ~]#

Ejecute lo siguiente para verificar el estado del recurso de ingreso creado anteriormente

[[email protected] ~]# kubectl get ingress name-based-virtualhost-ingress
[[email protected] ~]# kubectl describe ingress name-based-virtualhost-ingress

Ingress-describir-ejemplo-linux

Perfecto, el resultado anterior confirma que los recursos de ingreso se crearon correctamente.

Antes de acceder a estas URL desde fuera del clúster, asegúrese de agregar las siguientes entradas en el archivo de hosts de su sistema desde donde pretendía acceder a ellas.

192.168.1.190                httpd.example.com
192.168.1.190                nginx.example.com

Ahora intente acceder a estas URL desde el navegador web, escriba

http://httpd.ejemplo.com

http://nginx.ejemplo.com

httpd-ingress-hosts-linux nginx-ingress-hosts-linux

Genial, lo anterior confirma que implementamos y configuramos con éxito el controlador de ingreso nginx en Kubernetes. Por favor, comparta sus valiosos comentarios y opiniones.

Entradas relacionadas

Deja una respuesta

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