
Kubernetes ist eine Plattform zur Container-Orchestrierung, die das Deployment, Skalierung und Verwaltung von containerisierten Anwendungen automatisiert und viele der manuellen Schritte für Rolling Upgrades und Skalierung abstrahiert. Wenn Sie Cloud-native Anwendungen entwickeln, müssen Sie häufig Datenbankanwendungen wie PostgreSQL bereitstellen, 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. Ganz gleich, ob Sie mit Google Kubernetes Engine, Amazon EKS, IBM Cloud Kubernetes Service oder einer lokalen Lösung wie Minikube arbeiten, diese Anleitung gilt. Lesen Sie weiter, um zu erfahren, wie Sie eine einzelne PostgreSQL-Instanz zu Testzwecken auf Kubernetes bereitstellen und fortgeschrittenere Deployments mit Tools wie Helm, Kubernetes Operators und Bitnami PostgreSQL erkunden.
Voraussetzungen
Um mitzukommen, 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
Dockerize PostgreSQL
Kubernetes holt 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 Sie verwenden das offizielle Open-Source-Image von Docker Hub. In diesem Beitrag verwenden wir das neueste Postgres 15.3 Image.
Erstellen Sie Ihre Verbindungskonfiguration und Geheimnisse
Für die sichere Speicherung sensibler Daten wie Datenbank-Anmeldedaten verwenden wir die Kubernetes-Secrets-Konfiguration, eine native Kubernetes-Ressource.
Kubernetes speichert Secrets standardmäßig in base64-kodierter Form, was für sich genommen nicht sicher ist. Für mehr Sicherheit sollten Sie Enryption at rest aktivieren.
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 dann eine Secrets-Konfigurationsdatei und wenden Sie sie 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 Kindverwendet, das ein Secret ist, das Kubernetes anweist, einen Secrets Provider zum Speichern der Daten zu verwenden. Der Name, der zum Speichern dieser Werte verwendet werden muss, befindet sich unter dem Schlüssel postgres-secret-config. Schließlich haben wir die Schlüssel/Wertpaare angegeben, die wir als Secrets im Datenbereich speichern müssen.
Jetzt wenden wir diese Konfiguration an und überprüfen, ob der Inhalt korrekt gespeichert wurde:
❯ 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 möchten Sie einen permanenten Dateispeicher für Ihre Datenbankdaten anlegen, da die Docker-Instanz über keinen dauerhaften Speicher für Informationen verfügt, wenn der Container nicht mehr existiert (standardmäßig).
Die Lösung besteht darin, ein Dateisystem zum Speichern der PostgreSQL-Daten zu mounten. Kubernetes hat ein anderes Konfigurationsformat für diese Vorgänge, so dass Sie diese Schritte befolgen müssen:
- Erstellen Sie ein PersistentVolume-Manifest, das die Art der Volumes beschreibt, die Sie verwenden möchten.
- Erstellen Sie einen PersistentVolumeClaim, der die Nutzung für diesen bestimmten PersistentVolume-Typ auf der Grundlage derselben Speicherklasse anfordert.
Für unser Beispiel verwenden wir das aktuelle Knoten-Dateisystem als Volume, aber es ist besser, eine StorageClass zu verwenden, die für Datenbankoperationen geeignet ist, wie z. B. Standard, gp2 oder Cloud-Provider-spezifische dynamische Provisioner, 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 Knoten 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 eine PersistentVolumeClaim-Konfiguration nachreichen, die mit den Details des vorherigen Manifests übereinstimmt:
> 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 für 1 GB Daten mit demselben Speicherklassennamen angefordert. Dies ist ein wichtiger Parameter, da Kubernetes damit 1 GB der verfügbaren 5 GB der gleichen Speicherklasse für diesen Anspruch reservieren kann.
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 Konfigurationen, die wir zuvor mit der geheimen Kubernetes-Secret-Konfiguration und den persistenten Volume-Mounts definiert haben, zusammengefügt. Wir haben die Deployment-Konfiguration apiVersion: apps/v1 verwendet, bei der wir einige Zeilen angeben müssen, z. B. den Selektor und die Metadatenfelder. Dann haben wir Details zum Container-Image und zur Image Pull Policy für das Image hinzugefügt. Dies alles ist notwendig, um sicherzustellen, dass wir das richtige Volumen und die richtigen 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
Verwenden Sie einen Kubernetes-Dienst, um Ihren PostgreSQL-Pod bereitzustellen. Dazu können Sie einen anderen Port konfigurieren oder den NodePort oder LoadBalancer bereitstellen. Der Einfachheit halber zeigen wir Ihnen, wie Sie NodePort verwenden, das den Dienst auf der IP des Knotens an einem statischen Port bereitstellt.
Sie können das folgende Dienstmanifest 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 Dienst 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, mit den folgenden Befehlen eine interne Verbindung zur PostgreSQL-Datenbank herzustellen:
❯ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-57f4746d96-7z5q8 1/1 Läuft 0 30m
❯ kubectl exec -it postgres-57f4746d96-7z5q8 -- psql -U postgres
Es gibt auch eine praktische Möglichkeit, den Namen des Kubernetes-Pods in einer Variablen zu speichern:
POD=$(kubectl get pods -l app=postgres -o jsonpath="{.items[0].metadata.name}")
Sie könnten auch einen anderen Docker-Container verwenden, um eine Verbindung über den Befehl psql herzustellen:
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 sind Sie bereit, Abfragen durchzuführen.
Erweitertes PostgreSQL-Deployment
Im vorherigen Beispiel haben wir nur eine einzige Instanz von PostgreSQL für Entwicklungszwecke bereitgestellt. Für Produktions- und Hybrid-Cloud-Umgebungen könnten Sie folgende Optionen verwenden:
- Bitnami PostgreSQL Deployment: Bitnami unterstützt mehrere Arten von Deployments (einschließlich Helm, einem von der Kubernetes-Community verwalteten Paketmanager) und bietet viele Konfigurationsoptionen für umfangreiche Deployments.
- Zalando PostgreSQL Operator: Dies ist ein hochverfügbarer Kubernetes-Operator, der auf der bestehenden Patroni-basierten Cluster-Vorlage beruht.
Diese Optionen unterstützen eine unternehmenstaugliche Infrastruktur und die Best Practices des Cloud Native Computing.
Nächste Schritte
Nachdem Sie nun eine einfache PostgreSQL-Instanz auf Kubernetes bereitgestellt haben, können Sie Monitoring und Protokollierung integrieren. Tools wie Sumo Logic unterstützen das erweiterte Kubernetes-Monitoring und helfen Ihnen, Ihre Cluster-Ressourcen zu verwalten, Protokolle von Kubernetes-Pods zu analysieren und die Observability Ihrer nativen Cloud-Anwendungen sicherzustellen. Standardmäßig können Volumes gelöscht werden, wenn ihr Claim entfernt wird. Wenn Sie die Reclaim-Policy auf Retain setzen, bleiben Ihre Daten erhalten, wenn ein PVC gelöscht wird.
Erfahren Sie, wie Sumo Logic Sie beim Kubernetes-Monitoring unterstützen kann.

