PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Utilizzo di Kubernetes per distribuire PostgreSQL

Introduzione

Kubernetes è un sistema di orchestrazione di container open source per automatizzare la distribuzione, la scalabilità e la gestione delle applicazioni containerizzate. L'esecuzione di un database PostgreSQL su Kubernetes è un argomento di discussione al giorno d'oggi poiché Kubernetes fornisce modi per eseguire il provisioning di container con stato utilizzando volumi persistenti, set di stati, ecc.

Questo blog intendeva fornire i passaggi per eseguire il database PostgreSQL sul cluster Kubernetes. Non copre l'installazione o la configurazione del cluster Kubernetes, anche se ne abbiamo già parlato in questo blog su MySQL Galera Cluster su Kubernetes.

Prerequisiti

  • Gruppo Kubernetes funzionante
  • Conoscenza di base di Docker

Puoi eseguire il provisioning del cluster Kubernetes su qualsiasi provider di cloud pubblico come AWS, Azure o Google cloud, ecc. Fai riferimento ai passaggi di installazione e configurazione del cluster Kubernetes per CentOS qui. Puoi anche controllare il post precedente del blog per informazioni di base sulla distribuzione di PostgreSQL nel contenitore Docker.

Per distribuire PostgreSQL su Kubernetes dobbiamo seguire i passaggi seguenti:

  • Immagine Docker Postgres
  • Config Maps per memorizzare le configurazioni di Postgres
  • Volume di archiviazione persistente
  • Distribuzione PostgreSQL
  • Servizio PostgreSQL

Immagine Docker PostgreSQL

Stiamo usando PostgreSQL 10.4 Immagine Docker dal registro pubblico. Questa immagine fornirà la funzionalità di fornire configurazioni personalizzate/variabili di ambiente di PostgreSQL come nome utente, password, nome e percorso del database, ecc.

Configura mappe per configurazioni PostgreSQL

Useremo le mappe di configurazione per memorizzare le informazioni relative a PostgreSQL. Qui utilizziamo il database, l'utente e la password nella mappa di configurazione che verrà utilizzata dal pod PostgreSQL nel modello di distribuzione.

File:postgres-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
  labels:
    app: postgres
data:
  POSTGRES_DB: postgresdb
  POSTGRES_USER: postgresadmin
  POSTGRES_PASSWORD: admin123

Crea una risorsa per le mappe di configurazione di Postgres

$ kubectl create -f postgres-configmap.yaml 
configmap "postgres-config" created

Volume di archiviazione persistente

Come tutti sapete, i container Docker sono di natura effimera. Tutti i dati generati da o nel contenitore andranno persi dopo la chiusura dell'istanza del contenitore.

Per salvare i dati, utilizzeremo i volumi persistenti e la risorsa di richiesta di volume persistente all'interno di Kubernetes per archiviare i dati su archivi persistenti.

Qui stiamo usando la directory/il percorso locale come risorsa di archiviazione persistente (/mnt/data)

File: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

Crea implementazioni relative allo storage

$ kubectl create -f postgres-storage.yaml 
persistentvolume "postgres-pv-volume" created
persistentvolumeclaim "postgres-pv-claim" created

Distribuzione PostgreSQL

Il manifest PostgreSQL per la distribuzione del contenitore PostgreSQL utilizza l'immagine PostgreSQL 10.4. Sta usando la configurazione di PostgreSQL come nome utente, password, nome del database dalla mappa di configurazione che abbiamo creato in precedenza. Monta anche il volume creato dai volumi persistenti e afferma di rendere persistenti i dati del contenitore PostgreSQL.

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

Crea distribuzione Postgres

$ kubectl create -f postgres-deployment.yaml 
deployment "postgres" created
Scarica il whitepaper oggi Gestione e automazione di PostgreSQL con ClusterControlScopri cosa devi sapere per distribuire, monitorare, gestire e ridimensionare PostgreSQLScarica il whitepaper

Servizio PostgreSQL

Per accedere alla distribuzione o al contenitore, è necessario esporre il servizio PostgreSQL. Kubernetes fornisce diversi tipi di servizi come ClusterIP, NodePort e LoadBalancer.

Con ClusterIP possiamo accedere al servizio PostgreSQL all'interno di Kubernetes. NodePort offre la possibilità di esporre l'endpoint del servizio sui nodi Kubernetes. Per accedere a PostgreSQL esternamente, dobbiamo utilizzare un tipo di servizio Load Balancer che esponga il servizio esternamente.

File:postgres-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  type: NodePort
  ports:
   - port: 5432
  selector:
   app: postgres

Crea un servizio Postgres

$ kubectl create -f postgres-service.yaml 
service "postgres" created

Connetti a PostgreSQL

Per connettere PostgreSQL, dobbiamo ottenere la porta Node dalla distribuzione del servizio.

$ kubectl get svc postgres
NAME       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
postgres   NodePort   10.107.71.253   <none>        5432:31070/TCP   5m

Dobbiamo usare la porta 31070 per connetterci a PostgreSQL dalla macchina/nodo presente nel cluster kubernetes con le credenziali fornite in precedenza nella mappa di configurazione.

$ psql -h localhost -U postgresadmin1 --password -p 31070 postgresdb
Password for user postgresadmin1: 
psql (10.4)
Type "help" for help.
 
postgresdb=#

Elimina le distribuzioni PostgreSQL

Per eliminare le risorse PostgreSQL, dobbiamo usare i comandi seguenti.

# 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

Si spera che utilizzando i passaggi precedenti sia possibile eseguire il provisioning di un'istanza PostgreSQL autonoma su un cluster Kubernetes.

Conclusione

L'esecuzione di PostgreSQL su Kubernetes aiuta a utilizzare le risorse in un modo migliore rispetto a quando si utilizzano solo macchine virtuali. Kubernetes fornisce anche l'isolamento di altre applicazioni che utilizzano PostgreSQL all'interno della stessa macchina virtuale o cluster Kubernetes.

Questo articolo fornisce una panoramica su come utilizzare PostgreSQL su Kubernetes per l'ambiente di sviluppo/POC. Puoi esplorare/configurare il cluster PostgreSQL utilizzando i set di stati di Kubernetes.

StatefulSets necessari?

In Kubernetes, gli StatefulSet sono necessari per ridimensionare le applicazioni con stato. PostgreSQL può essere facilmente ridimensionato utilizzando StatefulSets con un singolo comando.

Riferimenti

  • Installazione di Kubernetes su CentOS:https://www.techrepublic.com/article/how-to-install-a-kubernetes-cluster-oen-centos-7
  • Configurazione di Kubectl:https://kubernetes.io/docs/tasks/tools/install-kubectl
  • PostgreSQL utilizzando Docker:https://diversealnines.com/blog/deploying-postgresql-docker-container
  • Kubernetes:https://kubernetes.io
  • Cluster PostgreSQL che utilizza statefulsets https://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets