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.
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
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,
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
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
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.