6.2 Gestionando los services

Service de tipo NodePort

Para aprender cómo gestionamos los Services, vamos a trabajar con el Deployment de nginx (nginx-deployment.yaml) y el Service NodePort (nginx-srv.yaml) para acceder a los Pods de este despliegue desde el exterior.

Creamos el Deployment

El primer paso sería crear el Deployment de nginx:

kubectl apply -f nginx-deployment.yaml

Creamos el Service

A continuación vamos a crear el Service de tipo NodePort que nos permitirá acceder al servidor nginx.

kubectl apply -f nginx-srv.yaml

Para ver los Services que tenemos creado:

kubectl get services

Recuerda que si usamos kubectl get all también se mostrarán los Services.

Antes de acceder a la aplicación podemos ver la información más detallada del Service que acabamos de crear:

kubectl describe service/nginx
Name:                     nginx
...
Selector:                 app=nginx
Type:                     NodePort
...
IP:                       10.110.81.74
Port:                     service-http  80/TCP
TargetPort:               http/TCP
NodePort:                 service-http  32717/TCP
Endpoints:                172.17.0.3:80,172.17.0.4:80
...

Podemos ver la etiqueta de los Pods a los que accede (Selector). El tipo de Service (Type). La IP virtual que ha tomado (CLUSTER-IP) y que es accesible desde el cluster (IP). El puerto por el que ofrece el Service (Port). El puerto de los Pods a los que redirige el tráfico (TargetPort). Al ser un service de tipo NodePort nos da información del puerto que se asignado para acceder a la aplicación (NodePort). Y por último, podemos ver las IPs de los Pods que ha seleccionado y sobre los que balanceará la carga (Endpoints).

Accediendo a la aplicación

Vemos el Service que hemos creado:

kubectl get services
...
nginx        NodePort    10.110.81.74   <none>        80:32717/TCP   32s

Observamos que se ha asignado el puerto 32717 para el acceso, por lo tanto si desde un navegador accedemos a la IP del nodo master y a este puerto podremos ver la aplicación.

¿Cómo sé la dirección ip del nodo master del cluster minikube? Podemos ejecutar:

minikube ip
192.168.39.222

Y ya podemos acceder desde un navegador web:

Service ClusterIP

En esta ocasión vamos a desplegar una base de datos MariaDB. En este caso no vamos a necesitar acceder a la base de datos desde el exterior, pero necesitamos que los Pods de otro despliegue puedan acceder a ella. Por lo tanto vamos a crear un Service de tipo ClusterIP.

Para el despliegue de MariaDB vamos a usar el fichero mariadb-deployment.yaml. Puedes comprobar que en la definición del contenedor hemos añadido la sección env que nos permite establecer variables de entorno para configurar el contenedor (los estudiaremos en el siguiente módulo).

Para la creación del Service utilizamos el fichero mariadb-srv.yaml.

Para la creación del Deployment y el Service vamos ejecutando las siguientes instrucciones:

kubectl apply -f mariadb-deployment.yaml
kubectl apply -f mariadb-srv.yaml

Comprobamos el Service creado:

kubectl get services
mariadb      ClusterIP   10.106.60.233   <none>        3306/TCP       2m22s

kubectl describe service/mariadb
Name:              mariadb
...
Selector:          app=mariadb
Type:              ClusterIP
...
IP:                10.106.60.233
Port:              service-bd  3306/TCP
TargetPort:        db-port/TCP
Endpoints:         172.17.0.5:3306
...

Podemos comprobar que no se ha mapeado un puerto aleatorio para que accedamos usando la IP del nodo master. Los Pods que accedan a la IP 10.106.60.233 o al nombre mariadb y al puerto 3306 estarán accediendo al Pod (172.17.0.5:3306) del despliegue de mariadb.

Eliminando los servicios

Por ejemplo para borrar el servicio mariadb, ejecutaríamos:

kubectl delete service mariadb