OpenHab auf einem Cluster installieren
Intro
Ich betreibe schon seit längerm einen OpenHab 3 auf einem RaspBerry 3B+. Leider hat einer meiner Schalter (SonoffPOW) beschlossen, doch lieber ein Grill werden zu wollen.
Kein Problem - einen Shelly 1PM hab ich noch herumliegen und installiere ich.
Long Story Short - ein Update meines Openhab hat den Raspberry in einem unbrauchbaren Zustand hinterlassen und ich brauchte bis 3 Uhr in der Früh bis alles wieder lief.
Das kann so nicht bleiben, jedes Mal einen Raspberry neu aufzusetzen, nur weil ein Update Script beschlossen hat, sudo nun einem Benutzer zu geben.
Einen Kubernetes Cluster mit 3 Raspberrys und 2 Intel PCs hab ich - also warum nicht darauf laufen lassen.
1. Versuch: Openhab am K8s Cluster
Openhab gibts ja glücklicherweise als multi-plattform container - noch dazu direkt vom Hersteller. Also kurz RTFM und dann auf meiner NAS eine neue NFS Freigabe mit dem sinnigen Namen “NFS” angelegt.
Start: ein eigener Namespace ist nie verkehrt
Anlegen eines Namespace in Kubernetes? Nichts leichter als das:
> kubectl create namespace openhab
Das war leicht - wie wir im FM (das ich R habe) - also weiter laut Anleitung.
Konfiguration und Daten dauerhaft speicher
zuerst brauchen wir mal ein Persistent Volume. openhab-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: openhab-nfs
namespace: openhab
spec:
storageClassName: openhab-nfs # same storage class as pvc
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
- ReadWriteMany
nfs:
server: <ip nas> # ip addres of nfs server
path: "/nfs" # path to directory
und dann gleich mal den Persistent Volume-Clame darauf:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: openhab
name: openhab-pvc-data
spec:
accessModes:
- ReadWriteMany
storageClassName: openhab-nfs
resources:
requests:
storage: 10Gi
… jaja ich weiß, dass man das auch in einem File erledigen könnte….
So! Weiter
Anlegen des Containers
Auf meinem NAS hab ich die User-ID 501 und würde die gerne weiter verwenden. Das würd mir die Config-Edits u.s.w. doch sehr erleichtern. (Deshalb die ENV-Einträge mit User-ID u.s.w.)
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: openhab
name: openhab
labels:
app: openhab
spec:
replicas: 1
selector:
matchLabels:
app: openhab
template:
metadata:
labels:
app: openhab
spec:
containers:
- name: openhab
image: openhab/openhab
resources:
limits:
memory: 2.0Gi
cpu: "2000m"
requests:
memory: 1.0Gi
env:
- name: USER_ID
value: '501'
- name: GROUP_ID
value: '100'
- name: LANG
value: 'en_US.UTF-8'
- name: LANGUAGE
value: 'en_US.UTF-8'
ports:
- containerPort: 8080
name: webinterface
protocol: TCP
- containerPort: 9125
name: xml-rpc
protocol: TCP
containerPort: 9126
name: bin-rpc
protocol: TCP
- containerPort: 8101
name: ssh
protocol: TCP
volumeMounts:
- name: openhab-data
mountPath: /openhab/userdata
subPath: openhab-k8s/openhab-data
- name: openhab-data
mountPath: /openhab/conf
subPath: openhab-k8s/openhab-conf
- name: openhab-data
mountPath: /openhab/addons
subPath: openhab-k8s/openhab-addons
livenessProbe:
initialDelaySeconds: 420
periodSeconds: 20
tcpSocket:
port: 8080
volumes:
- name: openhab-data
persistentVolumeClaim:
claimName: openhab-pvc-data
Die Ports 9125 und 9126 sind für meine HomeMatic Integration - sonst kann mir die CCU nichts mitteilen.
Schaut alles in allem schon recht gut aus - einen Service (eher 2 weil ich UDP und TCP nicht mischen darf) dazu und los gehts.
apiVersion: v1
kind: Service
metadata:
namespace: openhab
name: openhab-web
spec:
type: LoadBalancer
selector:
app: openhab
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: webinterface
- port: 8086
targetPort: 8086
protocol: TCP
name: influxdb
- port: 9001
targetPort: 9001
protocol: TCP
name: logviewer
- port: 9125
targetPort: 9125
name: xml-rpc
- port: 9126
targetPort: 9126
protocol: TCP
name: bin-rpc
- port: 22
targetPort: 8101
protocol: TCP
name: ssh
---
apiVersion: v1
kind: Service
metadata:
namespace: openhab
name: openhab-homematic-service
spec:
type: NodePort
selector:
app: openhab
ports:
- port: 9125
targetPort: 9125
protocol: UDP
name: xml-rpc
- port: 9126
targetPort: 9126
protocol: UDP
name: bin-rpc
Für daheim kann ich als LoadBalancer für Kubernetes MetalLB nur empfehlen.
Mit den Teilen oben kann OpenHab betrieben werden.
Anmerkung: Du brauchst auf jeden Fall noch einen MQTT-Broker, da dieser hier NICHT dabei ist. Empfehlen kann ich da Mosquitto - entweder auf dedizierter Hardware (z.B. Raspberry 1) oder im Docker.
Wie gehts weiter
Wie du den Logviewer (frontail) und einen persistence Service (influx) dazu reinkriegst, schreibe ich dann im nächsten Kapitel.