Introdução
Kubernetes é um sistema de orquestração de contêineres de código aberto para automatizar a implantação, dimensionamento e gerenciamento de aplicativos em contêineres. A execução de um banco de dados PostgreSQL no Kubernetes é um tópico de discussão hoje em dia, pois o Kubernetes fornece maneiras de provisionar contêineres com estado usando volumes persistentes, conjuntos de estado, etc.
Este blog pretende fornecer etapas para executar o banco de dados PostgreSQL no cluster Kubernetes. Ele não cobre a instalação ou configuração do cluster Kubernetes, embora tenhamos escrito anteriormente sobre isso neste blog no MySQL Galera Cluster on Kubernetes.
Pré-requisitos
- Cluster Kubernetes em funcionamento
- Compreensão básica do Docker
Você pode provisionar o cluster Kubernetes em qualquer provedor de nuvem pública, como AWS, Azure ou Google cloud, etc. Consulte as etapas de instalação e configuração do cluster Kubernetes para CentOS aqui. Você também pode verificar a postagem anterior do blog para obter informações básicas sobre a implantação do PostgreSQL no contêiner do Docker.
Para implantar o PostgreSQL no Kubernetes, precisamos seguir os passos abaixo:
- Imagem do Docker Postgres
- Config Maps para armazenar configurações do Postgres
- Volume de armazenamento persistente
- Implantação do PostgreSQL
- Serviço PostgreSQL
Imagem do Docker PostgreSQL
Estamos usando o PostgreSQL 10.4 Imagem do Docker do registro público. Esta imagem fornecerá a funcionalidade de fornecer configurações personalizadas/variáveis de ambiente do PostgreSQL como nome de usuário, senha, nome e caminho do banco de dados, etc.
Mapas de configuração para configurações do PostgreSQL
Usaremos mapas de configuração para armazenar informações relacionadas ao PostgreSQL. Aqui, estamos usando o banco de dados, usuário e senha no mapa de configuração que será usado pelo pod PostgreSQL no modelo de implantação.
Arquivo:postgres-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB: postgresdb
POSTGRES_USER: postgresadmin
POSTGRES_PASSWORD: admin123
Criar recurso de mapas de configuração do Postgres
$ kubectl create -f postgres-configmap.yaml
configmap "postgres-config" created
Volume de armazenamento persistente
Como todos sabem, os contêineres do Docker são efêmeros por natureza. Todos os dados gerados por ou no contêiner serão perdidos após o término da instância do contêiner.
Para salvar os dados, usaremos volumes persistentes e recurso de reivindicação de volume persistente no Kubernetes para armazenar os dados em armazenamentos persistentes.
Aqui, estamos usando o diretório/caminho local como recurso de armazenamento persistente (/mnt/data)
Arquivo: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
Criar implantações relacionadas ao armazenamento
$ kubectl create -f postgres-storage.yaml
persistentvolume "postgres-pv-volume" created
persistentvolumeclaim "postgres-pv-claim" created
Implantação do PostgreSQL
O manifesto PostgreSQL para implantação do contêiner PostgreSQL usa a imagem PostgreSQL 10.4. Ele está usando a configuração do PostgreSQL como nome de usuário, senha, nome do banco de dados do configmap que criamos anteriormente. Ele também monta o volume criado a partir dos volumes persistentes e declarações para fazer com que os dados do contêiner PostgreSQL persistam.
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
Criar implantação do Postgres
$ kubectl create -f postgres-deployment.yaml
deployment "postgres" created
Baixe o whitepaper hoje PostgreSQL Management &Automation with ClusterControlSaiba o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o PostgreSQLBaixe o whitepaper Serviço PostgreSQL
Para acessar a implantação ou contêiner, precisamos expor o serviço PostgreSQL. Kubernetes fornece diferentes tipos de serviços como ClusterIP, NodePort e LoadBalancer.
Com o ClusterIP podemos acessar o serviço PostgreSQL dentro do Kubernetes. O NodePort oferece a capacidade de expor o endpoint de serviço nos nós do Kubernetes. Para acessar o PostgreSQL externamente, precisamos usar um tipo de serviço Load Balancer que expõe o serviço externamente.
Arquivo:postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
type: NodePort
ports:
- port: 5432
selector:
app: postgres
Criar serviço Postgres
$ kubectl create -f postgres-service.yaml
service "postgres" created
Conectar ao PostgreSQL
Para conectar o PostgreSQL, precisamos obter a porta Node da implantação do serviço.
$ kubectl get svc postgres
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgres NodePort 10.107.71.253 <none> 5432:31070/TCP 5m
Precisamos usar a porta 31070 para conectar ao PostgreSQL da máquina/nó presente no cluster kubernetes com as credenciais fornecidas no configmap anterior.
$ psql -h localhost -U postgresadmin1 --password -p 31070 postgresdb
Password for user postgresadmin1:
psql (10.4)
Type "help" for help.
postgresdb=#
Excluir implantações do PostgreSQL
Para exclusão de recursos do PostgreSQL, precisamos usar os comandos abaixo.
# 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
Espero que, usando as etapas acima, você possa provisionar uma instância autônoma do PostgreSQL em um cluster do Kubernetes.
Conclusão
A execução do PostgreSQL no Kubernetes ajuda a utilizar os recursos de uma maneira melhor do que apenas usando máquinas virtuais. O Kubernetes também fornece isolamento de outros aplicativos usando PostgreSQL dentro da mesma máquina virtual ou cluster Kubernetes.
Este artigo fornece uma visão geral sobre como podemos usar o PostgreSQL no Kubernetes para ambiente de desenvolvimento/POC. Você pode explorar/configurar o cluster PostgreSQL usando statefulsets do Kubernetes.
StatefulSets necessários?
No Kubernetes, StatefulSets são necessários para dimensionar aplicativos com estado. O PostgreSQL pode ser facilmente dimensionado usando StatefulSets com um único comando.
Referências
- Instalação do Kubernetes no CentOS:https://www.techrepublic.com/article/how-to-install-a-kubernetes-cluster-oen-centos-7
- Configuração do Kubectl:https://kubernetes.io/docs/tasks/tools/install-kubectl
- PostgreSQL usando o Docker:https://severalnines.com/blog/deploying-postgresql-docker-container
- Kubernetes:https://kubernetes.io
- Cluster PostgreSQL usando statefulsets https://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets