- Kubernetes. Servicio motionEye en Kubernetes. Servicio publicado con NodePort.
- Kubernetes. Servicio motionEye en Kubernetes. Servicio publicado con LoadBalancer.
- Kubernetes. Servicio motionEye en Kubernetes. Servicio publicado con Ingress.
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).