Skip to content

Öffne nochmal den Bifröst – Heimdall Dashboard in Kubernetes betreiben

In einem älteren Artikel habe ich gezeigt, wie man das beliebte Heimdall Dashboard mit wenig Aufwand auf Docker betreibt. Aus reinem Interesse wollte ich Heimdall auf meinen Kubernetes Cluster umziehen und anschließend mit einem offiziellen Let’s Encrypt Zertifikat signieren.

Vorweg, wer einen unkomplizierten Weg sucht, der ist mit der Konfiguration von Heimdall auf Docker bestens beraten. Die könnt ihr hier finden.

Sämtliche Manifeste aus diesem Artikel könnt ihr in meinem Github Repository finden und einfach per kubectl -k overlays/dev/ anwenden. Hier beschäftigen wir uns mit den einzelnen Schritten um Heimdall aufzusetzen.

Zu Beginn erstellen wir uns ein Manifest, dass später den Namespace heimdall erstellen wird.

apiVersion: v1
kind: Namespace
metadata:
  name: heimdall

Nun ein PersistentVolumeClaim, in dem die Heimdall Konfiguration abgelegt wird. Ich habe hier keine definierte Storage Klasse angegeben. Es wird also die als default markierte Klasse verwendet. Abhängig davon, welche Storage Klasse ihr verwenden wollt, sind hier noch weitere Angaben notwendig (bspw. bei NFS). Solltet ihr weitere Informationen oder Anleitungen für Storage Klassen benötigen, könnt ihr sie in einem anderen Blog Artikel hier finden.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: heimdall-pvc
  namespace: heimdall
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Anschließend erstellen wir das Manifest für das eigentliche Heimdall deployment.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: heimdall 
  namespace: heimdall
  labels:
    app: heimdall
spec:
  replicas: 1
  selector:
    matchLabels:
      app: heimdall
  template:
    metadata:
      labels:
        app: heimdall
    spec:
      volumes:
      - name: heimdall
        persistentVolumeClaim:
          claimName: heimdall-pvc
      containers:
      - image: ghcr.io/linuxserver/heimdall:2.2.2
        name: heimdall
        imagePullPolicy: Always
        env:
        - name: PGID
          value: "1000"
        - name: PUID
          value: "1000"
        - name: TZ
          value: Europe/Berlin
        ports:
         - containerPort: 80
           name: http-80
           protocol: TCP
         - containerPort: 443
           name: https-443
           protocol: TCP
        volumeMounts:
         - mountPath: /config
           name: heimdall
           subPath: config

Wie ihr seht, referenzieren wir das weiter oben erstelle PersistentVolumeClaim. Kommen wir zu dem Service Objekt, dass wir erstellen wollen.

apiVersion: v1
kind: Service
metadata:
  name: heimdall-service
  namespace: heimdall
spec:
  selector:
    app: heimdall
  ports:
    - name: http-80
      protocol: TCP
      port: 80
    - name: https-443
      protocol: TCP
      port: 443

Und zu guter letzt noch die magische Soße. Eine Ingress Regel, die auf einen definierten Hostnamen (im Beispiel heimdall.mydomain.de) hört und den Traffic an den oben definierten Heimdall Service weiterleitet. Solltet ihr den cert-manager installiert haben (siehe hier für eine Anleitung dazu), wird dieser euch ein signiertes Zertifikat von Let’s Encrypt beschaffen. Achtet bitte darauf, für die ersten Tests den Clusterissuer letsencrypt-production gegen letsencrypt-staging (oder wie er auch immer in eurem Cluster heißt) auszutauschen. Ansonsten lauft ihr Gefahr, in die Rate Limits von Let’s Encrypt zu laufen. Wenn alles zu eurer Zufriedenheit funktioniert, könnt ihr problemlos den Zertifikatsaussteller ändern. Solltet ihr kein Zertifikat wünschen, entfernt einfach die Annotation für den cert-manager.

Die Beispieldomain heimdall.mydomain.de müsst ihr gegen den von euch gewünschten DNS Namen austauschen. Um Heimdall unter dem konfigurierten DNS Namen erreichen zu können, müsst ihr einen entsprechenden A-Record in eurem DNS Server hinterlegen.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: heimdall
  namespace: heimdall
  annotations:
    kubernetes.io/ingress.class: "nginx"    
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
#    cert-manager.io/cluster-issuer: "letsencrypt-production"
    cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
  tls:
  - hosts:
    - heimdall.mydomain.de
    secretName: heimdall.mydomain.de
  rules:
  - host: heimdall.mydomain.de
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: heimdall-service
            port:
              number: 443

Solltet ihr nicht Nginx als Ingress Controller verwenden, müsst ihr natürlich die Annotation hierzu anpassen.

Habt ihr alle Manifeste erstellt, könnt ihr diese mit folgendem Befehl auf eurem Cluster deployen.

kubectl apply -f .

Nach kurzer Zeit solltet ihr alle erstellten Ressourcen auf eurem Cluster finden. Achtet besonders auf die certificate und certificaterequest Ressource sowie das Logfile des Heimdall Pods selbst.

Philip

Leave a Reply

Your email address will not be published. Required fields are marked *