sql >> Base de Datos >  >> RDS >> PostgreSQL

Uso de Kubernetes para implementar PostgreSQL

Introducción

Kubernetes es un sistema de orquestación de contenedores de código abierto para automatizar la implementación, el escalado y la gestión de aplicaciones en contenedores. Ejecutar una base de datos PostgreSQL en Kubernetes es un tema de discusión hoy en día, ya que Kubernetes proporciona formas de aprovisionar contenedores con estado utilizando volúmenes persistentes, conjuntos con estado, etc.

Este blog pretendía proporcionar los pasos para ejecutar la base de datos PostgreSQL en el clúster de Kubernetes. No cubre la instalación o configuración del clúster de Kubernetes, aunque ya escribimos sobre esto en este blog sobre MySQL Galera Cluster en Kubernetes.

Requisitos

  • Clúster de Kubernetes en funcionamiento
  • Comprensión básica de Docker

Puede aprovisionar el clúster de Kubernetes en cualquier proveedor de nube pública como AWS, Azure o la nube de Google, etc. Consulte los pasos de instalación y configuración del clúster de Kubernetes para CentOS aquí. También puede consultar la publicación de blog anterior para obtener información básica sobre la implementación de PostgreSQL en el contenedor Docker.

Para implementar PostgreSQL en Kubernetes, debemos seguir los pasos a continuación:

  • Imagen acoplable de Postgres
  • Mapas de configuración para almacenar configuraciones de Postgres
  • Volumen de almacenamiento persistente
  • Implementación de PostgreSQL
  • Servicio PostgreSQL

Imagen acoplable de PostgreSQL

Estamos usando PostgreSQL 10.4 Imagen de Docker del registro público. Esta imagen proporcionará la funcionalidad de proporcionar configuraciones personalizadas/variables de entorno de PostgreSQL como nombre de usuario, contraseña, nombre y ruta de la base de datos, etc.

Mapas de configuración para configuraciones de PostgreSQL

Usaremos mapas de configuración para almacenar información relacionada con PostgreSQL. Aquí, estamos usando la base de datos, el usuario y la contraseña en el mapa de configuración que utilizará el pod de PostgreSQL en la plantilla de implementación.

Archivo:postgres-configmap.yaml

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

Crear recurso de mapas de configuración de Postgres

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

Volumen de almacenamiento persistente

Como todos saben, los contenedores Docker son de naturaleza efímera. Todos los datos generados por o en el contenedor se perderán después de la finalización de la instancia del contenedor.

Para guardar los datos, usaremos volúmenes persistentes y un recurso de reclamo de volumen persistente dentro de Kubernetes para almacenar los datos en almacenamientos persistentes.

Aquí, estamos usando el directorio/ruta local como recurso de almacenamiento persistente (/mnt/data)

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

Crear implementaciones relacionadas con el almacenamiento

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

Despliegue de PostgreSQL

El manifiesto de PostgreSQL para la implementación del contenedor de PostgreSQL utiliza la imagen de PostgreSQL 10.4. Está utilizando la configuración de PostgreSQL como nombre de usuario, contraseña, nombre de la base de datos del mapa de configuración que creamos anteriormente. También monta el volumen creado a partir de los volúmenes persistentes y afirma que los datos del contenedor de PostgreSQL persisten.

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

Crear implementación de Postgres

$ kubectl create -f postgres-deployment.yaml 
deployment "postgres" created
Descargue el documento técnico hoy Administración y automatización de PostgreSQL con ClusterControlObtenga información sobre lo que necesita saber para implementar, monitorear, administrar y escalar PostgreSQLDescargar el documento técnico

Servicio PostgreSQL

Para acceder a la implementación o al contenedor, debemos exponer el servicio de PostgreSQL. Kubernetes proporciona diferentes tipos de servicios como ClusterIP, NodePort y LoadBalancer.

Con ClusterIP podemos acceder al servicio de PostgreSQL dentro de Kubernetes. NodePort brinda la capacidad de exponer el punto final del servicio en los nodos de Kubernetes. Para acceder a PostgreSQL externamente, necesitamos usar un tipo de servicio Load Balancer que exponga el servicio externamente.

Archivo:postgres-service.yaml

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

Crear servicio de Postgres

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

Conectarse a PostgreSQL

Para conectar PostgreSQL, necesitamos obtener el puerto del nodo de la implementación del servicio.

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

Necesitamos usar el puerto 31070 para conectarnos a PostgreSQL desde la máquina/nodo presente en el clúster de Kubernetes con las credenciales proporcionadas en el mapa de configuración anterior.

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

Eliminar implementaciones de PostgreSQL

Para eliminar los recursos de PostgreSQL, necesitamos usar los siguientes comandos.

# 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

Con suerte, siguiendo los pasos anteriores, podrá aprovisionar una instancia de PostgreSQL independiente en un clúster de Kubernetes.

Conclusión

Ejecutar PostgreSQL en Kubernetes ayuda a utilizar los recursos de una mejor manera que cuando solo se usan máquinas virtuales. Kubernetes también proporciona aislamiento de otras aplicaciones que usan PostgreSQL dentro de la misma máquina virtual o clúster de Kubernetes.

Este artículo proporciona una descripción general sobre cómo podemos usar PostgreSQL en Kubernetes para el entorno de desarrollo/POC. Puede explorar/configurar el clúster de PostgreSQL utilizando conjuntos de estado de Kubernetes.

¿Se requieren conjuntos con estado?

En Kubernetes, se requieren StatefulSets para escalar aplicaciones con estado. PostgreSQL se puede escalar fácilmente usando StatefulSets con un solo comando.

Referencias

  • Instalación de Kubernetes en CentOS:https://www.techrepublic.com/article/how-to-install-a-kubernetes-cluster-oen-centos-7
  • Configuración de Kubectl:https://kubernetes.io/docs/tasks/tools/install-kubectl
  • PostgreSQL usando Docker:https://severalnines.com/blog/deploying-postgresql-docker-container
  • Kubernetes:https://kubernetes.io
  • Clúster de PostgreSQL usando statefulsets https://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets