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.