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