Implantações simplificadas do PostgreSQL no Amazon EKS usando o PGO - Recomendações da AWS

Implantações simplificadas do PostgreSQL no Amazon EKS usando o PGO

Shalaka Dengale, Amazon Web Services

Resumo

Este padrão integra o Postgres Operator da Crunchy Data (PGO) com o Amazon Elastic Kubernetes Service (Amazon EKS) para simplificar as implantações do PostgreSQL em ambientes nativos da nuvem. O PGO fornece automação e escalabilidade para gerenciar bancos de dados PostgreSQL no Kubernetes. Quando você combina o PGO com o Amazon EKS, ele cria uma plataforma robusta para implantar, gerenciar e escalar bancos de dados PostgreSQL de forma eficiente.

Essa integração oferece os seguintes benefícios:

  • Implantação automatizada: simplifica a implantação e o gerenciamento de clusters do PostgreSQL.

  • Definições de recursos personalizadas (CRDs): usa primitivas do Kubernetes para gerenciamento do PostgreSQL.

  • Alta disponibilidade: oferece suporte a failover automático e replicação síncrona.

  • Backups e restaurações automatizados: simplifica os processos de backup e restauração.

  • Escalabilidade horizontal: permite o a escalabilidade dinâmica de clusters do PostgreSQL.

  • Atualizações de versão: facilita as atualizações contínuas com o mínimo de tempo de inatividade.

  • Segurança: aplica criptografia, controles de acesso e mecanismos de autenticação.

Pré-requisitos e limitações

Pré-requisitos

Versões do produto

  • Kubernetes versões 1.21 a 1.24 ou posteriores (consulte a documentação do PGO).

  • PostgreSQL versão 10 ou posterior. Este padrão usa o PostgreSQL versão 16.

Limitações

  • Alguns Serviços da AWS não estão disponíveis em todas as Regiões da AWS. Para conferir a disponibilidade de uma região, consulte Serviços da AWS by Region. Para endpoints específicos, consulte a página Cotas e endpoints de serviços e clique no link correspondente ao serviço desejado.

Arquitetura

Pilha de tecnologias de destino

  • Amazon EKS

  • Amazon Virtual Private Cloud (Amazon VPC)

  • Amazon Elastic Compute Cloud (Amazon EC2)

Arquitetura de destino

Arquitetura para usar o PGO com três zonas de disponibilidade e duas réplicas, pgBouncer e operador do PGO.

Este padrão cria uma arquitetura que contém um cluster do Amazon EKS com três nós. Cada nó é executado em um conjunto de instâncias do EC2 no backend. Essa configuração do PostgreSQL segue uma arquitetura de réplica primária, que é particularmente eficaz para casos de uso com muita leitura. A arquitetura inclui os seguintes componentes:

  • O contêiner do banco de dados primário (pg-primary) hospeda a instância principal do PostgreSQL para a qual todas as operações de gravação são direcionadas.

  • Os contêineres de réplica secundários (pg-replica) hospedam as instâncias do PostgreSQL que replicam os dados do banco de dados primário e processam as operações de leitura.

  • O PgBouncer é um pooler de conexão leve para bancos de dados PostgreSQL incluídos no PGO. Ele fica entre o cliente e o servidor do PostgreSQL e atua como intermediário para conexões do banco de dados.

  • O PGO automatiza a implantação e o gerenciamento de clusters do PostgreSQL nesse ambiente Kubernetes.

  • O Patroni é uma ferramenta de código aberto que gerencia e automatiza configurações de alta disponibilidade para o PostgreSQL. Ele está incluído no PGO. Quando você usa o Patroni com o PGO no Kubernetes, ele desempenha um papel crucial para garantir a resiliência e a tolerância a falhas de um cluster do PostgreSQL. Para obter mais informações, consulte a documentação do Patroni.

O fluxo de trabalho inclui estas etapas:

  • Implantação do operador do PGO. Implante o operador do PGO no cluster do Kubernetes que é executado no Amazon EKS. Isso pode ser feito usando manifestos do Kubernetes ou charts do Helm. Este padrão usa manifestos do Kubernetes.

  • Defina instâncias do PostgreSQL. Quando o operador está em execução, você cria recursos personalizados (CRs) para especificar o estado desejado das instâncias do PostgreSQL. Isso inclui configurações como armazenamento, replicação e definições de alta disponibilidade.

  • Gerenciamento de operadores. Você interage com o operador por meio de objetos da API do Kubernetes, como CRs, para criar, atualizar ou excluir instâncias do PostgreSQL.

  • Monitoramento e manutenção. Você pode monitorar a integridade e a performance das instâncias do PostgreSQL executadas no Amazon EKS. Os operadores geralmente fornecem métricas e registros em log para fins de monitoramento. Você pode realizar tarefas de manutenção de rotina, como atualizações e correções, conforme necessário. Para obter mais informações, consulte Monitorar a performance de clusters e visualizar logs na documentação do Amazon EKS.

  • Dimensionamento e backup: você pode usar os recursos fornecidos pelo operador para escalar instâncias do PostgreSQL e gerenciar backups.

Este padrão não abrange as operações de monitoramento, manutenção e backup.

Automação e escala

  • É possível usar o CloudFormation para automatizar a criação da infraestrutura. Para obter mais informações, consulte Criar recursos do Amazon EKS com o CloudFormation na documentação do Amazon EKS.

  • É possível usar os números de compilação do GitVersion ou do Jenkins para automatizar a implantação de instâncias de banco de dados.

Ferramentas

Serviços da AWS

Outras ferramentas

  • O eksctl é uma ferramenta simples de linha de comando para criar clusters no Amazon EKS.

  • O Kubectl: é um utilitário de linha de comando para executar comandos em clusters do Kubernetes.

  • O PGO automatiza e dimensiona o gerenciamento de bancos de dados PostgreSQL no Kubernetes.

Práticas recomendadas

Siga estas práticas recomendadas para garantir uma implantação tranquila e eficiente:

  • Proteja seu cluster do EKS. Implemente as práticas recomendadas de segurança para seu cluster do EKS, como usar perfis do AWS Identity and Access Management (IAM) para contas de serviço (IRSA), políticas de rede e grupos de segurança de VPC. Limite o acesso ao servidor da API do cluster do EKS e criptografe as comunicações entre os nós e o servidor da API usando TLS.

  • Certifique-se da compatibilidade de versões entre o PGO e o Kubernetes em execução no Amazon EKS. Alguns recursos do PGO podem exigir versões específicas do Kubernetes ou introduzir limitações de compatibilidade. Para obter mais informações, consulte Components and Compatibility na documentação do PGO.

  • Planeje a alocação de recursos para sua implantação do PGO, incluindo CPU, memória e armazenamento. Considere os requisitos de recursos para o PGO, bem como para as instâncias do PostgreSQL gerenciadas por ele. Monitore o uso de recursos e dimensione os recursos conforme necessário.

  • Favoreça a alta disponibilidade. Projete sua implantação do PGO para alta disponibilidade a fim de minimizar o tempo de inatividade e garantir a confiabilidade. Implante várias réplicas do PGO em diferentes zonas de disponibilidade para tolerância a falhas.

  • Implemente procedimentos de backup e restauração para seus bancos de dados PostgreSQL gerenciados pelo PGO. Use recursos fornecidos pelo PGO ou por soluções de backup de terceiros que sejam compatíveis com o Kubernetes e o Amazon EKS.

  • Configure o monitoramento e o registro em log para sua implantação do PGO a fim de monitorar a performance, a integridade e os eventos. Use ferramentas como o Prometheus, para monitorar métricas, e o Grafana, para visualização. Configure o registro em log para capturar logs do PGO para solução de problemas e auditoria.

  • Configure a rede adequadamente para permitir a comunicação entre o PGO, as instâncias do PostgreSQL e outros serviços em seu cluster do Kubernetes. Use os recursos de rede da Amazon VPC e os plug-ins de rede do Kubernetes, como o Calico ou a Amazon VPC CNI, para aplicar políticas de rede e isolar o tráfego.

  • Escolha as opções de armazenamento apropriadas para seus bancos de dados PostgreSQL, considerando fatores como performance, durabilidade e escalabilidade. Use volumes do Amazon Elastic Block Store (Amazon EBS) ou serviços de armazenamento gerenciado da AWS para armazenamento persistente. Para obter mais informações, consulte Usar armazenamento de volumes do Kubernetes com o Amazon EBS na documentação do Amazon EKS.

  • Use ferramentas de infraestrutura como código (IaC), como o CloudFormation, para automatizar a implantação e a configuração do PGO no Amazon EKS. Defina os componentes da infraestrutura (incluindo o cluster do EKS, a rede e os recursos do PGO) como código para consistência, repetibilidade e controle de versão.

Épicos

TarefaDescriçãoHabilidades necessárias

Criar um perfil do IAM.

  1. Crie um perfil do IAM usando o seguinte comando na AWS CLI:

    aws iam create-role \ --role-name {YourRoleName} \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }' && \ aws iam attach-role-policy \ --role-name {YourRoleName}\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy && \ aws iam attach-role-policy \ --role-name {YourRoleName}\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSServicePolicy && \ aws iam attach-role-policy \ --role-name {YourRoleName}\ --policy-arn arn:aws:iam::aws:policy/CloudWatchFullAccess
  2. Analise a função no Console de gerenciamento da AWS:

    1. Abra o console do IAM.

    2. Escolha Perfis e procure o nome do perfil que você criou.

    3. Valide se as seguintes políticas estão anexadas:

      AmazonEKSClusterPolicy

      AmazonEKSServicePolicy

      CloudWatchFullAccess

Administrador da AWS
TarefaDescriçãoHabilidades necessárias

Crie um cluster do Amazon EKS.

Se você já implantou um cluster, ignore esta etapa. Caso contrário, implante um cluster do Amazon EKS em sua Conta da AWS atual usando o eksctl, o Terraform ou o CloudFormation. Este padrão usa o eksctl para a implantação de clusters.

nota

Este padrão usa o Amazon EC2 como um grupo de nós para o Amazon EKS. Se você quiser usar o AWS Fargate, consulte a configuração managedNodeGroups na documentação do eksctl.

  1. Use o arquivo de entrada do eksctl a seguir para gerar o cluster.

    sample-cluster.yaml:

    apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: postgresql region: us-east-1 version: "1.29" accessConfig: authenticationMode: API_AND_CONFIG_MAP availabilityZones: - us-east-1a - us-east-1b - us-east-1c nodeGroups: - name: ng-1 instanceType: m5.16xlarge desiredCapacity: 2 - name: ng-2 instanceType: m5.16xlarge desiredCapacity: 2 - name: ng-3 instanceType: m5.16xlarge desiredCapacity: 2 vpc: cidr: 192.168.0.0/16 clusterEndpoints: publicAccess: true nat: gateway: HighlyAvailable iamIdentityMappings: - arn: arn:aws:iam::<account-id>:role/<role-name> # update the IAM role ARN created in step 1 username: <user-name> # Enter the user name per your choice noDuplicateARNs: false
  2. Execute o seguinte comando para criar o cluster (informe o caminho ao seu arquivo sample-cluster.yaml):

    eksctl create cluster -f sample-cluster.yaml
Administrador da AWS, administrador do Terraform ou eksctl, administrador do Kubernetes

Valide o status do cluster.

Execute o seguinte comando para exibir o status atual dos nós no cluster:

kubectl get nodes

Se encontrar erros, consulte a seção de solução de problemas da documentação do Amazon EKS.

Administrador da AWS, administrador do Terraform ou eksctl, administrador do Kubernetes
TarefaDescriçãoHabilidades necessárias

Habilite o provedor OIDC do IAM.

Como pré-requisito para o driver da interface de armazenamento de contêiner (CSI) do Amazon EBS, você deve ter um provedor OpenID Connect (OIDC) do IAM existente para o cluster.

Habilite o provedor OIDC do IAM usando o seguinte comando:

eksctl utils associate-iam-oidc-provider --region={region} --cluster={YourClusterNameHere} --approve

Para obter mais informações sobre essa etapa, consulte a documentação do Amazon EKS.

Administrador da AWS

Crie um perfil do IAM para o driver da CSI do Amazon EBS.

Use o seguinte comando do eksctl para criar o perfil do IAM para o driver do CSI:

eksctl create iamserviceaccount \ --region {RegionName} \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster {YourClusterNameHere} \ --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ --approve \ --role-only \ --role-name AmazonEKS_EBS_CSI_DriverRole

Se você usa unidades criptografadas do Amazon EBS, é necessário configurar ainda mais a política. Para obter instruções, consulte a documentação do driver da CSI do Amazon EBS.

Administrador da AWS

Adicione o driver da CSI do Amazon EBS.

Use o seguinte comando do eksctl para adicionar o driver da CSI do Amazon EBS:

eksctl create addon \ --name aws-ebs-csi-driver \ --cluster <YourClusterName> service-account-role-arn arn:aws:iam::$(aws sts get-caller-identity \ --query Account \ --output text):role/AmazonEKS_EBS_CSI_DriverRole \ --force
Administrador da AWS
TarefaDescriçãoHabilidades necessárias

Clone o repositório do PGO.

Clone o repositório do GitHub para o PGO:

git clone https://github.com/CrunchyData/postgres-operator-examples.git
AWS DevOps

Forneça os detalhes do perfil para a criação da conta de serviço.

Para conceder ao cluster do Amazon EKS acesso aos recursos da AWS necessários, especifique o nome do recurso da Amazon (ARN) do perfil do OIDC criado anteriormente no arquivo service_account.yaml. Esse arquivo está localizado na pasta namespace do repositório.

cd postgres-operator-examples
--- metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<accountId>:role/<role_name> # Update the OIDC role ARN created earlier
Administrador da AWS, administrador do Kubernetes

Crie o namespace e os pré-requisitos do PGO.

  1. Execute o comando a seguir para criar o namespace :

    kubectl apply -k kustomize/install/namespace

    Isso estabelece um namespace dedicado para o PGO. Se necessário, é possível modificar o arquivo namespace.yml e atribuir um nome diferente ao namespace.

  2. Execute o seguinte comando para aplicar a configuração no cluster:

    kubectl apply --server-side -k kustomize/install/default

    kustomize/install/default fornece a configuração padrão para o controle de acesso baseado em perfil (RBAC) do Kubernetes, a definição de recurso personalizada (CRD) e os arquivos do Kubernetes Manager.

Administrador do Kubernetes

Verifique a criação dos pods.

Verifique se o namespace e a configuração padrão foram criados:

kubectl get pods -n postgres-operator
Administrador da AWS, administrador do Kubernetes

Verifique as PVCs.

Use o seguinte comando para verificar as declarações de volume persistentes (PVCs):

kubectl describe pvc -n postgres-operator
Administrador da AWS, administrador do Kubernetes
TarefaDescriçãoHabilidades necessárias

Crie um operador.

Confirme se o conteúdo do arquivo localizado em /kustomize/postgres/postgres.yaml corresponde ao seguinte:

spec: instances: - name: pg-1 replicas: 3 patroni: dynamicConfiguration: postgresql: pg_hba: - "host all all 0.0.0.0/0 trust" # this line enabled logical replication with programmatic access - "host all postgres 127.0.0.1/32 md5" synchronous_mode: true users: - name: replicator databases: - testdb options: "REPLICATION"

Essas atualizações garantem o seguinte:

  • O ajuste das opções de configuração do PostgreSQL para facilitar o acesso à instância do PostgreSQL.

  • A adição de configurações para usuário de replicação, usuário do banco de dados e superusuário a fim de permitir a replicação de streaming, o acesso ao banco de dados e o gerenciamento de clusters.

Administrador da AWS, DBA, administrador do Kubernetes

Implante o operador.

Implante o operador do PGO para simplificar o gerenciamento e a operação dos bancos de dados PostgreSQL em ambientes Kubernetes:

kubectl apply -k kustomize/postgres
Administrador da AWS, DBA, administrador do Kubernetes

Verificar a implantação.

  1. Valide se o operador foi implantado:

    kubectl get pods -n postgres-operator --selector=postgres-operator.crunchydata.com/instance-set \ -L postgres-operator.crunchydata.com/role
  2. Verifique se o recurso de serviço associado ao pod do operador foi criado:

    kubectl get svc -n postgres-operator

Na saída do comando, observe a réplica primária (primary_pod_name) e a réplica de leitura (read_pod_name). Elas serão usadas nas próximas etapas.

Administrador da AWS, DBA, administrador do Kubernetes
TarefaDescriçãoHabilidades necessárias

Grave os dados na réplica primária.

Use os seguintes comandos para se conectar à réplica primária do PostgreSQL e gravar dados no banco de dados:

kubectl exec -it <primary_pod_name> bash -n postgres-operator
psql
CREATE TABLE customers (firstname text, customer_id serial, date_created timestamp); \dt
Administrador da AWS, administrador do Kubernetes

Confirme se a réplica de leitura tem os mesmos dados.

Conecte-se à réplica de leitura do PostgreSQL e verifique se a replicação de streaming está funcionando corretamente:

kubectl exec -it {read_pod_name} bash -n postgres-operator
psql
\dt

A réplica de leitura deve ter a tabela que você criou na réplica primária na etapa anterior.

Administrador da AWS, administrador do Kubernetes

Solução de problemas

ProblemaSolução

O pod não inicia.

  • Use o seguinte comando para inspecionar o status do pod:

    kubectl get pods -n your-namespace
  • Inspecione os logs em busca de erros:

    kubectl logs your-pod-name -n your-namespace
  • Verifique se há eventos anormais relacionados aos seus pods:

    kubectl describe pod your-pod-name -n your-namespace

As réplicas estão significativamente atrasadas em relação ao banco de dados primário.

  • Verifique o atraso na replicação:

    SELECT * FROM pg_stat_replication;
  • Certifique-se de que as réplicas tenham recursos suficientes de CPU e memória. Verifique os limites de recursos:

    kubectl describe pod your-replica-pod -n your-namespace
  • Verifique se o backend de armazenamento está funcionando de maneira ideal. A I/O de disco lenta pode causar atraso na replicação.

Você não tem visibilidade da performance e da integridade do cluster do PostgreSQL.

  • Habilite o Amazon CloudWatch Logs e certifique-se de que os logs estejam sendo enviados ao Amazon CloudWatch para análise. Para obter mais informações, consulte a documentação do Amazon EKS.

  • Verificar pg_stat_activity:

    SELECT * FROM pg_stat_activity;

A replicação não funciona.

  • Verifique a configuração primária exibindo as configurações de replicação em postgresql.conf:

    wal_level = replica
    max_wal_senders = 10
    wal_keep_size = 64 # or wal_keep_segments in older versions
  • Verifique se pg_hba.conf inclui as permissões de replicação:

    host replication replica_user all md5
  • Verifique a configuração de réplicas. Verifique se a configuração recovery.conf ou equivalentes (standby.signal e primary_conninfo) estão definidas corretamente nas réplicas.

Recursos relacionados