Como implantar Postgres no cluster Kubernetes
O autor selecionou Girst Who Code para receber uma doação como parte do programa Write for DOnations.
Introdução
A implantação de um banco de dados PostgreSQL em um cluster Kubernetes tornou-se uma abordagem popular para gerenciar ambientes de banco de dados escaláveis, resilientes e dinâmicos. O Kubernetes possui recursos de orquestração de contêineres que oferecem uma estrutura robusta para implantação e gerenciamento de aplicativos, incluindo bancos de dados como PostgreSQL, em um ambiente distribuído. Essa integração oferece vantagens significativas de escalabilidade, resiliência e utilização eficiente de recursos. Ao aproveitar os recursos do Kubernetes, como escalabilidade, implantação automatizada e recursos de autocorreção, os usuários podem garantir a operação perfeita de seus bancos de dados PostgreSQL em um ambiente conteinerizado.
Este guia explorará o processo passo a passo de implantação do PostgreSQL em um cluster Kubernetes. Quer você seja um desenvolvedor, engenheiro de DevOps ou administrador de sistema que deseja implantar o PostgreSQL em um ambiente Kubernetes de maneira eficaz, este guia tem como objetivo fornecer insights abrangentes e etapas práticas para configurar e gerenciar bancos de dados PostgreSQL com êxito em um cluster Kubernetes.
Pré-requisitos
Antes de começar este tutorial, você precisará do seguinte:
Um servidor de desenvolvimento ou máquina local a partir da qual você implantará o PostgreSQL.
-
A ferramenta de linha de comando kubectl está instalada em sua máquina de desenvolvimento. Para instalar isso, siga este guia da documentação oficial do Kubernetes.
Um cluster Kubernetes. Você pode provisionar um cluster DigitalOcean Kubernetes seguindo nosso guia de início rápido do Kubernetes.
Crie um ConfigMap para armazenar detalhes do banco de dados
No Kubernetes, um ConfigMap é um objeto API que armazena dados de configuração em pares chave-valor, que pods ou contêineres podem usar em um cluster. O ConfigMaps ajuda a separar os detalhes de configuração do código do aplicativo, facilitando o gerenciamento e a atualização das definições de configuração sem alterar o código do aplicativo.
Vamos criar um arquivo de configuração ConfigMap para armazenar detalhes de conexão PostgreSQL, como nome do host, nome do banco de dados, nome de usuário e outras configurações.
nano postgres-configmap.yaml
Adicione a seguinte configuração. Defina o nome, usuário e senha padrão do banco de dados.
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-secret
labels:
app: postgres
data:
POSTGRES_DB: ps_db
POSTGRES_USER: ps_user
POSTGRES_PASSWORD: SecurePassword
Vamos analisar a configuração acima:
apiVersion: v1 especifica a versão da API Kubernetes usada para este ConfigMap.
kind: ConfigMap define o tipo de recurso do Kubernetes.
Em metadados, o campo nome especifica o nome do ConfigMap, definido como “postgres-secret. ” Além disso, rótulos são aplicados ao ConfigMap para ajudar a identificar e organizar recursos.
A seção dados contém os dados de configuração como pares de valores-chave.
-
POSTGRES_DB: Especifique o nome do banco de dados padrão para PostgreSQL.
POSTGRES_USER: Especifique o nome de usuário padrão para PostgreSQL.
POSTGRES_PASSWORD: Especifique a senha padrão para o usuário PostgreSQL.
Armazenar dados confidenciais em um ConfigMap não é recomendado devido a questões de segurança. Ao lidar com dados confidenciais no Kubernetes, é essencial usar Secrets e seguir as práticas recomendadas de segurança para garantir a proteção e confidencialidade de seus dados.
Salve e feche o arquivo e aplique a configuração do ConfigMap ao Kubernetes.
kubectl apply -f postgres-configmap.yaml
Você pode verificar a implantação do ConfigMap usando o comando a seguir.
kubectl get configmap
Saída.
NAME DATA AGE
kube-root-ca.crt 1 116s
postgres-secret 3 12s
Crie um PersistentVolume (PV) e um PersistentVolumeClaim (PVC)
PersistentVolume (PV) e PersistentVolumeClaim (PVC) são recursos do Kubernetes que fornecem e reivindicam armazenamento persistente em um cluster. Um PersistentVolume fornece recursos de armazenamento no cluster, enquanto um PersistentVolumeClaim permite que os pods solicitem recursos de armazenamento específicos.
Primeiro, crie um arquivo YAML para PersistentVolume.
nano psql-pv.yaml
Adicione a seguinte configuração.
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-volume
labels:
type: local
app: postgres
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
hostPath:
path: /data/postgresql
Aqui está a explicação de cada componente:
storageClassName: manual especifica o StorageClass para este PersistentVolume. O StorageClass denominado “manual” indica que o provisionamento do armazenamento é feito manualmente.
Capacidade especifica a capacidade desejada do PersistentVolume.
accessModes define os modos de acesso suportados pelo PersistentVolume. Nesse caso, é definido como ReadWriteMany, permitindo que vários pods leiam e gravem no volume simultaneamente.
hostPath é o tipo de volume criado diretamente no sistema de arquivos do nó. É um diretório no sistema de arquivos da máquina host (caminho: “/data/postgresql”) que será usado como local de armazenamento para o PersistentVolume. Este caminho se refere a um local no host onde os dados do PersistentVolume serão armazenados.
Salve o arquivo e aplique a configuração acima ao Kubernetes.
kubectl apply -f psql-pv.yaml
Em seguida, crie um YAML para PersistentVolumeClaim.
nano psql-claim.yaml
Adicione as seguintes configurações.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-volume-claim
labels:
app: postgres
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
Vamos decompor os componentes:
kind: PersistentVolumeClaim indica que este YAML define um recurso PersistentVolumeClaim.
storageClassName: manual especifica o StorageClass desejado para este PersistentVolumeClaim.
accessModes especifica o modo de acesso exigido pelo PersistentVolumeClaim.
Recursos definem os recursos solicitados para o PersistentVolumeClaim:
A seção solicitações especifica a quantidade de armazenamento solicitada.
Salve o arquivo e aplique a configuração ao Kubernetes.
kubectl apply -f psql-claim.yaml
Agora, use o seguinte comando para listar todos os PersistentVolumes criados em seu cluster Kubernetes:
kubectl get pv
Este comando exibirá detalhes sobre cada PersistentVolume, incluindo nome, capacidade, modos de acesso, status, política de recuperação e classe de armazenamento.
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
postgres-volume 10Gi RWX Retain Bound default/postgres-volume-claim manual 34s
Para listar todos os PersistentVolumeClaims no cluster, use o seguinte comando:
kubectl get pvc
Este comando mostrará informações sobre os PersistentVolumeClaims, incluindo seus nomes, status, armazenamento solicitado, volumes vinculados e seu PersistentVolume correspondente, se estiverem vinculados.
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
postgres-volume-claim Bound postgres-volume 10Gi RWX manual 22s
Crie uma implantação PostgreSQL
A criação de uma implantação PostgreSQL no Kubernetes envolve a definição de um manifesto de implantação para orquestrar os pods PostgreSQL.
Crie um arquivo YAML ps-deployment.yaml
para definir a implantação do PostgreSQL.
nano ps-deployment.yaml
Adicione o seguinte conteúdo.
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 3
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: 'postgres:14'
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-secret
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgresdata
volumes:
- name: postgresdata
persistentVolumeClaim:
claimName: postgres-volume-claim
Aqui está uma breve explicação de cada parâmetro:
réplicas: 3 especifica o número desejado de réplicas.
O seletor especifica como a implantação identifica quais pods ela gerencia.
template define o modelo de pod usado para criar novos pods controlados por esta implantação. Em metadados, o campo de rótulos atribui rótulos aos pods criados a partir deste modelo, com app: postgres.
containers especificam os contêineres dentro do pod.
nome: postgres é o nome atribuído ao contêiner.
image: postgres:14 especifica a imagem Docker para o banco de dados PostgreSQL.
imagePullPolicy: “IfNotPresent ” especifica a política para extrair a imagem do contêiner.
portas especificam as portas que o contêiner expõe.
envFrom permite que o contêiner carregue variáveis de ambiente de um ConfigMap.
volumeMounts permite montar volumes no contêiner.
volumes definem os volumes que podem ser montados no pod.
nome: postgresdata especifica o nome do volume.
persistentVolumeClaim refere-se a um PersistentVolumeClaim denominado “postgres-volume-claim”. Esta declaração provavelmente é usada para fornecer armazenamento persistente ao contêiner PostgreSQL para que os dados sejam retidos durante reinicializações ou reprogramações do pod.
Salve e feche o arquivo e aplique a implantação.
kubectl apply -f ps-deployment.yaml
Este comando cria a implantação do PostgreSQL com base nas especificações fornecidas no arquivo YAML.
Para verificar o status da implantação criada:
kubectl get deployments
A saída a seguir confirma que a implantação do PostgreSQL foi criada com sucesso.
NAME READY UP-TO-DATE AVAILABLE AGE
postgres 3/3 3 3 17s
Para verificar os pods em execução, execute o seguinte comando.
kubectl get pods
Você verá os pods em execução na saída a seguir.
NAME READY STATUS RESTARTS AGE
postgres-665b7554dc-cddgq 1/1 Running 0 28s
postgres-665b7554dc-kh4tr 1/1 Running 0 28s
postgres-665b7554dc-mgprp 1/1 Running 1 (11s ago) 28s
Crie um serviço para PostgreSQL
No Kubernetes, um serviço é usado para definir um conjunto lógico de pods que permite que outros pods dentro do cluster se comuniquem com um conjunto de pods sem a necessidade de saber os endereços IP específicos desses pods.
Vamos criar um arquivo de manifesto de serviço para expor o PostgreSQL internamente no cluster Kubernetes:
nano ps-service.yaml
Adicione a seguinte configuração.
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
type: NodePort
ports:
- port: 5432
selector:
app: postgres
Salve o arquivo e aplique esta configuração YAML ao Kubernetes.
kubectl apply -f ps-service.yaml
Depois que o serviço é criado, outros aplicativos ou serviços dentro do cluster Kubernetes podem se comunicar com o banco de dados PostgreSQL usando o nome Postgres e a porta 5432 como ponto de entrada.
Você pode verificar a implantação do serviço usando o comando a seguir.
kubectl get svc
Saída.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6m6s
postgres NodePort 10.98.119.102 <none> 5432:30344/TCP 6s
Conecte-se ao PostgreSQL via kubectl
Primeiro, liste os pods disponíveis em seu namespace para encontrar o pod PostgreSQL:
kubectl get pods
Você verá os pods em execução na saída a seguir.
NAME READY STATUS RESTARTS AGE
postgres-665b7554dc-cddgq 1/1 Running 0 28s
postgres-665b7554dc-kh4tr 1/1 Running 0 28s
postgres-665b7554dc-mgprp 1/1 Running 1 (11s ago) 28s
Localize o nome do pod PostgreSQL na saída.
Depois de identificar o pod PostgreSQL, use o comando kubectl exec para conectar o pod PostgreSQL.
kubectl exec -it postgres-665b7554dc-cddgq -- psql -h localhost -U ps_user --password -p 5432 ps_db
postgres-665b7554dc-cddgq: este é o nome do pod onde o contêiner PostgreSQL está sendo executado.
ps_user: Especifica o nome de usuário que será usado para conectar-se ao banco de dados PostgreSQL.
–password: solicita a senha de forma interativa.
ps_db: especifica o nome do banco de dados ao qual se conectar depois de autenticado com o usuário fornecido.
Você será solicitado a fornecer uma senha para usuários do Postgres. Após a autenticação bem-sucedida, você entrará no shell do Postgres.
Password:
psql (14.10 (Debian 14.10-1.pgdg120+1))
Type "help" for help.
ps_db=#
Em seguida, verifique a conexão PostgreSQL usando o seguinte comando.
ps_db=# \conninfo
Você verá a seguinte saída.
You are connected to database "ps_db" as user "ps_user" on host "localhost" (address "::1") at port "5432".
Você pode sair do shell do PostgreSQL usando o seguinte comando.
exit
Dimensione a implantação do PostgreSQL
O dimensionamento de uma implantação do PostgreSQL no Kubernetes envolve o ajuste do número de réplicas no Deployment ou StatefulSet que gerencia os pods do PostgreSQL.
Primeiro, verifique o estado atual da sua implantação do PostgreSQL:
kubectl get pods -l app=postgres
Saída.
postgres-665b7554dc-cddgq 1/1 Running 0 2m12s
postgres-665b7554dc-kh4tr 1/1 Running 0 2m12s
postgres-665b7554dc-mgprp 1/1 Running 1 (115s ago) 2m12s
Para dimensionar a implantação do PostgreSQL para 5 réplicas, use o comando kubectl scale:
kubectl scale deployment --replicas=5 postgres
Substitua 5 pelo número de réplicas desejadas para sua implantação do PostgreSQL.
Em seguida, verifique novamente o status da sua implantação para garantir que a operação de escalabilidade foi bem-sucedida:
kubectl get pods -l app=postgres
Você verá que o número de pods aumentou para 5:
NAME READY STATUS RESTARTS AGE
postgres-665b7554dc-cddgq 1/1 Running 0 3m56s
postgres-665b7554dc-ftxbl 1/1 Running 0 10s
postgres-665b7554dc-g2nh6 1/1 Running 0 10s
postgres-665b7554dc-kh4tr 1/1 Running 0 3m56s
postgres-665b7554dc-mgprp 1/1 Running 1 (3m39s ago) 3m56s
Backup e restauração do banco de dados PostgreSQL
Você pode fazer backup de um banco de dados PostgreSQL em execução em um pod do Kubernetes usando o comando kubectl exec em conjunto com a ferramenta pg_dump diretamente no pod.
Primeiro, liste todos os pods para encontrar o nome do seu pod PostgreSQL:
kubectl get pods
Em seguida, use o comando kubectl exec para executar o comando pg_dump dentro do pod PostgreSQL:
kubectl exec -it postgres-665b7554dc-cddgq -- pg_dump -U ps_user -d ps_db > db_backup.sql
Este comando faz dump do banco de dados e redireciona a saída para um arquivo chamado db_backup.sql
no diretório local.
Para restaurar o banco de dados de volta ao pod do Kubernetes, você precisará do arquivo de dump SQL e do uso do comando psql para executar o processo de restauração.
Primeiro, use o comando kubectl cp para copiar o arquivo de dump SQL da sua máquina local para o pod PostgreSQL:
kubectl cp db_backup.sql postgres-665b7554dc-cddgq:/tmp/db_backup.sql
Em seguida, conecte-se ao pod PostgreSQL usando o comando a seguir.
kubectl exec -it postgres-665b7554dc-cddgq -- /bin/bash
Em seguida, execute o comando psql para restaurar o backup do arquivo dump.
psql -U ps_user -d ps_db -f /tmp/db_backup.sql
Conclusão
Este guia descreveu as etapas fundamentais necessárias para configurar o PostgreSQL com êxito em um ambiente Kubernetes. Ao aproveitar os recursos de orquestração do Kubernetes, as organizações podem gerenciar com eficiência instâncias do PostgreSQL, dimensionar recursos dinamicamente, garantir alta disponibilidade e agilizar as operações de manutenção.
Se você quiser saber mais sobre Kubernetes e Helm, confira a seção Kubernetes da nossa página da comunidade.