Saltar al contenido principal

Gestionando los Services

Service de tipo NodePort

Para aprender cómo gestionar los Services, trabajaremos 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.

Archivos de configuración

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: contenedor-nginx
ports:
- name: http
containerPort: 80

nginx-srv.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- name: service-http
port: 80
targetPort: 80
selector:
app: nginx

Creación del Deployment

El primer paso es crear el Deployment de nginx utilizando el siguiente comando:

kubectl apply -f nginx-deployment.yaml

Creación del Service

A continuación, creamos el Service de tipo NodePort para acceder al servidor nginx desde fuera del cluster:

kubectl apply -f nginx-srv.yaml

Para ver los Services creados, ejecutamos:

kubectl get services

Recuerda que si usamos kubectl get all, también se mostrarán los Services junto con otros recursos.

Para obtener información detallada del Service creado, ejecutamos:

kubectl describe service/nginx

El resultado será algo similar a esto:

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

Detalles importantes:

  • Selector: La etiqueta de los Pods a los que accede.
  • Type: El tipo de Service, en este caso NodePort.
  • IP: La IP virtual (CLUSTER-IP) accesible desde el cluster.
  • Port: El puerto por el que el Service ofrece acceso.
  • TargetPort: El puerto de los Pods a los que redirige el tráfico.
  • NodePort: El puerto asignado para acceder a la aplicación desde fuera del cluster.
  • Endpoints: Las IPs de los Pods seleccionados para balancear la carga.

Acceso a la aplicación

Para ver el Service creado, ejecutamos:

kubectl get services

El resultado será algo similar a esto:

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 accedemos a la IP del nodo master y a este puerto desde un navegador, podremos ver la aplicación.

Para conocer la dirección IP del nodo master del cluster minikube, ejecutamos:

minikube ip

El resultado será algo similar a esto:

192.168.39.222

Podemos acceder desde un navegador web utilizando la IP y el puerto asignado.

Service ClusterIP

En esta ocasión, desplegaremos una base de datos MariaDB. No necesitamos acceder a la base de datos desde el exterior, pero sí que los Pods de otro despliegue puedan acceder a ella. Por lo tanto, crearemos un Service de tipo ClusterIP.

Archivos de configuración

mariadb-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-mariadb
labels:
app: mariadb
type: database
spec:
replicas: 1
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
type: database
spec:
containers:
- name: contenedor-mariadb
image: mariadb
ports:
- name: db-port
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: my-password

mariadb-srv.yaml

apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
type: ClusterIP
ports:
- name: service-bd
port: 3306
targetPort: db-port
selector:
app: mariadb

Creación del Deployment y el Service

Para crear el Deployment y el Service, ejecutamos las siguientes instrucciones:

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

Comprobamos el Service creado con:

kubectl get services

El resultado será algo similar a esto:

mariadb      ClusterIP   10.106.60.233   <none>        3306/TCP       2m22s

Para ver más detalles del Service, ejecutamos:

kubectl describe service/mariadb

El resultado será algo similar a esto:

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 observar que no se ha mapeado un puerto aleatorio para el acceso externo. 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.

Eliminación de los servicios

Para borrar un servicio, por ejemplo, el servicio mariadb, ejecutamos:

kubectl delete service mariadb