En kubernetes la vida de un Pod es muy dinámica. Los Pods se crean y destruyen constantemente en un clúster de Kubernetes, por lo que el acceso entre aplicaciones no se puede basar en la IP de los Pods.
De alguna manera, es necesario tener un endpoint permanente que de acceso a un conjunto de Pods.
Esta es la función de un Service. Un Service se asocia a un conjunto de Pods. Cada Service tiene un endpoint de acceso fijo que se corresponde con su nombre (aunque también podríamos acceder a él vía un Load Balancer externo o un ingress).
Por tanto, cada vez que accedamos por DNS a nombre de un servicio, el servicio redirigirá la petición a uno de los Pods a los que está asociado, ofreciendo un mecanismo eficaz de service discovery y de balanceo de carga.
Los diferentes tipos de servicio que tenemos son ClusterIP, NodePort (30000:32767) y LoadBalancer.
Tipos de servicios
ClusterIP: Solo permite el acceso interno entre distintos servicios. Es el tipo por defecto. Podemos acceder desde el exterior con la instrucción kubectl proxy.

NodePort: Abre un puerto, para que el servicio sea accesible desde el exterior. Por defecto el puerto generado está en el rango de 30000:32767. Para acceder usamos la ip de los servidores workers del cluster y el puerto asignado.

LoadBalancer: Este tipo sólo esta soportado en servicios de cloud público (GKE, AKS o AWS). El proveedor asignara un recurso de balanceo de carga para el acceso a los servicios, para un entorno Kubernetes on Premise/Bare Metal, podemos utilizar el proyecto MetalLB
.

Esqueleto YAML de un service
Podemos describir la estructura de un service en un fichero con formato yaml, por ejemplo el fichero service.yaml:
kind: Service
apiVersion: v1
metadata:
name: service
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
nodePort: 30305
Donde indicamos:
- apiVersion: v1: La versión de la API que vamos a usar.
- kind: Service: La clase de recurso que estamos definiendo.
- metadata: Información que nos permite identificar unívocamente al recurso.
- spec: Definimos las características del recurso. En el caso de un service de tipo nodePort, que abrira en nuestros workers, el puerto 30305, para balancear contra todos los pods que tengan como label el valor app=nginx.
Para lanzar el Service ejecutamos:
kubectl apply -f service.yaml
Y si hacemos:
kubectl get service





