Echt jetzt ohne zusätzliche Kosten von Zuhause mit allen Möglichkeiten wie in einer echten Cloud ?
jap !!! 😉
Was Du benötigst ist:
1 x Eigenen Rechner oder Laptop oder raspberry pi (4/5)
1 x Fritzbox mit Internet (gehen aber auch andere)
! ACHTUNG zu aller erst ein WARNUNG !
Ihr solltet Euch selbst auch ein wenig auskennen mit Netzwerk Konfiguration etc. den schließlich gebt ihr Euren Rechner / Server / Raspberry im Internet frei. Also aufgepasst !
Immer alle zugriffe mit SSH auf dem System absichern, gute Passwörter,und besten falls die Firewall mit iptables / ufw absichern , so dass nur noch Port 80 und 443 offen bleibt. auch gerne „fail2ban“ zusätzlich einrichten, gegen SSH attacken!
Die Anwendung der folgenden Schritte geschieht auf eigene Gefahr hin!
Fritzbox für den Zugriff auf Euren ziel Rechner einrichten zB extra Server oder Raspberry:
Legt Euch bei zB. https://ddnss.de/ eine eigene kostenlose Dyndns Adresse an.
Diese könnt ihr in der Fritzbox dann mit Dyndns Freigabe verknüpfen so das Eure IP des Internet Providers immer auf Eure Adresse zeigt und bei evtl. wechsel automatisch aktualisiert wird.
Die benötigten Login Daten werden Euch bei ddnss.de angezeigt!

In der Fritzbox solltet ihr unter Freigabe Euren Rechner freigeben, es reichen zu aller erst Port 80 und 443 !
Dieser Port wird dann mit Eurer neuen Dyndns Adresse erreichbar sein!

Wenn alles richtig gelaufen ist müsste Eure neue Dyndns Adresse jetzt auf Eure IP zeigen.
Kann auf der Fritzbox manchmal auch einen kleinen Moment dauern!
Testen könnt ihr das mit zB. nslookup <Eure-neue-dyndns-Adresse>
KIND Cluster und weitere benötigte Tools und konfigs anlegen:
Ich installiere zuerst einen KIND Cluster auf Docker Basis.
Ich gehe daher davon aus das ihr Docker bereits auf eurem System installiert habt!
Legt Euch für diverse folgenden Dateien ein eigenes Verzeichnis an zB. „Kind-Cluster“
Helm Package Manager installieren.
curl -o helm-v3.10.3-linux-amd64.tar.gz https://get.helm.sh/helm-v3.10.3-linux-amd64.tar.gzchmod 777 helm-v3.10.3-linux-amd64.tar.gztar -zxvf helm-v3.10.3-linux-amd64.tar.gzmv linux-amd64/helm /usr/local/bin/helmll /usr/local/bin/helmrm helm-v3.10.3-linux-amd64.tar.gz
Fügt Euch das „Kubnertes Repository“ hinzu für Centos oder Ubuntu je nach Eurem verwendeten Betriebssystem:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/enabled=1gpgcheck=1gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.keyEOF
Installiere das Command Line Tool „kubectl“, und die bash completion, falls nicht schon vorhanden:
yum updateyum install -y kubectlkubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/nullecho 'alias k=kubectl' >>~/.bashrcecho 'complete -o default -F __start_kubectl k' >>~/.bashrc
Installieren das KIND Packet:
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64chmod +x ./kindsudo mv ./kind /usr/local/bin/kind
Dann lege ich eine Konfiguration für den Kind Cluster an (minimalistisch one Node), könnt ihr gerne auf 3 erweitern. File-> kind-config
# wenn ihr mehr worker wollt nehm unten die Kommentare raus!
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
# - role: worker
# - role: worker
# - role: worker
Und jetzt den Cluster installieren und starten:
kind create cluster --config kind-config
Aber der stelle sollte der Kind Cluster laufen, gerne prüfen mit:
kubectl get all -A
Installieren den Cert-Manager:
kubectl create namespace cert-managerkubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.crds.yamlhelm repo add jetstack https://charts.jetstack.iohelm install my-release --namespace cert-manager --version v1.14.4 jetstack/cert-manager -f values.yaml
Ich empfehle für Letsencrypt zwei Config definition für „staging“ zum testen und danch „production“.
Staging ist wichtig, denn wenn bei dem Letsencrypt versuchen am Anfang etwas schief laufen sollte, lauft ihr nicht gleich in ein Rate Limit bei dem Letsencrypt Anbieter. Datei Anlegen -> clusterissuer.yaml
# clusterissuer.yaml
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-production
namespace: cert-manager
spec:
acme:
email: <Deine eMail>
privateKeySecretRef:
name: letsencrypt-production
server: https://acme-v02.api.letsencrypt.org/directory
solvers:
- http01:
ingress:
class: nginx
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
namespace: cert-manager
spec:
acme:
email: <Deine eMail>
privateKeySecretRef:
name: letsencrypt-staging
server: https://acme-staging-v02.api.letsencrypt.org/directory
solvers:
- http01:
ingress:
class: nginx
Tausche in der Datei <Deine eMail> mit Deiner EMail Adresse aus ohne dabei die Klammern zu belassen 😉
Die Datei muss auf dem Cluster mit kubectl apply-f clusterissuer.yaml ausgeführt / installiert werden.
Metallb installieren.
Das wichtigste von allem. Der metallb holt sich von deiner Fritzbox ein pool an IP’s prinzipiell nur eine 😉
Damit er dies tun kann benötigt er einen Scope Bereich welcher für die Fritzbox unten konform angegeben ist. Vergleiche deine Einstellungen in der Fritzbox und schau das diese mit deinen DHCP konform wären.
zb:

Datei anelgen -> values-metal.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.178.53-192.168.178.200
Metallb nun installieren mit
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yamlkubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yamlkubectl apply-f values-metal.yaml
nginx-webserver installieren:
Nun benötigen wir noch einen test nginx-webserver, den könnt ihr später gerne gegen Eure Rollouts von Applikationen austauschen. Datei anlegen -> test-deploy-service.yaml
# DEPLOYMENT
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: httpd
name: httpd
namespace: webserver
spec:
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- image: httpd:2.4.46
name: httpd
status: {}
# SERVICE
---
apiVersion: v1
kind: Service
metadata:
labels:
app: httpd
name: httpd
namespace: webserver
spec:
selector:
app: httpd
ports:
- port: 80
protocol: TCP
targetPort: 80
type: LoadBalancer
selector:
app: httpd
status:
loadBalancer: {}
Auch die Datei wieder mit kubectl apply -f test-deploy-service.yaml ausführen.
Jetzt noch eine Ingress Konfiguration Datei Ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpd-ingress
namespace: webserver
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
# cert-manager.io/cluster-issuer: "letsencrypt-production"
cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
tls:
- hosts:
- Deine.ddnss.org
- subdomain.Deine.ddnss.org
secretName: Deine.ddnss.org
rules:
- host: Deine.ddnss.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: httpd
port:
number: 80
- host: subdomain.Deine.ddnss.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: httpd
port:
number: 80
Vorher die Namen: subdomain mit einem Namen Deiner wahl austauschen.
Vorher auch den Namen „Deine“ gegen Deine Dyndns Adresse austauschen!
Auch die Datei wieder mit kubectl apply -f ingress.yaml ausführen.
Das sollte es gewesen sein.
Es sollten zwei Domains zu Verfügung stehen mit https.
Auch wenn die Domains noch als unsicher bemeckert werden so ist dies ein staging Zertifikat und normal!
Ihr könnt in der Config oben, den Kommentar von staging auf production wechseln, dann sollte es ein production Zertifikat geben.
Ein paar Befehle für die Analyse diverser Kubernetes Configs:
kubectl get clusterissuerkubectl describe clusterissuerkubectl get ingresskubectl describe ingresskubectl get svckubectl delete cert mywebsite-tls -n <cert_namespace>kubectl get certificate --all-namespaceskubectl describe issuer letsencrypt-stagingkubectl describe secret quickstart-example-tlskubectl describe certificaterequestkubectl describe orderkubectl describe challengekubectl get challengesshow logs=========kubectl -n cert-manager logs -f --tail 20 $(kubectl -n cert-manager get pod -l app=cert-manager -o jsonpath='{.items[0].metadata.name}')kubectl -n cert-manager logs $(kubectl -n cert-manager get pod -l app=cert-manager -o jsonpath='{.items[0].metadata.name}')HELM Commands=============helm search repo -lINSTALL Cert_amanger CLI========================OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o cmctl https://github.com/cert-manager/cmctl/releases/latest/download/cmctl_${OS}_${ARCH}chmod +x cmctlsudo mv cmctl /usr/local/bin