Simplificación de las implementaciones de PostgreSQL en Amazon EKS mediante PGO - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Simplificación de las implementaciones de PostgreSQL en Amazon EKS mediante PGO

Shalaka Dengale, Amazon Web Services

Resumen

Este patrón integra el operador de Postgres de Crunchy Data (PGO) con Amazon Elastic Kubernetes Service (Amazon EKS) para agilizar las implementaciones de PostgreSQL en entornos nativos en la nube. PGO proporciona automatización y escalabilidad para administrar bases de datos de PostgreSQL en Kubernetes. Al combinar PGO con Amazon EKS, se forma una plataforma sólida para implementar, administrar y escalar bases de datos de PostgreSQL de manera eficiente.

Esta integración proporciona las ventajas clave siguientes:

  • Implementación automatizada: simplifica la implementación y la administración de clústeres de PostgreSQL.

  • Definiciones de recursos personalizadas (CRDs): utiliza primitivas de Kubernetes para la administración de PostgreSQL.

  • Alta disponibilidad: admite la conmutación por error automática y la replicación sincrónica.

  • Copias de seguridad y restauraciones automatizadas: simplifica los procesos para hacer copias de seguridad y restauraciones.

  • Escalado horizontal: permite el escalado dinámico de los clústeres de PostgreSQL.

  • Actualizaciones de versión: facilita las actualizaciones sucesivas con un tiempo de inactividad mínimo.

  • Seguridad: aplica el cifrado, los controles de acceso y los mecanismos de autenticación.

Requisitos previos y limitaciones

Requisitos previos 

Versiones de producto

  • Kubernetes, versiones 1.21 a 1.24 o posteriores (consulte la documentación de PGO).

  • PostgreSQL, versión 10 y posterior. Este patrón utiliza PostgreSQL, versión 16.

Limitaciones

  • Algunos Servicios de AWS no están disponibles en todos Regiones de AWS. Para conocer la disponibilidad de las regiones, consulte Servicios de AWS by Region. Para los puntos de conexión específicos, consulte la página Service endpoints and quotas y elija el enlace del servicio.

Arquitectura

Pila de tecnología de destino

  • Amazon EKS

  • Amazon Virtual Private Cloud (Amazon VPC)

  • Amazon Elastic Compute Cloud (Amazon EC2)

Arquitectura de destino

Arquitectura para usar PGO con tres zonas de disponibilidad y dos réplicas PgBouncer, y un operador de PGO.

Este patrón crea una arquitectura que contiene un clúster de Amazon EKS con tres nodos. Cada nodo se ejecuta en un conjunto de EC2 instancias en el backend. Esta configuración de PostgreSQL sigue una arquitectura de réplica principal, que resulta especialmente eficaz en casos de uso con lectura intensiva. La arquitectura incluye los siguientes componentes:

  • El contenedor de base de datos principal (pg-primary) aloja la instancia principal de PostgreSQL a la que se dirigen todas las operaciones de escritura.

  • Los contenedores de réplicas secundarios (pg-replica) alojan las instancias de PostgreSQL que replican los datos de la base de datos principal y gestionan las operaciones de lectura.

  • PgBounceres un agrupador de conexiones ligero para bases de datos PostgreSQL que se incluye en PGO. Se encuentra entre el cliente y el servidor PostgreSQL y actúa como intermediario para las conexiones de las bases de datos.

  • PGO automatiza la implementación y la administración de los clústeres de PostgreSQL en este entorno de Kubernetes.

  • Patroni es una herramienta de código abierto que administra y automatiza las configuraciones de alta disponibilidad para PostgreSQL. Se incluye con PGO. Cuando utiliza Patroni con PGO en Kubernetes, desempeña un papel crucial a la hora de garantizar la resiliencia y la tolerancia a errores de un clúster de PostgreSQL. Para más información, consulte la documentación de Patroni.

En el flujo de trabajo se incluyen estos pasos:

  • Implemente el operador de PGO. El operador de PGO se implementa en el clúster de Kubernetes que se ejecuta en Amazon EKS. Esto se puede hacer mediante manifiestos de Kubernetes o gráficos de Helm. Este patrón utiliza los manifiestos de Kubernetes.

  • Defina las instancias de PostgreSQL. Cuando el operador está en ejecución, se crean recursos personalizados (CRs) para especificar el estado deseado de las instancias de PostgreSQL. Esto incluye configuraciones como el almacenamiento, la replicación y la alta disponibilidad.

  • Administración de operadores. Se interactúa con el operador a través de objetos de la API de Kubernetes, por ejemplo, CRs para crear, actualizar o eliminar instancias de PostgreSQL.

  • Supervisión y mantenimiento. Puede supervisar el estado y el rendimiento de las instancias de PostgreSQL que se ejecutan en Amazon EKS. Los operadores suelen proporcionar métricas y registros con fines de supervisión. Puede hacer tareas de mantenimiento de rutina, como actualizaciones y aplicación de revisiones, según sea necesario. Para más información, consulte Supervisión del rendimiento de un clúster y visualización de registros en la documentación de Amazon EKS.

  • Escalado y copia de seguridad: puede utilizar las características proporcionadas por el operador para escalar las instancias de PostgreSQL y administrar las copias de seguridad.

Este patrón no cubre las operaciones de supervisión, mantenimiento y copia de seguridad.

Automatización y escala

  • Puede utilizarlos para automatizar la creación de CloudFormation la infraestructura. Para más información, consulte Creación de recursos de Amazon EKS con CloudFormation en la documentación de Amazon EKS.

  • Puede usar GitVersion los números de compilación de Jenkins para automatizar la implementación de instancias de bases de datos.

Tools (Herramientas)

Servicios de AWS

Otras herramientas

  • eksctl es una herramienta sencilla de línea de comandos para crear clústeres de Amazon EKS.

  • kubectl: es una utilidad de línea de comandos para la ejecución de comandos en clústeres de Kubernetes.

  • PGO automatiza y escala la administración de las bases de datos de PostgreSQL en Kubernetes.

Prácticas recomendadas

Siga estas prácticas recomendadas para garantizar una implementación eficiente y sin problemas:

  • Proteja el clúster de EKS. Implemente las mejores prácticas de seguridad para su clúster de EKS, como el uso de funciones AWS Identity and Access Management (IAM) para las cuentas de servicio (IRSA), las políticas de red y los grupos de seguridad de VPC. Limite el acceso al servidor de API del clúster de EKS y cifre las comunicaciones entre los nodos y el servidor de API mediante TLS.

  • Asegúrese de la compatibilidad de versiones entre PGO y Kubernetes que se ejecutan en Amazon EKS. Algunas características de PGO pueden requerir versiones específicas de Kubernetes o introducir limitaciones de compatibilidad. Para más información, consulte Components and Compatibility en la documentación de PGO.

  • Planifique la asignación de recursos para la implementación de PGO, lo que incluye la CPU, la memoria y el almacenamiento. Tenga en cuenta los requisitos de recursos de las instancias de PGO y PostgreSQL que administra. Supervise el uso de los recursos y escálelos según sea necesario.

  • Diseñe para una alta disponibilidad. Diseñe la implementación de PGO para una alta disponibilidad a fin de minimizar el tiempo de inactividad y garantizar la fiabilidad. Implemente varias réplicas de PGO en varias zonas de disponibilidad para la tolerancia a errores.

  • Implemente procedimientos de copia de seguridad y restauración para las bases de datos de PostgreSQL que administra PGO. Utilice las características que ofrece PGO o las soluciones de copia de seguridad de terceros que sean compatibles con Kubernetes y Amazon EKS.

  • Configure la supervisión y el registro de la implementación de PGO para hacer un seguimiento del rendimiento, del estado y de los eventos. Utilice herramientas como Prometheus para supervisar las métricas y Grafana para la visualización. Configure el registro para capturar los registros de PGO para la solución de problemas y la auditoría.

  • Configure las redes de manera correcta para permitir las comunicaciones entre instancias de PGO, PostgreSQL y otros servicios del clúster de Kubernetes. Utilice las características de red de Amazon VPC y los complementos de red de Kubernetes, como Calico o CNI de Amazon VPC, para aplicar las políticas de red y aislar el tráfico.

  • Elija las opciones de almacenamiento adecuadas para las bases de datos de PostgreSQL. Tenga en cuenta factores como el rendimiento, la durabilidad y la escalabilidad. Utilice los volúmenes de Amazon Elastic Block Store (Amazon EBS) AWS o los servicios de almacenamiento gestionado para el almacenamiento persistente. Para más información, consulte el tema sobre almacenamiento de volúmenes de Kubernetes con Amazon EBS en la documentación de Amazon EKS.

  • Utilice herramientas de infraestructura como código (IaC) CloudFormation para automatizar la implementación y la configuración de PGO en Amazon EKS. Defina los componentes de la infraestructura, tales como el clúster de EKS, las redes y los recursos de PGO, como código para garantizar la coherencia, la repetibilidad y el control de versiones.

Epics

TareaDescripciónHabilidades requeridas

Crear un rol de IAM.

  1. Cree un rol de IAM con el comando siguiente en la 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. Revise el rol en la Consola de administración de AWS:

    1. Abra la consola de IAM.

    2. Elija Roles y busque el nombre del rol que creó.

    3. Valide que se adjunten las políticas siguientes:

      AmazonEKSClusterPolicy

      AmazonEKSServicePolicy

      CloudWatchFullAccess

Administrador de AWS
TareaDescripciónHabilidades requeridas

Cree un clúster de Amazon EKS.

Si ya implementó un clúster, omita este paso. De lo contrario, implemente un clúster de Amazon EKS en su clúster actual Cuenta de AWS mediante eksctl Terraform o CloudFormation. Este patrón utiliza eksctl para la implementación de clústeres.

nota

Este patrón utiliza Amazon EC2 como grupo de nodos para Amazon EKS. Si desea usarlo AWS Fargate, consulte la managedNodeGroups configuración en la documentación de eksctl.

  1. Utilice el archivo siguiente de entrada eksctl para generar el clúster.

    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. Ejecute el comando siguiente para crear el clúster (proporcione la ruta del archivo sample-cluster.yaml):

    eksctl create cluster -f sample-cluster.yaml
Administrador de AWS, administrador de Terraform o eksctl, administrador de Kubernetes

Valide el estado del clúster.

Ejecute el comando siguiente para ver el estado actual de los nodos del clúster:

kubectl get nodes

Si encuentra errores, consulte la sección de resolución de problemas de la documentación de Amazon EKS.

Administrador de AWS, administrador de Terraform o eksctl, administrador de Kubernetes
TareaDescripciónHabilidades requeridas

Habilite el proveedor de OIDC de IAM.

Como requisito previo para el controlador de la interfaz de almacenamiento de contenedores (CSI) de Amazon EBS, debe tener un proveedor de IAM OpenID Connect (OIDC) existente para el clúster.

Habilite el proveedor de IAM OIDC mediante el comando siguiente:

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

Para más información acerca de este paso, consulte la documentación de Amazon EKS.

Administrador de AWS

Cree un rol de IAM para el controlador de CSI de Amazon EBS

Utilice el comando siguiente eksctl para crear el rol de IAM para el controlador de la 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

Si utiliza controladores de Amazon EBS cifrados, debe configurar la política con mayor detalle. Para obtener instrucciones, consulte la documentación de controladores de la SCI de Amazon EBS.

Administrador de AWS

Agregue el controlador de CSI de Amazon EBS.

Utilice el comando siguiente eksctl para agregar el controlador de CSI de 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 de AWS
TareaDescripciónHabilidades requeridas

Clone el repositorio de PGO.

Clona el GitHub repositorio para PGO:

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

Proporcione los detalles del rol para crear la cuenta de servicio.

Para conceder al clúster de Amazon EKS acceso a los AWS recursos necesarios, especifique el nombre del recurso de Amazon (ARN) del rol OIDC que creó anteriormente en el archivo. service_account.yaml Este archivo se encuentra en la carpeta del espacio de nombres del repositorio.

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 de AWS, administrador de Kubernetes

Cree el espacio de nombres y los requisitos previos de PGO.

  1. Ejecute el siguiente comando para crear el espacio de nombres :

    kubectl apply -k kustomize/install/namespace

    Esto establece un espacio de nombres dedicado para PGO. Si es necesario, puede modificar el archivo namespace.yml y asignar un nombre distinto al espacio de nombres.

  2. Ejecute el comando siguiente para aplicar la configuración predeterminada al clúster:

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

    kustomize/install/default proporciona la configuración predeterminada para el control de acceso basado en roles (RBAC) de Kubernetes, la definición de recursos personalizados (CRD) y los archivos de Kubernetes Manager.

Administrador de Kubernetes

Verifique la creación de los pods.

Compruebe que se hayan creado el espacio de nombres y la configuración predeterminada:

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

Verifíquelo. PVCs

Usa el siguiente comando para verificar las notificaciones de volumen persistentes (PVCs):

kubectl describe pvc -n postgres-operator
Administrador de AWS, administrador de Kubernetes
TareaDescripciónHabilidades requeridas

Cree un operador.

Revise el contenido del archivo ubicado en /kustomize/postgres/postgres.yaml para que coincida con lo siguiente:

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"

Estas actualizaciones hacen lo siguiente:

  • Ajuste los valores de configuración de PostgreSQL para facilitar el acceso a la instancia de PostgreSQL.

  • Incluya configuraciones para el usuario de replicación, el usuario de la base de datos y el superusuario para permitir la replicación en streaming, el acceso a la base de datos y la administración de clústeres.

Administrador de AWS, DBA, administrador de Kubernetes

Implemente el operador.

Implemente el operador de PGO para permitir la administración y el uso simplificados de las bases de datos de PostgreSQL en entornos de Kubernetes:

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

Comprobar la implementación.

  1. Valide que el operador se haya implementado:

    kubectl get pods -n postgres-operator --selector=postgres-operator.crunchydata.com/instance-set \ -L postgres-operator.crunchydata.com/role
  2. Verifique que se haya creado el recurso de servicio asociado al pod del operador:

    kubectl get svc -n postgres-operator

En el resultado del comando, anote la réplica principal (primary_pod_name) y lea la réplica (read_pod_name). Los utilizará en los pasos próximos.

Administrador de AWS, DBA, administrador de Kubernetes
TareaDescripciónHabilidades requeridas

Escriba los datos en la réplica principal.

Utilice los comandos siguientes para conectarse a la réplica principal de PostgreSQL y escribir datos en la base de datos:

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

Confirme que la réplica de lectura tiene los mismos datos.

Conéctese a la réplica de lectura de PostgreSQL y compruebe si la replicación de streaming funciona correctamente:

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

La réplica de lectura debe tener la tabla que creó en la réplica principal en el paso anterior.

Administrador de AWS, administrador de Kubernetes

Resolución de problemas

ProblemaSolución

El pod no se inicia.

  • Utilice el comando siguiente para inspeccionar el estado del pod:

    kubectl get pods -n your-namespace
  • Inspeccione los registros para detectar errores:

    kubectl logs your-pod-name -n your-namespace
  • Verifique los eventos de los pods para ver si hay eventos anormales relacionados con los pods:

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

Las réplicas están muy atrasadas con respecto a la base de datos principal.

  • Compruebe el retraso de la replicación:

    SELECT * FROM pg_stat_replication;
  • Asegúrese de que las réplicas tengan recursos suficientes de CPU y memoria. Compruebe los límites de los recursos:

    kubectl describe pod your-replica-pod -n your-namespace
  • Verifique que el backend de almacenamiento funcione de manera óptima. Un disco lento I/O puede provocar un retraso en la replicación.

No tiene visibilidad del rendimiento y el estado del clúster de PostgreSQL.

  • Activa Amazon CloudWatch Logs y asegúrate de que los registros se envíen a Amazon CloudWatch para su análisis. Para obtener más información, consulte la documentación de Amazon EKS.

  • Compruebe pg_stat_activity:

    SELECT * FROM pg_stat_activity;

La replicación no funciona.

  • Verifique la configuración principal y consulte la configuración de la replicación en postgresql.conf:

    wal_level = replica
    max_wal_senders = 10
    wal_keep_size = 64 # or wal_keep_segments in older versions
  • Verifique que pg_hba.conf incluye los permisos de replicación:

    host replication replica_user all md5
  • Verifique la configuración de la replicación. Asegúrese de que los valores de recovery.conf o una equivalente (standby.signal y primary_conninfo) estén configurados correctamente en las réplicas.

Recursos relacionados