Services & Endpoints

Servicios & endpoints

El objeto services es el encargado de balancear la carga entre los diferentes pods, esto lo hace a trabes de los labels para identificar a que pods de estar observando, no importa si esos pods están en un replicaset u otro, solo mira labels de pods y hay que tener en cuenta eso.

El balanceo de carga sirve (en el caso de una web ) para aumentar las peticiones que puede llegar a recibir al mismo tiempo, ya que se distribuirán entre los múltiples pods en vez de uno solo. es decir un cliente hace la petición a una ip y el objeto services se encarga a redirigir esa petición al pod indicado.

El endpoint de un servicio es el encargado de guardar la lista de ip's de los pods a consultar, en el caso de que un pod muera y se arranque otro, borrara la ip del pod muerto y añadirá la del pod nuevo.

Un servicio siempre esta asociado a una serie de pods, por lo tanto creo un deployment con pods nginx y lo asocio a el servicio, en el que expongo el puerto 80 de los pods al 8080 de la ip virtual del servicio.

Ejemplo de servicio:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-test
  labels:
    app: front-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: front-nginx
  template:
    metadata:
      labels:
        app: front-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: front-nginx
spec:
  type: ClusterIP
  selector:
    app: front-nginx
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80

Desplegar servicio.

sudo kubectl apply -f service/service.yaml  
deployment.apps/deployment-test created
service/my-service created

sudo kubectl get svc -l app=front-nginx
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
my-service   ClusterIP   10.99.212.24   <none>        8080/TCP   93s

Descripción del servicio, donde se ve que a creado su endpoint, con las ips de los pods que balanceará la carga.

# descripción del servicio creado
sudo kubectl describe service my-service
Name:              my-service
Namespace:         default
Labels:            app=front-nginx
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"front-nginx"},"name":"my-service","namespace":"default"}...
Selector:          app=front-nginx
Type:              ClusterIP
IP:                10.99.212.24
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         172.17.0.4:80,172.17.0.5:80,172.17.0.6:80
Session Affinity:  None
Events:            <none>

# crea automaticamente su endpoint
sudo kubectl get endpoints
NAME         ENDPOINTS                                   AGE
kubernetes   192.168.88.2:8443                           9d
my-service   172.17.0.4:80,172.17.0.5:80,172.17.0.6:80   7m31s

# pods con ip asociadas al deployment
sudo kubectl get pods -o wide
NAME                              READY   STATUS    RESTARTS   AGE     IP           NODE   NOMINATED NODE   READINESS GATES
deployment-test-5699757d6-77ps4   1/1     Running   0          8m18s   172.17.0.5   pc02   <none>           <none>
deployment-test-5699757d6-kk96q   1/1     Running   0          8m18s   172.17.0.6   pc02   <none>           <none>
deployment-test-5699757d6-xb2rc   1/1     Running   0          8m18s   172.17.0.4   pc02   <none>           <none>

Tipos de servicios

clusterip es la opción por defecto y consiste en una ip virtual que se le asigna al servicio, esta ip es interna, es decir desde mi ip local no podre ver el servicio, solo podre ver mi servicio indicando localmente la ip virtual que se le a añadido a dicho cluster.

nodeport es una capa superior a clusterip, y proporciona una redirección a la ip local del host ( a localhost no, solo la local ). por defecto asigna un puerto aleatorio entre el rango 30000-32767 , a no ser que se le indique manualmente en que puerto salir, eso si, entre el rango permitido de 30000-32767.

En el siguiente ejemplo se ve como a redireccionado automáticamente al puerto local 30425 .

sudo kubectl get svc                      
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP          9d
my-service         ClusterIP   10.99.212.24   <none>        8080/TCP         57m
my-service-nginx   NodePort    10.99.15.134   <none>        8080:30425/TCP   20m

Ejemplo de nodeport con redirección manual de puerto local

apiVersion: v1
kind: Service
metadata:
  name: my-service-nginx
  labels:
    app: backend-nginx
spec:
  type: NodePort
  selector:
    app: backend-nginx
  ports:
    - protocol: TCP
      nodePort: 30001
      port: 8080
      targetPort: 80

LoadBalancer Ee un tipo de balanceador de carga desarrollado para el cloud, este servicio estaría funcionando en la nube y balancea la carga a diferentes nodos, donde cada nodo se crea automaticamente su NodePort y ClusterIp