Für die Verwaltung von Zertifikaten wird in der Regel der cert-manager eingesetzt.
dieser kann eine lokale CA benutzen um eigene Zertifikate zu erstellen, aber auch per ACME - Protokoll erreichbare Zertifizierer wie z. B. Let’s Encrypt.
Werden die Zertifizierer als Issuer für einzelne Namespaces erstellt, können sie auch nur in den Namespaces benutzt werden.
Für die globale Nutzung gibt es den ClusterIssuer, der im gesamten Cluster verfügbar ist.
Für die Installation muss zunächst der flux Client installiert sein.
curl -s https://fluxcd.io/install.sh | sudo bash
Bei Benutzung eines GitLab wird ein Access Token mit Schreibrechten auf das Repository oder die Gruppe benötigt. Sinnvollerweise kann dieser in der Datei $HOME/.gitlab hinterlegt sein.
Danach kann flux mit den benötigen Umgebungswerten gestartet werden.
exportGITLAB_TOKEN="$(<.gitlab)"exportGITLAB_HOSTNAME="git.mylinuxtime.de"exportGITLAB_OWNER="kubernetes/flux"# GitLab Gruppe für das RepositoryexportGITLAB_REPOSITORY="prod-kube"# Repository in der GruppeexportGITLAB_BRANCH="main"# zu benutzender BranchexportGITLAB_PATH="prod"# Pfad innerhalb des Repositoriesflux bootstrap gitlab --owner $GITLAB_OWNER\
--repository $GITLAB_REPOSITORY\
--branch $GITLAB_BRANCH\
--path $GITLAB_PATH\
--token-auth \
--hostname $GITLAB_HOSTNAME
Es wird automatisch das benötigte Repository angelegt und die Dateien für flux abgelegt.
Im Cluster werden die benötigten CRDs und Deployments angelegt und gestartet.
Update
Ob eine neuere Version für ein Update zur Verfügung steht kann über das
Subkommando check geprüft werden.
Der Cert-Manager ist eine Verwaltungskomponente für
Zertifikate innerhalb eines Kubernetes Clusters.
Erst mit dem Cert-Manager ist es möglich Zertifikate zu erstellen, verwalten und
löschen. Der Cert-Manager bringt über CRDs eigene Objekte für die Verwaltung mit
Installation
Die einfachste Installation kann direkt über Helm erfolgen.
Typischerweise wird für den Cert-Manager ein eigener Namespace (cert-manager)
angelegt.
Bei einem extern erreichbaren Webserver soll neben der Konfiguration eines
Ingress mit nginx auf Port 80 auch ein Zugang über https (Port 443) ermöglicht
werden.
Dazu bedarf es eines Zertifikats von einer Trusted-CA. Bei extern erreichbaren
Webseiten bietet sich dafür z. B. Let’s Encrypt
an.
Issuer
Um bei Let’s Encrypt Zertifikate abholen zu können bedarf es zunächst eines
Issuers über diese Objekt wir die Anmeldung an Let’s Encrypt durchgeführt. Die
gespeicherte Anmeldung dient später auch als Berechtigung die Zertifikate zu
beantragen.
Der Issuer wird im gleichen Namespace wie der spätere Ingress angelegt.
Sobald das Objekt erstellt ist, wird die Anmeldung durchgeführt. Der Status ist
im status des Ingress Objekts sichtbar.
Ingress
Um einen Webserver per https erreichbar zu machen, wird zusätzlich zu der
normalen Konfiguration ein Abschnitt spec.tls benötigt in dem der SNI
spec.tls.hosts[] und der Name eines Secrets für das Zertifikat angegeben wird.
Damit der Cert-Manager sich um das Zertifikat kümmert muss eine Annotation
cert-manager.io/issuer: angelegt werden, in die der Name des zu benutztenden
Issuers angegeben wird.
Nach Anlegen des Objekts sorgt der Cert-Manager für die Erzeugung des Privaten
Schlüssels und eines Certificate Sign Requests (CSR). Den CSR sendet er zur
Validierung an den über den Issuer angegeben Dienst und sorgt sich um die
Kommunikation mit diesem um das Zertifikat zu holen. Sobald es vorliegt wird es
in dem unter secretName angegebenen Secret zusammen mit dem Key abgelegt und
steht für den Ingress zu Verfügung. Dieser baut das Zertifikat - sobald es
vorhanden ist - ein und stellt die Domain per https zur Verfügung.
ClusterIssuer
Der Issuer steht immer nur in dem Namespace in dem er angelegt wurde zur
Verfügung. Um einen Issuer auch über die Namespaces hinweg benutzen zu können
gibt es den ClusterIssuer.
Dieser wird - in der Regel - Im Namespace des Cert-Manager abgelegt, kann aber -
solang es keine RBAC Einschränkungen gibt - aus allen Namespaces benutzt werden.
Das Tool
kubectl wird
für die direkte Kommunikation mit einer Kubernetes API benötigt.
Um mit der API kommunizieren zu können wird eine Konfigurationsdatei benötigt
(KUBECONFIG) in der die Informationen zur API, wie die Adresse, Benutzer,
Kennwort oder Zertifikate enthalten sind. Die Konfigurationdatei wird in der
Regel in der Datei ~/.kube/config abgelegt. Alternativ kann die
Umgebungsvariable KUBECONFIG gesetzt werden um eine alternative
Konfigurationsdatei angeben zu können.
KUBECONFIG Dateien zusammenfassen
Statt mehrere Konfigurationsdateien zu führen ist es Sinnvoll die
Konfigurationsdaten in eine Datei zusammen zu fassen.
Auf Grund des Formats können die Dateien nicht einfach zusammenkopiert werden.
Die einzelnen Daten müssen in die jeweiligen Sektionen der Konfigurationdatei
verteilt werden.
Mit dem folgenden Workflow ist es möglich dies teilweise zu automatisieren.
Erstellen einer Kopie der aktuellen Konfigurationsdatei (es wird von
~/.kube/config ausgegangen)
Setzen der Variable KUBECONFIG auf die kopierte Datei und die neue Datei
(/tmp/kube_config). Weitere Dateien können durch Doppelpunkt getrennt
angegeben werden
Ausgeben der Kopie und der zusätzlichen Datei, oder Dateien über kubectl in
die Datei ~/.kube/config.
podman und auch kubectl müssen ebenfalls installiert und konfiguriert sein.
Einrichtung des Clusters
Der einfachste Weg den Cluster einzurichten geht über das systemctl-run Kommando. Hierbei übernimmt der systemd die Kontrolle über die Umgebung für Umgebung in der der podman Befehl läuft.
$ systemd-run -p Delegate=yes --setenv=KIND_EXPERIMENTAL_PROVIDER=podman \
--scope --user kind create cluster
Running as unit: run-rc08baccf7a724130a9284623ccd2ddf9.scope; invocation ID: 0fb8f6ec97a94f5782bbfc3f0f78a3ae
using podman due to KIND_EXPERIMENTAL_PROVIDER
enabling experimental podman provider
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.27.3) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"You can now use your cluster with:
kubectl cluster-info --context kind-kind
Thanks for using kind! 😊
Nach dieser Installation kann direkt über das kubectl Kommando ein Zugriff auf die Kubernetes Node erfolgen.
$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:34125
CoreDNS is running at https://127.0.0.1:34125/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Dazu wurde die Datei $HOME/.kube/config um den Context kind-kind erweitert oder eine neue Datei erzeugt.
Genauere Informationen über den laufenden Cluster Node lassen sich über kubectl cluster-info dump abrufen.
Cluster Konfiguration
Statt den Cluster mit einer Default Konfiguration zu starten, kann man eine yaml Datei mit passenden Werten zur Erzeugung nutzen.
Beispiele:
# three node (two workers) cluster configkind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-plane- role:worker- role:worker
# six node (three workers) full cluster configkind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-plane- role:control-plane- role:control-plane- role:worker- role:worker- role:worker
Die erstellten yaml Dateien sind bei der Erstellung des Clusters anzugeben.
Für den manuellen Eintrag wird die komplette Zertifikatskette ohne das
root-Zertifikat in einer Datei und der Key in einer anderen Datei benötigt.
Beide müssen im PEM - Format vorliegen.
Sollten die Intermediate Zertifikate und das eigentliche Zertifikat nicht in
einer Datei sein, dann lassen sich diese per cat Befehl zusammenfügen.
Der hinter tls.crt und tls.key angegebene Text entspricht dem Inhalt der
Zertifikats- und Key-Datei in einer mit base64 ummantelten Version ohne
Zeilenumbrüche.
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
List all pods with custom outout
kubectl get pod -A -o=custom-columns=POD_NAME:.metadata.name,STATUS:.status.phase,NAMESPACE:.metadata.namespace,CONTAINER_NAME:.spec.containers[*].name
List all pods in a namespace
kubectl get pods -n <namespace>
List all pods not in the running state
kubectl get pods -n <namespace> --field-selector "status.phase!=Running"
Über das Dashboard lassen sich die Informationen über den Cluster visualisieren
und anpassen. Sobald ein metrics-server im Cluster existiert, kann man auch die
Metriken visualisieren.
Bevor du mit der Installation von Kubeadm beginnst, musst du dein Rocky Linux 9
System vorbereiten. Du musst sicherstellen, dass bestimmte Pakete und
Abhängigkeiten installiert und die Systemeinstellungen korrekt sind.
Setzen des korrekten Hostnamens
Der folgenden Befehl setzt den Hostnamen des Systems auf seine eigene IP
Adresse über den Dienst ip.dynlinux.io
Dieser Befehl stellt sicher, dass alle Systempakete auf dem neuesten Stand sind.
Deaktivieren von SELinux
Kubernetes erfordert die Deaktivierung von SELinux, um ordnungsgemäß zu
funktionieren. Du kannst dies tun, indem du die Konfigurationsdatei bearbeitest.
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
Nach der Deaktivierung über die Konfigurationsdatei muss das System neu
gestartet werden.
Alternativ kannst du es auch temporär deaktivieren
sudo setenforce 0
Deaktivieren der Firewall
Die Firewall kann den Netzwerkverkehr zwischen den Kubernetes-Komponenten
blockieren. Deaktiviere sie, um mögliche Probleme zu vermeiden:
sudo tee /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
EOFsudo modprobe br_netfilter
Installation von Containerd
Containerd ist die Container-Laufzeitumgebung (Container Runtime), die von
Kubernetes benötigt wird, um Container zu starten und zu verwalten. Kubernetes
verwendet die Container Runtime Interface (CRI), um mit der
Container-Laufzeitumgebung zu interagieren.
Dieser Befehl installiert die drei Hauptkomponenten:
kubelet: Der Agent, der auf jedem Knoten läuft und die Kommunikation mit dem
Control Plane übernimmt.
kubeadm: Das Tool zum Bootstrapping des Clusters.
kubectl: Das Befehlszeilentool zur Interaktion mit dem Cluster.
Initialisierung des Control-Plane-Knotens
Jetzt kannst du den Control-Plane-Knoten (Master-Knoten) initialisieren. Dies
ist der wichtigste Schritt, da er das Herzstück deines Kubernetes-Clusters
bildet.
Der Parameter –pod-network-cidr ist wichtig, da er das Netzwerk-Subnetz für die
Pods festlegt. Der Wert 10.244.0.0/16 ist der Standard, der von vielen
CNI-Plugins wie Flannel verwendet wird.
Starten und Aktivieren des Kubelet-Dienstes
sudo systemctl enable --now kubelet
Konfigurieren des Benutzers für kubectl
Nach der erfolgreichen Initialisierung musst du kubectl für den aktuellen
Benutzer konfigurieren, um Befehle ausführen zu können:
Nach der Installation kannst du den Status der Pods überprüfen
kubectl get pods --all-namespaces
Erlaube pods auf der Control Plane
Auf der Control Plane solltest du keine Pods, die nicht zur Control Plane
gehören - laufen lassen. Dies kann zu einer Instabilität der Control Plane
führen.
Für Test-Setups ist es möglich auch auf der Control Plane Pods laufen zu
lassen
Um weitere Control Plane-Knoten zu erstellen musst du zunächst die
Zertifikatsdaten des Clusters ein Kubernetes Secret speichern. Dazu führst du
auf einem existierenden Conntrol Plane-Knoten den folgenden Befehl aus.
⚠️ Dieser Schritt ist für das Hinzufügen eines Workers nicht notwendig.
Der Certificate Key Name aus der Ausgabe des vorherigen Befehls wird für den
kubeadm join benötigt. Der restliche Aufruf wird mit dem folgenden Befehl
ausgegeben auf dem bestehenden Control Plane-Knoten.
sudo kubeadm token create --print-join-command
Den Ausgegebenen Befehl musst du nun um die Parameter --control-plane und
--certificate-key <certificate-key-string> erweitern und auf dem neuen
Control Plane-Knoten ausführen.
Kubeadm gibt dir nach der Initialisierung einen kubeadm join-Befehl aus. Du
musst diesen Befehl auf den Worker-Knoten ausführen, um sie dem Cluster
hinzuzufügen.
Diese Befehle erstellen ein Deployment für eine Nginx-Webserver-Anwendung und
legen einen Service vom Typ NodePort an, um die Anwendung über eine externe
IP-Adresse zugänglich zu machen.
Pods sind in Kubernetes die Umgebung in der ein oder mehrere Container gestartet werden können. Container können nicht ohne einen umgebenden Pod laufen.
Alle Container innerhalb eines Pods teilen sich die Namespaces des Pods und können nur parallel auf der gleichen Node laufen. Wir einer der Container eines Pods beendet, dann werden alle Container im gleichen Pod gestoppt.
Evicted Pods
Pods können durch Signale zu Evicted Pods werden. Die Signale können z.B. durch zu wenig Speicher, Festplattenplatz, fehlende INodes oder Prozess IDs gesetzt werden. Meist starten in dem Fall neue Pods, sobald der entsprechende Engpass behoben ist.
Die verbleibenden - Evicted - Pods können dann entfernt werden.
Eine Liste der Evicted Pods zusammen mit dem Grund wird wie folgt erstellt:
$ kubectl get pods --all-namespaces -o go-template='{{range .items}}{{if eq .status.phase "Failed"}}{{if eq .status.reason "Evicted"}}{{.metadata.name}}{{" "}}{{.metadata.namespace}}{{"\n"}}{{end}}{{end}}{{end}}'|whileread epod enamespace;do kubectl -n $enamespace get pod $epod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,MSG:.status.message;done
Zum Löschen aller Evicted Pods reicht ebenfalls ein Einzeiler:
Ephemeral Container können einem Pod hinzugefügt werden um in der bestehenden
Pod Umgebung debugging durchführen zu können.
$ kubectl debug $PODNAME --image=alpine --attach -ti -- sh
Nach dem Verlassen des Containers bleibt dieser im Pod erhalten und wird erst
durch entfernen des Pods gelöscht.
Solange kann an den Container attached werden.
$ kubectl attach $PODNAME$CONTAINERNAME -ti
Kubernetes Service
Pods werden nicht direkt über die Pod IP angesprochen, da sich diese IP bei jedem Anlegen eines Pods ändert. Falls über das Deployment mehrere Pods angelegt werden, wird über die IP immer nur ein Pod angesprochen.
Ein Service sorgt für die Vergabe einer ClusterIP, eines NodePorts oder der Nutzung eines LoadBalancers.
Um die zusammengehörigen Pods zu finden werden über einen selector die passenden Label der Pods festgelegt. Dabei müssen die Pods und der Service im gleichen Namespace sein.
Eine StorageClass wird benutzt um einen Datenspeicher für die Pods zur Verfügung zu stellen.
Es gibt verschiedene Provider über die die Speicherung durchgeführt werden kann.
Eine StorageClass als default festlegen
Um für einen Cluster einen Storage als Voreinstellung zu haben wird in der Regel die erste angelegte StorageClass als default definiert.
Wird nun Storage angefordert, dann wird diese Klasse als StorageClass benutzt.
In der StorageClass Liste erscheint die StorageClass dann mit der Kennzeichnung (default).
$ kubectl get StorageClass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
longhorn (default) driver.longhorn.io Retain Immediate true 24m
longhorn-static driver.longhorn.io Delete Immediate true 24m
StorageClass als nicht-default setzen
Mittels eines Patches lässt sich eine StorageClass als nicht-default setzen. Ist kein default definiert und eine Resource benötigt ein Volume, dann muss eine StorageClass explizit angegeben sein.
Sobald es keine default StorageClass gibt, kann eine StorageClass als default festgelgt werden. Dies geschieht analog zum Entfernen der default Definition.
Für den Betrieb eines Kubernetes Clusters werden einige Tools benötigt.
dieses sind nicht immer direkt in den Repositories der Distributionen verfügbar. Das folgende Script installiert die wichtigsten Tools in /usr/local/bin und fügt den Pfad zur PATH Variable hinzu.
echo"install needed tools" sudo yum install -y epel-release
sudo yum install -y vim tar git libiscsi-utils iscsi-initiator-utils nfs-utils
sudo systemctl enable --now iscsid
echo"add /usr/local/bin to PATH"echo"PATH=\"/usr/local/bin:\$PATH\""| sudo tee -a /root/.bashrc | tee -a $HOME/.bashrc
echo"installing kubectl" sudo curl -Lo /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
sudo chmod +x /usr/local/bin/kubectl
echo"installing helm" curl -L https://get.helm.sh/helm-v3.15.3-linux-amd64.tar.gz|sudo tar xvz -C /usr/local/bin/ --strip-components=1 --wildcards '*/helm'echo"installing flux" curl -s https://fluxcd.io/install.sh | sudo bash
echo"installing ranchercli" curl -L https://github.com/rancher/cli/releases/download/v2.8.0/rancher-linux-amd64-v2.8.0.tar.gz|sudo tar xvz -C /usr/local/bin --strip-components=2 --wildcards '*/rancher'echo"installing cilium"CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)CLI_ARCH=amd64
curl -L --fail https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz | sudo tar xzvC /usr/local/bin
echo"installing hubble"HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)HUBBLE_ARCH=amd64
curl -L --fail https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz | sudo tar xzvC /usr/local/bin
echo"installing kubectl krew plugin" curl -L https://github.com/kubernetes-sigs/krew/releases/latest/download/krew-linux_amd64.tar.gz | sudo tar -xzv -C /usr/local/bin ./krew-linux_amd64
sudo chmod +x /usr/local/bin/krew-linux_amd64
sudo /usr/local/bin/krew-linux_amd64 install krew
/usr/local/bin/krew-linux_amd64 install krew
sudo grep KREW_ROOT /root/.bash_profile -q ||echo'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"'| sudo tee -a /root/.bash_profile
grep KREW_ROOT ${HOME}/.bash_profile -q ||echo'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"'| tee -a ${HOME}/.bash_profile
echo"installing krew plugins"for I in neat cert-manager cilium change-ns df-pv sick-pods;do sudo /usr/local/bin/kubectl krew install $I /usr/local/bin/kubectl krew install $Idone
Kubernetes Troubleshooting
RKE2
RKE2 startet nicht “cluster-cidr: [x.x.x.x/16 201:db8::/56] and node-ip: [y.y.y.y], must share the same IP version (IPv4, IPv6 or dual-stack)”
RKE2 hat die IPv6 der Node nicht erkannt. Durch eine zusätzliche
Konfigurationsdatei in /etc/rancher/rke2/config.yaml.d/ kann die bestehende
Konfiguration ergänzt werden:
Das SUSE Longhorn Projekt stellt eine Open-Source-Lösung für verteilte Block-Speicher für Kubernetes bereit.
Was ist Longhorn?
Longhorn ist eine kostenlose und Open-Source-Software-Defined-Storage-Lösung, die für Kubernetes entwickelt wurde. Sie bietet persistente Speichervolumes für zustandsbehaftete Anwendungen, die auf Kubernetes laufen.
Hauptmerkmale von Longhorn:
Einfache Installation und Verwaltung: Longhorn lässt sich einfach in einem Kubernetes-Cluster installieren und über die Kubernetes-API oder eine benutzerfreundliche Weboberfläche verwalten.
Hochverfügbarkeit: Longhorn repliziert Speicherdaten über mehrere Knoten hinweg, um Ausfallsicherheit zu gewährleisten. Wenn ein Knoten ausfällt, sind die Daten weiterhin verfügbar.
Snapshots und Backups: Es unterstützt das Erstellen von Snapshots von Volumes und das Sichern dieser Snapshots an externen Speicherorten (z. B. S3-kompatible Speicher, NFS).
Dynamische Volume-Bereitstellung: Volumes können dynamisch erstellt und an Pods angehängt werden, wenn diese gestartet werden.
Plattformübergreifend: Longhorn funktioniert auf verschiedenen Cloud-Providern und On-Premises-Umgebungen.
Block-Speicher: Longhorn stellt Block-Speicher bereit, der für eine Vielzahl von Anwendungen geeignet ist, einschließlich Datenbanken und anderer zustandsbehafteter Dienste.
Anwendungsfälle
Longhorn eignet sich hervorragend für Szenarien, in denen Sie:
Zustandsbehaftete Anwendungen auf Kubernetes betreiben, die persistenten Speicher benötigen.
Eine einfache und kostengünstige Speicherlösung für Ihren Kubernetes-Cluster suchen.
Hochverfügbarkeit und Datensicherheit für Ihre Speicherdaten benötigen.
Flexibilität bei der Verwaltung und Sicherung Ihrer Speicherdaten wünschen.
Installation
Die Installation von Longhorn erfolgt typischerweise über die Bereitstellung von YAML-Manifesten in Ihrem Kubernetes-Cluster. Sie können die neuesten Installationsanweisungen und Manifeste auf der offiziellen Longhorn-Dokumentation finden.
Verbindung zu einer PostgreSQL-Datenbank in Kubernetes herstellen
Der sinnvollste Weg um an eine PostgreSQL-Datenbank in einer Kubernetes-Cluster
Umgebung zu verbinden ist die Verwendung eines passenden PostgreSQL Containers.
Dieser lässt sich über den den Befehl kubectl run erzeugen.
Dazu sollte im Vorfeld der namespace des PostgreSQL Servers sowie dessen
Service-Name und Service-Port bekannt sein.
user@linux $ kubectl get svc -n postgresql
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgresqlns mypostgresql ClusterIP 89.207.132.170 <none> 5432/TCP 13m
In dem Beispiel sind die folgenden Parameter vergeben:
postgresqlns ist der Namespace
mypostgresql ist der Name des Services
5432 ist der Service-Port
Der Container für den Zugriff wird nun mit dem Befehl kubectl run erzeugt und
direkt eine Verbindung zum PostgreSQL Server hergestellt.
Die Installation erfolgt in einem eigenen Namespace. Dieser kann vorab
oder beim helm install über den Parameter --create-namespace während der
Installation angelegt werden.
Im Ingress müssen nun nur noch die folgenden Annotations hinterlegt werden:
# type of authentication
nginx.ingress.kubernetes.io/auth-type: basic
# name of the secret that contains the user/password definitions
nginx.ingress.kubernetes.io/auth-secret: basic-auth
# message to display with an appropriate context why the authentication is required
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
Um eigene Images zu verwalten und zu pushen, wird ein OCI
Registry benötigt.
Im folgenden Beispiel wird die Installation über yaml Dateien durchgeführt,
die direkt über kubectl importiert werden. Dazu werden die im folgenden
aufgeführten Beispiele in Dateien gepackt und über denn Befehl kubectl apply -f $DATEINAME importiert.
Namespace
Zunächst wird ein Namespace erstellt in dem die Registry läuft. Für das Beispiel
ist das der Namespace registry.
apiVersion:v1kind:Namespacemetadata:name:registry
Storage
Damit die Daten der Registry auch nach einem Neustart erhalten bleiben, wird ein
Storae benötigt. Über die default Storage Klasse wird dafür ein
PersistentVolumeClaim erstellt. Dieser erstellt dann ein PersistentVolume
sobald dieses von dem Deployment angefordert wird.
Wird eine andere als die default StorageClass gewünscht kann diese mit dem
Parameter storageClassName angegeben werden.
Secrets
Damit die Registry nicht ohne Authentifizierung läuft muss im Vorfeld eine
htpasswd Datei erstellt werden um darüber die Benutzer zu verwalten.
Zunächst wird die htpasswd Datei erstellt. Dies lässt sich am einfachsten über
den httpd OCI Container durchführen. Dieser enthält das benötigte Progamm
htpasswd. Im Beispiel wird podman genutzt. Der Befehl kann gegen docker
getauscht werden.
Nach dem Einlesen des Deployments existiert der Pod registry im Namespace
registry, es existiert aber noch kein Zugriff von Außen auf den Container.
Dazu wird ein Service erstellt.
Der Service ist in der Lage den passenden Pod auf Grund des selector zu finden
und diesem eine ClusterIP zu geben. Dies ClusterIP mit dem Port 5000 ist dann
eine Möglichkeit auf den Dienst zuzugreifen.
Allerdings nur auf einer der Cluster Nodes. Um auch von Außen auf den Dienst
zugreifen zu können macht es Sinn einen Ingress zu erstellen über den dann der
Zugriff erfolgt.
Ingress
Für den Ingress wird eine DNS Domain benötigt, die auf den Cluster zeigt. Für
das Beispiel ist es registry.internal. Um auch per https auf den Dienst
zugreifen zu können muss ein TLS Zertifikat vorhanden sein. Diese kann wie Folgt
erstellt werden:
Die beiden auskommentierten Einträge sind die Verwendung von cert-manager und
einem ClusterIssuer gedacht. Der ClusterIssuer muss dafür zunächst angelegt sein
und die Domain von extern durch den Zertifizierungsdienst - z. B. Let’s Encrypt
Da das RKE2 einige der in einer Standard - Installation vorherrschenden Limit überschreitet müssen für inotify die Limits erhöht werden.
sudo tee /etc/sysctl.d/20-inotify.conf <<HERE
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=524288
HEREsudo sysctl --system
Die Installation der RKE2 Umgebung kann durch ein Script oder die Installation des Binaries von GitHub durchgeführt werden.
Das Script installiert neben dem Binary auch einige nützliche Scripte über die alle Prozesse des RKE2 gestoppt oder eine Installation entfernt werden kann.
Bei unterstützten Plattformen - wie Rocky Linux - wird zusätzlich ein Repository für den Paketmanager installiert über den ein direktes Update per yum update möglich ist.
curl -sfL https://get.rke2.io | sudo sh -
Zusätzlich wird das Kommando kubectl für die Verwaltung des Clusters benötigt. Der folgende Aufruf installiert den Befehl direkt nach /usr/local/bin. Um direkt per bash verfügbar zu sein wird auch die Variable PATH erweitert.
sudo curl -Lo /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
sudo chmod +x /usr/local/bin/kubectl
echo"PATH=\"/usr/local/bin:\$PATH\""| sudo tee -a /root/.bashrc | tee -a $HOME/.bashrc
source$HOME/.bashrc
Falls dem RKE2 keine weiteren Parameter angegeben werden sollen, kann der Dienst aktiviert und gestartet werden.
sudo systemctl enable --now rke2-server.service
Die für den kubectl benötigte Konfiguration kann direkt unter .kube/config im Homeverzeichnis des aktuellen Benutzers und dem von root zur Verfügung gestellt werden.