
Kubernetes ist eine Container-Orchestrierungsplattform, die die Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen automatisiert und viele der manuellen Schritte von Rolling Upgrades und Skalierung abstrahiert. Beim Erstellen cloudnativer Anwendungen in einer Kubernetes-Umgebung ist es häufig erforderlich, Datenbankanwendungen wie eine PostgreSQL-Datenbank bereitzustellen, damit Ihre Anwendungen deren Funktionen innerhalb des Clusters nutzen können.
In diesem Leitfaden zeigen wir Ihnen, wie Sie PostgreSQL in einem Kubernetes-Cluster bereitstellen und so ein konfigurierbares und skalierbares cloud-natives PostgreSQL-Setup erhalten. Egal, ob Sie mit Google Kubernetes Engine, Amazon EKS, IBM Cloud Kubernetes Service oder einer lokalen Lösung wie Minikube arbeiten, dieses Tutorial ist für Sie relevant. Lesen Sie weiter, um zu erfahren, wie Sie eine einzelne PostgreSQL-Instanz auf Kubernetes zu Testzwecken bereitstellen und fortgeschrittenere Bereitstellungen mit Tools wie Helm, Kubernetes Operators und Bitnami PostgreSQL erkunden.
Voraussetzungen
Damit Sie folgen können, stellen Sie sicher, dass Sie Folgendes haben:
- Einen Kubernetes-Cluster (bei einem Cloud-Anbieter wie DigitalOcean, Amazon Web Services, Google Cloud oder IBM Cloud oder lokal auf Kind oder Minikube)
- Einige Kenntnisse über kubectl, das Kubernetes-API-Befehlszeilen-Tool
Bevor wir beginnen, lassen Sie uns die grundlegenden Schritte für das Deployment einer einzelnen PostgreSQL-Instanz auf Kubernetes durchgehen.
Einfaches PostgreSQL-Deployment
PostgreSQL dockerisieren
Kubernetes bezieht Docker-Images aus einer Registry und stellt sie auf der Grundlage einer Konfigurationsdatei bereit. Sie können Ihr eigenes PostgreSQL-Docker-Image erstellen, indem Sie diese Schritte befolgen, oder das offizielle Open-Source-Image von Docker Hub verwenden. In diesem Beitrag verwenden wir das neueste Postgres 15.3-Image.
Erstellen Sie Ihre Verbindungskonfiguration und Secrets
Um sensible Informationen wie Datenbankzugangsdaten sicher zu speichern, verwenden wir die Kubernetes-Secrets-Konfiguration, eine native Ressource innerhalb der Kubernetes-Umgebung.
Kubernetes speichert Secrets standardmäßig in Base64-kodierter Form, was allein nicht sicher ist. Für mehr Sicherheit aktivieren Sie die Verschlüsselung ruhender Daten.
Sobald alles konfiguriert ist, erstellen Sie die Konfiguration für das Kubernetes-Secret. Wir verwenden die folgenden Werte für das Postgres-Passwort:
❯ echo -n "postgres" | base64
cG9zdGdyZXMK
Erstellen Sie anschließend eine Secrets-Konfigurationsdatei und wenden Sie diese auf den Cluster an:
> cat postgres-secrets.yml
apiVersion: v1
kind: Secret
metadata:
name: postgres-secret-config
type: Opaque
data:
password: cG9zdGdyZXMK
Hier haben wir kind verwendet, was ein Secret ist, das Kubernetes anweist, einen Secrets-Provider zum Speichern der Daten zu nutzen. Der Name, der zum Speichern dieser Werte verwendet werden muss, befindet sich unter dem Schlüssel postgres-secret-config. Abschließend haben wir im Abschnitt data die Schlüssel-Wert-Paare angegeben, die sicher gespeichert werden sollen.
Nun wenden wir diese Konfiguration an und überprüfen anschließend, ob die Inhalte korrekt gespeichert wurden:
❯ kubectl apply -f postgres-secrets.yml
secret/postgres-secret-config created
❯ kubectl get secret postgres-secret-config -o yaml
apiVersion: v1
data:
password: cG9zdGdyZXMK
....
Erstellen Sie PersistentVolume und PersistentVolumeClaim
Als Nächstes sollten Sie einen permanenten Dateispeicher für Ihre Datenbankdaten erstellen, da die Docker-Instanz standardmäßig keinen persistenten Speicher für Informationen besitzt, wenn der Container nicht mehr existiert.
Die Lösung besteht darin, ein Dateisystem zu mounten, um die PostgreSQL-Daten zu speichern. Kubernetes verwendet für diese Vorgänge ein spezielles Konfigurationsformat. Um dies umzusetzen, folgen Sie diesen Schritten:
- Erstellen Sie ein PersistentVolume-Manifest, das den Typ der Volumes beschreibt, die Sie verwenden möchten.
- Erstellen Sie einen PersistentVolumeClaim (PVC), der die Nutzung für diesen speziellen PersistentVolume-Typ auf Basis derselben StorageClass anfordert.
Für unser Beispiel verwenden wir das Dateisystem des aktuellen Nodes als Volume. In der Praxis ist es jedoch besser, eine StorageClass zu nutzen, die für Datenbankoperationen optimiert ist – etwa standard, gp2 oder spezifische Dynamic Provisioners von Cloud-Anbietern, die Replikation und IOPS-Optimierung unterstützen.
Zuerst definieren wir die Konfiguration für das PersistentVolume:
> cat pv-volume.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
In dieser Konfiguration haben wir es angewiesen, 5 GB Speicherplatz für Lese- und Schreibzugriffe unter /mnt/data auf dem Node des Clusters zu reservieren.
Jetzt wenden wir es an und prüfen, ob das persistente Volume verfügbar ist:
❯ kubectl apply -f pv-volume.yml
persistentvolume/postgres-pv-volume created
❯ kubectl get pv postgres-pv-volume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
postgres-pv-volume 5Gi RWO Retain Available manual 51s
Wir müssen anschließend eine PersistentVolumeClaim-Konfiguration erstellen, die den Details des vorherigen Manifests entspricht:
> cat pv-claim.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
In dieser Konfiguration haben wir einen PersistentVolumeClaim über 1 GB Speicher unter Verwendung desselben Storage-Class-Namens angefordert. Dies ist ein wichtiger Parameter, da er es Kubernetes ermöglicht, 1 GB der verfügbaren 5 GB innerhalb dieser Storage-Class exklusiv für diesen Claim zu reservieren.
Jetzt wenden wir sie an und prüfen, ob die Forderung nach einem dauerhaften Volumen gebunden ist:
❯ kubectl apply -f pv-claim.yml
persistentvolumeclaim/postgres-pv-claim created
❯ kubectl get pvc postgres-pv-claim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
postgres-pv-claim Bound postgres-pv-volume 1Gi RWO manual 5m32s
Erstellen Sie ein Kubernetes-Deployment für PostgreSQL
Mit den Einstellungen aus dem Postgres-secret-config Secret-Namen und unter Bezugnahme auf das zuvor erstellte PersistentVolume und PersistentVolumeClaim erstellen wir eine Deployment-Konfiguration für unsere Kubernetes-Instanz.
> cat postgres-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
volumes:
- name: postgres-pv-storage
persistentVolumeClaim:
claimName: postgres-pv-claim
containers:
- name: postgres
image: postgres:11
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5432
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret-config
key: password
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-pv-storage
Hier haben wir alle zuvor definierten Konfigurationen – die Kubernetes-Secret-Konfiguration und die Persistent-Volume-Mounts – zusammengeführt. Wir haben die Deployment-Konfiguration apiVersion: apps/v1 verwendet, die die Angabe einiger Zeilen erfordert, wie etwa die Felder selector und metadata. Anschließend haben wir Details zum Container-Image und zur imagePullPolicy hinzugefügt. All dies ist notwendig, um sicherzustellen, dass wir das richtige Volume und die korrekten Secrets für diesen Container verwenden.
Jetzt wenden wir das Deployment an und prüfen, ob es verfügbar und funktionsfähig ist:
❯ kubectl apply -f postgres-deployment.yml
deployment.apps/postgres created
❯ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
postgres 1/1 1 1 28s
Erstellen Sie einen Dienst, um den PostgreSQL-Server bereitzustellen
Nutzen Sie einen Kubernetes Service, um Ihren PostgreSQL-Pod nach außen verfügbar zu machen. Hierfür können Sie entweder einen abweichenden Port konfigurieren oder den Dienst über einen NodePort oder LoadBalancer freigeben. Der Einfachheit halber zeigen wir Ihnen, wie Sie NodePort verwenden, wodurch der Dienst über die IP-Adresse des Nodes an einem statischen Port erreichbar wird.
Sie können das folgende Service-Manifest verwenden:
> cat postgres-service.yml
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
type: NodePort
ports:
- port: 5432
selector:
app: postgres
Als Nächstes wenden Sie den Service an und überprüfen, ob er verfügbar ist und ob ihm ein Port zugewiesen wurde:
❯ kubectl apply -f postgres-service.yml
service/postgres created
❯ kubectl get service postgres
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
Testen Sie die Verbindung zur Postgres-Datenbank
Sie sollten in der Lage sein, sich intern mit den folgenden Befehlen mit der PostgreSQL-Datenbank zu verbinden:
❯ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-57f4746d96-7z5q8 1/1 Running 0 30m
❯ kubectl exec -it postgres-57f4746d96-7z5q8 -- psql -U postgres
Es gibt außerdem eine praktische Möglichkeit, den Kubernetes-Pod-Namen in einer Variablen zu speichern:
POD=$(kubectl get pods -l app=postgres -o jsonpath="{.items[0].metadata.name}")
Sie können auch einen anderen Docker-Container verwenden, um sich über den psql-Befehl zu verbinden:
export POSTGRES_PASSWORD=$(kubectl get secret postgres-secret-config -o jsonpath="{.data.password}" | base64 --decode)
❯ kubectl run postgres-client --rm --tty -i --restart='Never' --image postgres:11 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql -h postgres -U postgres
Wenn Sie keine Befehlszeile sehen, versuchen Sie, die Eingabetaste zu drücken.
postgres=#
Jetzt können Sie Abfragen ausführen.
Erweitertes PostgreSQL-Deployment
Im vorherigen Beispiel haben wir nur eine einzelne PostgreSQL-Instanz zu Entwicklungszwecken bereitgestellt. Für Produktions- und Hybrid-Cloud-Umgebungen, die hohe Verfügbarkeit, Replikation und Skalierung erfordern, könnten Sie Folgendes verwenden:
- Bitnami PostgreSQL-Deployment: Bitnami unterstützt verschiedene Deployment-Typen (einschließlich Helm, einem von der Kubernetes-Community gepflegten Paketmanager) und bietet zahlreiche Konfigurationsoptionen für groß angelegte Deployments.
- Zalando PostgreSQL Operator: Dies ist ein hochverfügbarer Kubernetes-Operator, der auf deren bewährtem, Patroni-basierten Cluster-Template aufbaut.
Diese Optionen unterstützen eine unternehmensgerechte Infrastruktur und die Best Practices der Cloud Native Computing Foundation.
Nächste Schritte
Nachdem Sie eine einfache PostgreSQL-Instanz auf Kubernetes bereitgestellt haben, sind Sie bereit für die Integration von Monitoring und Logging. Tools wie Sumo Logic unterstützen erweitertes Kubernetes-Monitoring und helfen Ihnen dabei, Ihre Cluster-Ressourcen zu verwalten, Logs von Kubernetes-Pods zu analysieren und die Observability Ihrer Cloud-nativen Anwendungen sicherzustellen. Standardmäßig werden Volumes gelöscht, wenn der zugehörige Claim entfernt wird. Durch das Setzen der Reclaim-Policy auf Retain stellen Sie sicher, dass Ihre Daten erhalten bleiben, falls ein PVC gelöscht wird.
Erfahren Sie, wie Sumo Logic Sie beim Kubernetes-Monitoring unterstützen kann..



