
Kubernetes ist eine Plattform zur Orchestrierung von Containern, die die Bereitstellung, 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 einsetzen und so eine konfigurierbare und skalierbare Cloud-native PostgreSQL-Einrichtung 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 ist anwendbar. Lesen Sie weiter, um zu erfahren, wie Sie eine einzelne PostgreSQL-Instanz zu Testzwecken auf Kubernetes bereitstellen und fortgeschrittenere Bereitstellungen 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 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 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 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.
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 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 die Art 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 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 ü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, 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 PostgreSQL-Instanz für Entwicklungszwecke bereitgestellt. Für Produktions- und hybride Cloud-Umgebungen könnten Sie diese 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 deren bewährtem, Patroni-basierten Cluster-Template aufbaut.
Diese Optionen unterstützen eine unternehmenstaugliche Infrastruktur und die Best Practices des Cloud Native Computing.
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..


