Einführung
Kubernetes ist ein Open-Source-Container-Orchestrierungssystem zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen. Das Ausführen einer PostgreSQL-Datenbank auf Kubernetes ist heutzutage ein Diskussionsthema, da Kubernetes Möglichkeiten bietet, Stateful-Container mithilfe von persistenten Volumes, Statefulsets usw. bereitzustellen.
Dieser Blog soll Schritte zum Ausführen der PostgreSQL-Datenbank auf einem Kubernetes-Cluster bereitstellen. Die Installation oder Konfiguration des Kubernetes-Clusters wird nicht behandelt, obwohl wir zuvor in diesem Blog zu MySQL Galera Cluster on Kubernetes darüber geschrieben haben.
Voraussetzungen
- Funktionierender Kubernetes-Cluster
- Grundlegendes Verständnis von Docker
Sie können den Kubernetes-Cluster auf jedem öffentlichen Cloud-Anbieter wie AWS, Azure oder Google Cloud usw. bereitstellen. Siehe Installations- und Konfigurationsschritte für Kubernetes-Cluster für CentOS hier. Sie können auch den früheren Blog-Beitrag für Grundlagen zum Bereitstellen von PostgreSQL auf Docker-Containern lesen.
Um PostgreSQL auf Kubernetes bereitzustellen, müssen wir die folgenden Schritte ausführen:
- Postgres-Docker-Image
- Config Maps zum Speichern von Postgres-Konfigurationen
- Persistentes Speichervolume
- PostgreSQL-Bereitstellung
- PostgreSQL-Dienst
PostgreSQL-Docker-Image
Wir verwenden PostgreSQL 10.4 Docker-Image aus der öffentlichen Registrierung. Dieses Image bietet die Funktionalität zum Bereitstellen benutzerdefinierter Konfigurationen/Umgebungsvariablen von PostgreSQL wie Benutzername, Passwort, Datenbankname und -pfad usw.
Config Maps für PostgreSQL-Konfigurationen
Wir werden Konfigurationszuordnungen zum Speichern von PostgreSQL-bezogenen Informationen verwenden. Hier verwenden wir die Datenbank, den Benutzer und das Passwort in der Konfigurationszuordnung, die vom PostgreSQL-Pod in der Bereitstellungsvorlage verwendet werden.
Datei:postgres-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB: postgresdb
POSTGRES_USER: postgresadmin
POSTGRES_PASSWORD: admin123
Postgres-Konfigurationszuordnungsressource erstellen
$ kubectl create -f postgres-configmap.yaml
configmap "postgres-config" created
Persistenter Speicherdatenträger
Wie Sie alle wissen, sind Docker-Container von Natur aus kurzlebig. Alle Daten, die vom oder im Container generiert werden, gehen nach Beendigung der Containerinstanz verloren.
Um die Daten zu speichern, werden wir Persistent Volumes und Persistent Volume Claim-Ressourcen in Kubernetes verwenden, um die Daten auf Persistent Storages zu speichern.
Hier verwenden wir lokales Verzeichnis/Pfad als persistente Speicherressource (/mnt/data)
Datei:postgres-storage.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: postgres-pv-volume
labels:
type: local
app: postgres
spec:
storageClassName: manual
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/mnt/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-pv-claim
labels:
app: postgres
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
Speicherbezogene Bereitstellungen erstellen
$ kubectl create -f postgres-storage.yaml
persistentvolume "postgres-pv-volume" created
persistentvolumeclaim "postgres-pv-claim" created
PostgreSQL-Bereitstellung
Das PostgreSQL-Manifest für die Bereitstellung des PostgreSQL-Containers verwendet das PostgreSQL 10.4-Image. Es verwendet die PostgreSQL-Konfiguration wie Benutzername, Passwort, Datenbankname aus der zuvor erstellten Konfigurationskarte. Es stellt auch das Volume bereit, das aus den persistenten Volumes erstellt wurde, und behauptet, die Daten des PostgreSQL-Containers persistent zu machen.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:10.4
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumes:
- name: postgredb
persistentVolumeClaim:
claimName: postgres-pv-claim
Postgres-Bereitstellung erstellen
$ kubectl create -f postgres-deployment.yaml
deployment "postgres" created
Laden Sie noch heute das Whitepaper PostgreSQL-Verwaltung und -Automatisierung mit ClusterControl herunterErfahren Sie, was Sie wissen müssen, um PostgreSQL bereitzustellen, zu überwachen, zu verwalten und zu skalierenLaden Sie das Whitepaper herunter PostgreSQL-Dienst
Um auf die Bereitstellung oder den Container zuzugreifen, müssen wir den PostgreSQL-Dienst verfügbar machen. Kubernetes bietet verschiedene Arten von Diensten wie ClusterIP, NodePort und LoadBalancer.
Mit ClusterIP können wir auf den PostgreSQL-Dienst innerhalb von Kubernetes zugreifen. NodePort bietet die Möglichkeit, Dienstendpunkte auf den Kubernetes-Knoten verfügbar zu machen. Für den externen Zugriff auf PostgreSQL müssen wir einen Load Balancer-Diensttyp verwenden, der den Dienst extern verfügbar macht.
Datei:postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
type: NodePort
ports:
- port: 5432
selector:
app: postgres
Postgres-Dienst erstellen
$ kubectl create -f postgres-service.yaml
service "postgres" created
Mit PostgreSQL verbinden
Um PostgreSQL zu verbinden, müssen wir den Node-Port von der Dienstbereitstellung abrufen.
$ kubectl get svc postgres
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgres NodePort 10.107.71.253 <none> 5432:31070/TCP 5m
Wir müssen Port 31070 verwenden, um eine Verbindung zu PostgreSQL von einem Computer/Knoten herzustellen, der im Kubernetes-Cluster vorhanden ist, mit Anmeldeinformationen, die zuvor in der Konfigurationskarte angegeben wurden.
$ psql -h localhost -U postgresadmin1 --password -p 31070 postgresdb
Password for user postgresadmin1:
psql (10.4)
Type "help" for help.
postgresdb=#
PostgreSQL-Bereitstellungen löschen
Zum Löschen von PostgreSQL-Ressourcen müssen wir die folgenden Befehle verwenden.
# kubectl delete service postgres
# kubectl delete deployment postgres
# kubectl delete configmap postgres-config
# kubectl delete persistentvolumeclaim postgres-pv-claim
# kubectl delete persistentvolume postgres-pv-volume
Hoffentlich können Sie mit den obigen Schritten eine eigenständige PostgreSQL-Instanz in einem Kubernetes-Cluster bereitstellen.
Schlussfolgerung
Das Ausführen von PostgreSQL auf Kubernetes hilft dabei, Ressourcen besser zu nutzen, als wenn nur virtuelle Maschinen verwendet werden. Kubernetes bietet auch die Isolierung anderer Anwendungen, die PostgreSQL innerhalb derselben virtuellen Maschine oder desselben Kubernetes-Clusters verwenden.
Dieser Artikel bietet einen Überblick darüber, wie wir PostgreSQL auf Kubernetes für Entwicklungs-/POC-Umgebungen verwenden können. Sie können PostgreSQL-Cluster mit Statefulsets von Kubernetes erkunden/einrichten.
StatefulSets erforderlich?
In Kubernetes sind StatefulSets erforderlich, um zustandsbehaftete Anwendungen zu skalieren. PostgreSQL kann mithilfe von StatefulSets einfach mit einem einzigen Befehl skaliert werden.
Referenzen
- Kubernetes-Installation auf CentOS:https://www.techrepublic.com/article/how-to-install-a-kubernetes-cluster-oen-centos-7
- Kubectl-Setup:https://kubernetes.io/docs/tasks/tools/install-kubectl
- PostgreSQL mit Docker:https://severalnines.com/blog/deploying-postgresql-docker-container
- Kubernetes:https://kubernetes.io
- PostgreSQL-Cluster mit Statefulsets https://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets