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