Benutzer-Werkzeuge

Webseiten-Werkzeuge


it-wiki:kubernetes:cloud-native-postgresql-install-scalable-postgresql-distribution-on-kubernetes

Cloud Native PostgreSQL Operator: Installation der skalierbaren PostgreSQL-Distribution auf Kubernetes

Einführung

In einem digitalen Ökosystem, das zunehmend auf Microservices und Cloud-native Architekturen umsteigt, ist der Bedarf an zuverlässigen, skalierbaren und verwaltbaren Datenbanklösungen von größter Bedeutung. PostgreSQL erweist sich aufgrund seiner Robustheit, Erweiterbarkeit und Einhaltung strenger SQL-Standards als zuverlässige Wahl für Unternehmen, die ihre Daten effizient verwalten möchten. Während sich Unternehmen jedoch auf die Bereiche cloudnativer Bereitstellungen zubewegen, greifen die traditionellen Datenbankinstallationsmethoden häufig nicht in der Lage, das volle Potenzial moderner Orchestrierungsplattformen wie Kubernetes auszuschöpfen.

Die Herausforderung der Installation von PostgreSQL auf Kubernetes

Kubernetes, oft als K8s abgekürzt, ist eine leistungsstarke Open-Source-Plattform zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von Containeranwendungen. Es gruppiert Container, die eine Anwendung bilden, zur einfachen Verwaltung und Erkennung in logische Einheiten. Der Aufstieg von Kubernetes lässt sich auf das Versprechen zurückführen, viele der manuellen Prozesse zu eliminieren, die mit der Bereitstellung und Skalierung von Containeranwendungen verbunden sind. Es bietet ein Framework für den stabilen Betrieb verteilter Systeme und kümmert sich neben anderen nützlichen Funktionen auch um Skalierung und Failover Ihrer Anwendungen.

Das Herzstück von Kubernetes sind seine Orchestrierungs- und Planungsfunktionen. Es stellt sicher, dass die Containeranwendungen dort laufen, wo und wann sie sollen, und dass sie einander automatisch finden und miteinander kommunizieren können. Darüber hinaus bietet Kubernetes unter anderem robuste Tools für die Verwaltung und Aufrechterhaltung des Containerzustands, Netzwerkrichtlinien, Lastausgleich und Speicherorchestrierung. Dies macht es zu einer attraktiven Plattform für Unternehmen, die ihre Anwendungen auf belastbare und skalierbare Weise bereitstellen möchten.

Allerdings stellt die Bereitstellung zustandsbehafteter Anwendungen wie Datenbanken auf Kubernetes eine Reihe einzigartiger Herausforderungen dar. Im Gegensatz zu zustandslosen Anwendungen erfordern zustandsbehaftete Anwendungen eine dauerhafte Speicherschicht, um Daten über Neustarts und Ausfälle hinweg zu speichern. Hier beginnt die Reise der Bereitstellung von PostgreSQL auf Kubernetes und beschreitet einen Weg voller betrieblicher Komplexität und Hürden bei der Zustandsverwaltung. In den folgenden Abschnitten werden wir tiefer auf diese Herausforderungen eingehen und untersuchen, wie sich Cloud Native PostgreSQL als Lösung für diese gewaltigen Aufgaben erweist.

Operative Komplexität

Die Bereitstellung einer PostgreSQL-Instanz auf einer herkömmlichen VM oder einem Bare-Metal-Server erfordert eine Reihe von Standardverfahren, mit denen Datenbankadministratoren bestens vertraut sind. Allerdings bringt die Kubernetes-Umgebung ein neues Maß an betrieblicher Komplexität mit sich. Einige davon umfassen:

  1. Konfigurationsmanagement: Die Konfiguration einer PostgreSQL-Instanz in einem Kubernetes-Cluster erfordert ein gutes Verständnis von ConfigMaps und Secrets für die Verwaltung von Konfigurationen bzw. sensiblen Daten.
  2. Persistenter Speicher: Die Sicherstellung der Datenpersistenz über Pod-Neustarts und -Ausfälle hinweg erfordert ein solides Verständnis der Konzepte Persistent Volume (PV) und Persistent Volume Claim (PVC) in Kubernetes.
  3. Netzwerk: Das Einrichten von Netzwerkrichtlinien, Diensten und Eingangscontrollern für die Kommunikation zwischen PostgreSQL-Instanzen und anderen Diensten innerhalb/außerhalb des Clusters kann kompliziert sein.
  4. Diensterkennung: Diensterkennung und Lastausgleich sind für die Verteilung von Clientanfragen auf mehrere PostgreSQL-Instanzen von entscheidender Bedeutung und erfordern ein robustes Setup.
  5. Sicherheit: Die Implementierung von Sicherheitsmaßnahmen wie SSL/TLS für verschlüsselte Verbindungen, rollenbasierter Zugriffskontrolle (RBAC) und Netzwerkrichtlinien ist für den Schutz der Datenbank von größter Bedeutung.
  6. Überwachung und Protokollierung: Das Einrichten von Überwachungs-, Protokollierungs- und Warnlösungen zur Verfolgung der Leistung, Fehler und anderer Metriken von PostgreSQL-Instanzen in einer Kubernetes-Umgebung erfordert zusätzliche Konfigurationen.

State Management

Zustandsbehaftete Anwendungen wie PostgreSQL erfordern eine dauerhafte Speicherschicht, um Datenintegrität und -verfügbarkeit sicherzustellen. In einer Kubernetes-Umgebung wird die Statusverwaltung aufgrund der kurzlebigen Natur von Pods zu einer komplexen Aufgabe. Zu den Herausforderungen gehören:

  1. Datenpersistenz: Stelle sicher, dass Daten bei Pod-Neustarts oder -Ausfällen nicht verloren gehen, indem Du persistente Speicherlösungen richtig konfigurierst.
  2. Datenkonsistenz: Aufrechterhaltung der Konsistenz über mehrere PostgreSQL-Instanzen in einer verteilten Umgebung, insbesondere bei Failovers und Skalierungsereignissen.
  3. Sicherung und Wiederherstellung: Implementierung zuverlässiger Sicherungs- und Wiederherstellungslösungen, um Daten vor versehentlichem Löschen, Beschädigung oder anderen unvorhergesehenen Ereignissen zu schützen.
  4. Migration und Upgrades: Abwicklung von Datenmigrationen und Datenbank-Upgrades bei gleichzeitiger Gewährleistung null oder minimaler Ausfallzeiten.
  5. Replikation: Konfigurieren der Replikation, um Datenverfügbarkeit und Leistung sicherzustellen, was angesichts der dynamischen Natur von Kubernetes-Bereitstellungen eine Herausforderung sein kann.

Diese betrieblichen Komplexitäten und Herausforderungen bei der Zustandsverwaltung halten Unternehmen oft davon ab, PostgreSQL auf Kubernetes bereitzustellen. Das Aufkommen von Cloud Native PostgreSQL zielt jedoch darauf ab, diese Hürden zu überwinden, indem eine Kubernetes-native Lösung bereitgestellt wird, die auf nahtlose PostgreSQL-Bereitstellungen und -Verwaltung zugeschnitten ist. In den folgenden Abschnitten werden die Essenz von Cloud Native PostgreSQL, seine Architektur und die Vorteile, die es in einer Kubernetes-Umgebung mit sich bringt, erläutert.

Cloud-natives PostgreSQL

Cloud Native PostgreSQL ist eine moderne Lösung, die PostgreSQL in einem Kubernetes-nativen Framework kapselt und darauf abzielt, die Bereitstellung, Skalierung und Verwaltung auf Kubernetes-Plattformen zu optimieren. Im Gegensatz zu herkömmlichen Bereitstellungen ist Cloud Native PostgreSQL so konzipiert, dass es den Cloud-nativen Prinzipien entspricht und sicherstellt, dass es die intrinsischen Funktionen von Kubernetes nutzt.

Kubernetes-Native Cloud Native PostgreSQL ist von Grund auf Kubernetes-nativ konzipiert. Es verwendet benutzerdefinierte Ressourcendefinitionen (CRDs) und Operatormuster, um PostgreSQL-Instanzen zu kapseln und zu verwalten. Dies ermöglicht eine nahtlose Integration mit Kubernetes und ermöglicht die automatisierte Bereitstellung, Skalierung und Verwaltung von PostgreSQL-Clustern.

Automatisierte Vorgänge Die Lösung bietet automatisierte Vorgänge wie Sicherungen, Skalierung, Failover und Upgrades und reduziert so den Betriebsaufwand, der mit der Verwaltung von PostgreSQL-Instanzen auf Kubernetes verbunden ist, drastisch.

Zustandsverwaltung Durch den Einsatz der robusten persistenten Speicherlösungen von Kubernetes stellt Cloud Native PostgreSQL die Datenpersistenz und -konsistenz über Pod-Neustarts, Ausfälle und Skalierungsereignisse hinweg sicher.

Kubernetes-Hürden überwinden

Persistent Storage Cloud Native PostgreSQL nutzt die Persistent Volumes (PV) und Persistent Volume Claims (PVC) von Kubernetes, um die Datenpersistenz über PostgreSQL-Instanzen hinweg sicherzustellen.

Netzwerk- und Diensterkennung Vereinfacht die Netzwerk- und Diensterkennung durch den Einsatz von Kubernetes-Diensten und ermöglicht so eine nahtlose Kommunikation zwischen PostgreSQL-Instanzen und anderen Komponenten innerhalb und außerhalb des Kubernetes-Clusters.

Sicherheit und Compliance Die Lösung bietet integrierte Sicherheitsfunktionen wie SSL/TLS-Verschlüsselung, rollenbasierte Zugriffskontrolle (RBAC) und Netzwerkrichtlinien zum Schutz der Datenbank und entspricht den Sicherheits- und Compliance-Standards des Unternehmens.

Überwachung und Protokollierung Cloud Native PostgreSQL erleichtert die einfache Integration mit gängigen Überwachungs- und Protokollierungslösungen und stellt sicher, dass Unternehmen einen klaren Einblick in die Leistung und den Zustand ihrer PostgreSQL-Instanzen haben.

Durch sein Kubernetes-natives Design und die automatisierten Betriebsfunktionen erweist sich Cloud Native PostgreSQL als überzeugende Lösung für Unternehmen, die PostgreSQL ohne die damit verbundenen Komplexitäten auf Kubernetes bereitstellen möchten. In den nächsten Abschnitten werden wir uns eingehender mit den Beweggründen für die Entwicklung von Cloud Native PostgreSQL, seinem Architekturdesign und den konkreten Vorteilen befassen, die es für Unternehmen bietet, die sich in der Cloud-nativen Landschaft zurechtfinden.

Architektonischer Einblick in Cloud Native PostgreSQL

Ein gut durchdachtes Architektur-Framework ist der Grundstein jeder robusten, skalierbaren und verwaltbaren Datenbanklösung. Cloud Native PostgreSQL ist keine Ausnahme. Seine Architektur ist auf den Erfolg in einer Kubernetes-Umgebung zugeschnitten und bewältigt häufige Herausforderungen, die mit der Bereitstellung von herkömmlichem PostgreSQL verbunden sind. Schauen wir uns den architektonischen Entwurf genauer an.

Kubernetes-natives Design

Benutzerdefinierte Ressourcendefinitionen (CRDs) und Operatormuster Cloud Native PostgreSQL nutzt die benutzerdefinierten Ressourcendefinitionen (CRDs) und das Operatormuster von Kubernetes, um eine deklarative API für die Verwaltung von PostgreSQL-Instanzen zu erstellen. Dieses Design ermöglicht eine nahtlose Integration mit Kubernetes und entspricht dessen Prinzipien der deklarativen Konfiguration und Automatisierung.

Controller-Manager-Architektur Durch den Einsatz einer Controller-Manager-Architektur stellt Cloud Native PostgreSQL sicher, dass der vom Benutzer definierte gewünschte Status kontinuierlich mit dem tatsächlichen Status der PostgreSQL-Instanzen innerhalb des Kubernetes-Clusters abgeglichen wird.

State Management

Persistente Speicherintegration Cloud Native PostgreSQL lässt sich nativ in die persistenten Speicherlösungen von Kubernetes wie Persistent Volumes (PV) und Persistent Volume Claims (PVC) integrieren, um die Datenpersistenz über PostgreSQL-Instanzen hinweg zu verwalten.

Konsistenzgarantien Durch die Nutzung bewährter Replikationsmechanismen und Transaktionskontrollen gewährleistet Cloud Native PostgreSQL die Datenkonsistenz über mehrere Instanzen hinweg, selbst in verteilten Bereitstellungen.

Netzwerk- und Serviceerkennung

Kubernetes-Dienste und Ingress-Controller Die Architektur umfasst die Netzwerkprimitive von Kubernetes wie Dienste und Ingress-Controller, um Netzwerke, Lastausgleich und Diensterkennung zu verwalten und so die Konfiguration und Verwaltung der Netzwerkkommunikation zu vereinfachen.

Sicherheit

Integrierte Sicherheitsfunktionen Cloud Native PostgreSQL bietet integrierte Sicherheitsfunktionen wie SSL/TLS-Verschlüsselung, rollenbasierte Zugriffskontrolle (RBAC) und Netzwerkrichtlinien zum Schutz der Datenbankumgebung.

Sicherheitskonformität Die Architektur ist so konzipiert, dass sie sich an den Sicherheits- und Compliance-Standards des Unternehmens orientiert und eine sichere und konforme Datenbankbereitstellung gewährleistet.

Überwachung und Beobachtbarkeit

Überwachungsintegration Cloud Native PostgreSQL erleichtert die Integration mit gängigen Überwachungs- und Protokollierungslösungen und bietet Einblicke in die Leistung, den Zustand und andere Kennzahlen von PostgreSQL-Instanzen.

Ereignisgesteuerte Warnungen Die Architektur unterstützt ereignisgesteuerte Warnungen und ermöglicht so zeitnahe Benachrichtigungen und Reaktionen auf potenzielle Probleme.

Die Architektur von Cloud Native PostgreSQL ist sorgfältig ausgearbeitet, um die Robustheit von PostgreSQL mit der Agilität und Automatisierung von Kubernetes zu vereinen. Dieses Design bewältigt nicht nur die Herausforderungen der Bereitstellung von PostgreSQL auf Kubernetes, sondern eröffnet auch eine Vielzahl von Vorteilen, die im nächsten Abschnitt untersucht werden.

Installation des Cloud Native PostgreSQL

Cloud Native PostgreSQL ist für die native Bereitstellung auf Kubernetes konzipiert und unterstützt die Installation über einen Operator, der über Helm verwaltet werden kann . Stelle sicher, dass Helm auf Deinem Computer installiert ist, bevor Du mit der Installation fortfährst.

Installation des Cloud Native PG Operator

~$ Helm Repo cnpg hinzufügen https://cloudnative-pg.github.io/charts 
~$ Helm Upgrade --install cnpg --namespace Datenbank cnpg/cloudnative-pg

Erstellen eines Deployments

pg-cluster-manifest.yml

---
apiVersion: v1
kind: Secret
metadata:
  name: cluster-user
type: kubernetes.io/basic-auth
data:
  password: <base64 password> 
  username: <base64 username>
---
apiVersion: v1
kind: Secret
metadata:
  name: cluster-superuser
type: kubernetes.io/basic-auth
data:
  password: <base64 password>
  username: cG9zdGdyZXM= # postgres
---
apiVersion: v1
kind: Secret
metadata:
  name: minio-backup-creds
data:
  ACCESS_KEY_ID: <base64 Access Key ID>
  ACCESS_SECRET_KEY: <base64 Access Secret Key>
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: cluster-cnpg
spec:
  description: "Cluster CNPG"
  imageName: ghcr.io/cloudnative-pg/postgresql:15.4
  instances: 3
  startDelay: 300
  stopDelay: 300
  primaryUpdateStrategy: unsupervised
 
  postgresql:
    parameters:
      shared_buffers: 256MB
      pg_stat_statements.max: '10000'
      pg_stat_statements.track: all
      auto_explain.log_min_duration: '10s'
    pg_hba:
      - host all all 10.244.0.0/16 md5
 
  bootstrap:
    initdb:
      database: app
      owner: app
      secret:
        name: cluster-user
 
  superuserSecret:
    name: cluster-superuser
 
  storage:
    storageClass: standard
    size: 1Gi
 
  backup:
    barmanObjectStore:
      destinationPath: s3://cluster-cnpg-backup/
      endpointURL: http://microk8s-hl:9000
      s3Credentials:
        accessKeyId:
          name: minio-backup-creds
          key: ACCESS_KEY_ID
        secretAccessKey:
          name: minio-backup-creds
          key: ACCESS_SECRET_KEY
      wal:
        compression: gzip
        encryption: AES256
      data:
        compression: gzip
        encryption: AES256
        immediateCheckpoint: false
        jobs: 2
    retentionPolicy: "30d"
 
  resources:
    requests:
      memory: "512Mi"
      cpu: "1"
    limits:
      memory: "1Gi"
      cpu: "2"
 
  affinity:
    enablePodAntiAffinity: true
    topologyKey: failure-domain.beta.kubernetes.io/zone
 
  nodeMaintenanceWindow:
    inProgress: false
    reusePVC: false

Ausrollen des Cloud Native PG Deployment

~ $ kubectl -n Datenbank anwenden -f pg-cluster-manifest.yml

Überprüfung der des Deployments

~$ kubectl get Deployment -n Datenbank 
NAME BEREIT BIS ZUM VERFÜGBAREN DATUM ALTER    cnpg - cloudnative - pg              1 / 1 1 1 1 m

Sehen wir uns nun die aus dieser Bereitstellung erstellten Pods an

~ $ kubectl get pods - n Datenbank NAME
 BEREIT STATUS ALTER
 cnpg - cloudnative - pg -576 d97d897 - r6dmh              1/1 Läuft 2 m Cluster - cnpg -1 1/1 Läuft 2 m Cluster - cnpg -3 1/1 Läuft 2 m​ Cluster - cnpg -2 1/1 Läuft 2 m​​

Sieht gut aus! Cloud Native PostgreSQL hat drei Instanzen von PostgreSQL erstellt: ein primäres Lese-/Schreib-Replikat ( cluster-cnpg-1) und zwei schreibgeschützte Replikate. Nun können wir abschließend die erstellten Dienste überprüfen. Wir benötigen diese Dienste, um Datenbankverbindungen aus Ihren Anwendungen herzustellen.

~$  kubectl  get  services  -n  Datenbank 
NAME                   TYP         CLUSTER-IP        PORT(S)      ALTER 
cnpg-webhook-service   ClusterIP    10.156 .188 .123    443 /TCP      5m 
Cluster-cnpg-r         ClusterIP    10.156 .188 .204    5432 /TCP     5m 
Cluster- cnpg-ro        ClusterIP    10.156 .188 .17     5432 /TCP     5m 
cluster-cnpg-rw        ClusterIP    10.156 .188 .25     5432 /TCP     5m

Wir können beobachten, dass Cloud Native PostgreSQL auch drei Dienste erstellt hat, die wir zum Aufbau von Datenbankverbindungen nutzen können. Anschließend können wir einen Datenbank-Load-Balancer wie PgPool verwenden, um eine Verbindung zu diesen Diensten herzustellen. Die Primärdatenbank kann auf eingestellt werden cluster-cnpg-rw, und die Replikatdatenbank kann entweder auf cluster-cnpg-ro oder auf cluster-cnpg-r eingestellt werden.

Glückwunsch! Du hast jetzt eine cloudnative, skalierbare und zuverlässige Distribution von PostgreSQL auf Deinem Kubernetes-Cluster installiert.



Eigenes Container Images erstellen mit de_DE-UTF8 locale

Dockerfile:

FROM postgres:16.2
RUN localedef -i de_DE -c -f UTF-8 -A /usr/share/locale/locale.alias de_DE.UTF-8
ENV LANG de_DE.utf8
it-wiki/kubernetes/cloud-native-postgresql-install-scalable-postgresql-distribution-on-kubernetes.txt · Zuletzt geändert: 2024/04/26 12:32 von marko