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