Kubernetes,  QNAP

Kubernetes. k0s – Migrando motioneye al nuevo cluster

El primer servicio que voy a migrar al cluster de kubernetes (k0s) va a ser el de gestión de cámaras IP.

Para implementar de manera básica esta nueva APP es necesario: un DEPLOYMENT y un SERVICE. A continuación pego lo primero.

$ cat motioneye-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: motioneye
spec:
  replicas: 1
  selector:
    matchLabels:
      app: motioneye
  template:
    metadata:
      labels:
        app: motioneye
    spec:
      volumes:
      - name: nfs-motioneye-etc
        nfs:
          server: servidor-nfs
          path: /DPVs/motionEye/etc
          readOnly: no
      - name: nfs-motioneye-var-lib
        nfs:
          server: servidor-nfs
          path: /DPVs/motionEye/var-lib
          readOnly: no
      - name: localtime
        hostPath:
          path: "/etc/localtime" 
      containers:
      - name: motioneye-container
        image: ccrisan/motioneye:master-amd64
        ports:
        - containerPort: 8765
          protocol: TCP
          name: "server"
        volumeMounts:
        - mountPath: "/etc/motioneye"
          name: nfs-motioneye-etc
        - mountPath: "/var/lib/motioneye"
          name: nfs-motioneye-var-lib
        - mountPath: "/etc/localtime"
          name: localtime
        env:
        - name: hostname
          value: "CAMARAS"
$

Sin entrar en mucho detalle en este fichero se está definiendo:

  • Que imagen de Docker vamos a utilizar. En DockerHUB tenemos disponible la imagen ccrisan/motioneye que se descargará para levantar los contenedores en los WORKERs.
  • Que puerto utiliza el POD. En este caso el predeterminado de motioneye –> 8765.
  • Qué volúmenes se van a utilizar. En concreto un volumen /etc/motioneye con toda la configuración, y /var/lib/motioneye con las grabaciones de las cámaras. Con estos dos volúmenes se consigue la persistencia de configuración y datos. Los volúmenes nfs proporcionan la opción más básica para el almacenamiento y delegan en otro servidor esta parte que implica mucha complejidad.

El SERVICE a continuación.

$ cat motioneye-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: motioneye-service
  labels:
    app: motioneye
spec:
  type: NodePort
  ports:
    - port: 8765
      nodePort: 32280
  selector:
    app: motioneye
$

De nuevo sin entrar en detalle, en el archivo anterior se define un servicio de tipo NodePort que publica la aplicación motioneye en un puerto alto. Aunque es una opción rápida y sencilla no parece que sea la mejor opción. Por el momento se va a quedar así.

Si ponemos en un navegador http://192.168.2.72:32280 o http://192.168.2.73:32280 aparece la APP configurada.

Los PODs necesitan para funcionar que estén habilitados ciertos módulos del kernel así como cierta paquetería (nfs-common). Para asegurar estas características en los WORKERs ejecuto lo siguiente. Al igual que el SERVICE tiene que existir una forma más elegante de realizar esta operativa, pero por el momento y teniendo en cuenta que solo se ejecuta una vez, se quedará así.

Primero obtengo la información de las direcciones de los WORKERs.
$ kubectl get nodes -o custom-columns='IP:.status.addresses'
IP
[map[address:192.168.2.72 type:InternalIP] map[address:k0s-node-1 type:Hostname]]
[map[address:192.168.2.73 type:InternalIP] map[address:k0s-node-2 type:Hostname]]

Jugando un poco obtengo únicamente las IPs.
$ kubectl get nodes -o custom-columns=':.status.addresses[?(@.type=="InternalIP")].address' --no-headers
192.168.2.72
192.168.2.73

Instalo los paquetes necesarios en los WORKERs.
$ for i in `kubectl get nodes -o custom-columns=':.status.addresses[?(@.type=="InternalIP")].address' --no-headers`; do ssh $i sudo apt install -y nfs-common; done

A falta de mejorar la recientemente migrada APP – motioneye, queda inaugurado el clúster de Kubernetes (k0s).