Kubernetes,  QNAP

Kubernetes. k0s – Añadir un LoadBalancer a motionEye

En el anterior Post, cree un DEPLOYMENT con la imagen de motioneye además del SERVICE que publicaba el POD. Este servicio (NodePort) expone el Deployment en un puerto del rango 30000-32767 en todos los nodos. Esta solución, aunque funcional no es la más adecuada.

Para mejorar el desarrollo voy a cambiar el service por un LoadBalancer, y así exponer el service con una única IP de entrada. El LoadBalancer lo proporciona normalmente un proveedor de nube, pero en este caso es necesario implementarlo en infraestructura propia.

En la guía de k0s se describe el proceso, que es muy sencillo y no va más allá de aplicar tres ficheros .yaml

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml

Los apply anteriores crean un NAMESPACE propio junto a los recursos necesarios. El tercer apply es un CONFIGMAP que describe el pool de IPs disponibles para MetalLB.

$ kubectl apply -f metallb-configmap.yaml

$ cat metallb-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
  address-pools: 
  - name: default 
    protocol: layer2 
    addresses: 
    - 192.168.2.210-192.168.2.215

El SERVICE modificado quedaría tal que así. He cambiado el tipo a LoadBalancer indicándole además la IP que debe utilizar. Al tener identificada está IP ya podemos además publicarla siendo destino de una regla NAT.

apiVersion: v1
kind: Service
metadata:
name: motioneye
namespace: motioneye
labels:
  app: motioneye 
spec:
  type: LoadBalancer
  loadBalancerIP: 192.168.2.210
  ports:
  - port: 8765
    targetPort: 8765 
  selector:
    app: motioneye 

Si consultamos los recursos que se han creado se puede ver.

$ kubectl get all -n metallb-system
NAME READY STATUS RESTARTS AGE
pod/controller-6bfbdc89d9-78rjz 1/1 Running 5 (2d1h ago) 17d
pod/speaker-fgj6t 1/1 Running 4 (2d1h ago) 17d
pod/speaker-xhvtn 1/1 Running 4 (2d1h ago) 17d

NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/speaker 2 2 2 2 2 kubernetes.io/os=linux 17dNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/controller 1/1 1 1 17d

NAME DESIRED CURRENT READY AGE
replicaset.apps/controller-6bfbdc89d9 1 1 1 17d
$