使用以下EKS方法简化 Postgre 在亚马逊上的SQL部署 PGO - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用以下EKS方法简化 Postgre 在亚马逊上的SQL部署 PGO

由 Shalaka Dengale 创作 () AWS

摘要

这种模式将 Crunchy Data (PGO) 中的 Postgres 操作员与亚马逊 Elastic Kubernetes Service(亚马逊)集成在一起,以简化云原生环境中的 EKS Postgre 部署。SQL PGO为在 Kubernetes 中管理 Postgre SQL 数据库提供了自动化和可扩展性。当您PGO与 Amazon 结合使用时EKS,它将构成一个强大的平台,用于高效部署、管理和扩展 Postgre SQL 数据库。

这种集成提供了以下主要好处:

  • 自动部署:简化 Postgre SQL 集群的部署和管理。

  • 自定义资源定义 (CRDs):使用 Kubernetes 原语进行 Postgre 管理。SQL

  • 高可用性:支持自动故障转移和同步复制。

  • 自动备份和恢复:简化备份和恢复流程。

  • 水平扩展:启用 Postgre SQL 集群的动态扩展。

  • 版本升级:便于滚动升级,停机时间最短。

  • 安全:强制执行加密、访问控制和身份验证机制。

先决条件和限制

先决条件

产品版本

限制

架构

目标技术堆栈

  • Amazon EKS

  • 亚马逊 Virtual Private Cloud(亚马逊VPC)

  • 亚马逊弹性计算云(亚马逊EC2)

目标架构

用于PGO三个可用区和两个副本的架构 PgBouncer,以及PGO操作员。

此模式构建的架构包含具有三个节点的 Amazon EKS 集群。每个节点在后端的一组EC2实例上运行。此 Postgre SQL 设置遵循主副本架构,这对于读取密集型用例特别有效。例架包括以下组件:

  • 主数据库容器 (pg-primary) 托管主 Postgre SQL 实例,所有写入操作都将定向到该实例。

  • 辅助副本容器(pg-replica)托管 Postgre SQL 实例,这些实例从主数据库复制数据并处理读取操作。

  • PgBouncer是附带的 Postgre SQL 数据库的轻量级连接池器。PGO它位于客户端和 Postgre SQL 服务器之间,充当数据库连接的中介。

  • PGO在此 Kubernetes 环境中自动部署和管理 Postgre SQL 集群。

  • Patroni 是一款开源工具,用于管理和自动化 Postgre 的高可用性配置。SQL它包含在PGO。当你PGO在 Kubernetes 中使用 Patroni 时,它在确保 Postgre 集群的弹性和容错能力方面起着至关重要的作用。SQL有关更多信息,请参阅 Patroni 文档

该工作流程包括以下步骤:

  • 部署PGO操作员。您在亚马逊上运行的 Kubernetes 集群上部署PGO操作员。EKS这可以通过使用 Kubernetes 清单或 Helm 图表来完成。这种模式使用 Kubernetes 清单。

  • 定义 Postgre SQL 实例。操作员运行时,您可以创建自定义资源 (CRs) 来指定 Postgre SQL 实例的所需状态。这包括存储、复制和高可用性设置等配置。

  • 操作员管理。你可以通过 Kubernetes API 对象与操作员进行交互,例如CRs创建、更新或删除 Postgre 实例。SQL

  • 监控和维护。您可以监控在亚马逊EKS上运行的 Postgre SQL 实例的运行状况和性能。操作员通常会提供指标和日志以进行监控。您可以根据需要执行例行维护任务,例如升级和修补。有关更多信息,请参阅 Amazon EKS 文档中的监控集群性能和查看日志

  • 扩展和备份:您可以使用运营商提供的功能来扩展 Postgre SQL 实例和管理备份。

这种模式不包括监控、维护和备份操作。

自动化和扩缩

工具

AWS 服务

其他工具

  • eksctl 是一款用于在亚马逊上创建集群的简单命令行工具。EKS

  • kubectl 是针对 Kubernetes 集群运行命令的命令行实用程序。

  • PGO自动化和扩展 Kubernetes 中 Postgre SQL 数据库的管理。

最佳实践

请遵循以下最佳实践,以确保平稳高效的部署:

  • 保护您的EKS集群。为EKS集群实施安全最佳实践,例如对服务帐号 AWS Identity and Access Management (IAMIRSA)、网络策略和VPC安全组使用 () 角色。使用限制对EKS群集API服务器的访问并加密节点与API服务器之间的通信TLS。

  • 确保与在亚马逊上运行的 Kubernetes PGO 之间的版本兼容性。EKS某些PGO功能可能需要特定的 Kubernetes 版本或引入兼容性限制。有关更多信息,请参阅PGO文档中的组件和兼容性

  • 规划PGO部署的资源分配CPU,包括内存和存储。考虑两者的资源需求PGO及其管理的 Postgre SQL 实例。监控资源使用情况并根据需要扩展资源。

  • 专为高可用性而设计。设计您的PGO部署以实现高可用性,从而最大限度地减少停机时间并确保可靠性。PGO跨多个可用区部署多个副本以实现容错能力。

  • 为PGO管理的 Postgre SQL 数据库@@ 实施备份和恢复程序。使用与 Kubernetes 和 Amazon 兼容的第三方备份解决方案提供的功能。PGO EKS

  • 为您的PGO部署@@ 设置监控和日志记录,以跟踪性能、运行状况和事件。使用 Prometheus 等工具监控指标,使用 Grafana 等工具进行可视化。配置日志以捕获PGO日志以进行故障排除和审计。

  • 正确@@ 配置网络以允许 Postgre SQL 实例与 Kubernetes 集群中的其他服务之间PGO进行通信。使用亚马逊VPC网络功能和 Kubernetes 联网插件(例如 Calico 或 A VPC CNI mazon)进行网络策略执行和流量隔离。

  • 考虑性能、耐久性和可扩展性等因素,为 Postgre SQL 数据库@@ 选择合适的存储选项。使用 Amazon Elastic Block Store (AmazonEBS) 卷或 AWS 托管存储服务进行永久存储。有关更多信息,请参阅亚马逊文档中的在亚马逊上存储 Kubernetes EBS 卷。EKS

  • 使用基础设施即代码 (IaC) 工具,例如 AWS CloudFormation 在 Amazon PGO EKS 上自动部署和配置。将基础设施组件(包括EKS集群、网络和PGO资源)定义为一致性、可重复性和版本控制的代码。

操作说明

任务描述所需技能

创建一个 IAM 角色。

  1. 在中使用以下命令创建IAM角色 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. 在以下内容中查看该角色 AWS Management Console:

    1. 打开 IAM 管理控制台

    2. 选择 “角色”,然后搜索您创建的角色名称。

    3. 验证是否已附加以下策略:

      AmazonEKSClusterPolicy

      AmazonEKSServicePolicy

      CloudWatchFullAccess

AWS 管理员
任务描述所需技能

创建 Amazon EKS 集群。

如果您已经部署了集群,请跳过此步骤。否则,请使用 ekctl Terraform 或在当前EKS AWS 账户 集群中部署 Amazon 集群。 AWS CloudFormation此模式ekctl用于集群部署。

注意

此模式使用亚马逊EC2作为亚马逊的节点组EKS。如果要使用 AWS Fargate,请参阅 eksctl 文档中的managedNodeGroups配置。

  1. 使用以下ekctl输入文件生成集群。

    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. 运行以下命令创建集群(提供文件的文件路径):sample-cluster.yaml

    eksctl create cluster -f sample-cluster.yaml
AWS管理员、Terraform 或 ekctl 管理员、Kubernetes 管理员

验证集群的状态。

运行以下命令以查看集群中节点的当前状态:

kubectl get nodes

如果您遇到错误,请参阅 Amazon EKS 文档的疑难解答部分

AWS管理员、Terraform 或 ekctl 管理员、Kubernetes 管理员
任务描述所需技能

启用提供IAMOIDC商。

作为亚马逊EBS容器存储接口 (CSI) 驱动程序的先决条件,您的集群必须有一个现有 IAM OpenID Connect (OIDC) 提供程序。

使用以下命令启用该IAMOIDC提供程序:

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

有关此步骤的更多信息,请参阅 Amazon EKS 文档

AWS 管理员

为 Amazon EBS CSI 驱动程序创建一个IAM角色。

使用以下eksctl命令为CSI驱动程序创建IAM角色:

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

如果您使用加密的 Amazon EBS 硬盘,则必须进一步配置策略。有关说明,请参阅 Amazon EBS SCI 驱动程序文档

AWS 管理员

添加 Amazon EBS CSI 驱动程序。

使用以下eksctl命令添加 Amazon EBS CSI 驱动程序:

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
AWS 管理员
任务描述所需技能

克隆PGO存储库。

为以下内容克隆 GitHub 存储库PGO:

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

提供创建服务帐号的角色详细信息。

要授予 Amazon EKS 集群访问所需 AWS 资源的权限,请在service_account.yaml文件中指定您之前创建的OIDC角色的 Amazon 资源名称 (ARN)。此文件位于存储库的命名空间文件夹中

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
AWS管理员,Kubernetes 管理员

创建命名空间和PGO先决条件。

  1. 运行以下命令以创建 命名空间:

    kubectl apply -k kustomize/install/namespace

    这将为建立专用的命名空间PGO。如有必要,您可以修改namespace.yml文件并为命名空间指定不同的名称。

  2. 运行以下命令将默认配置应用于集群:

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

    kustomize/install/default为 Kubernetes 基于角色的访问控制 (RBAC)、自定义资源定义 (CRD) 和 Kubernetes 管理器文件提供了默认配置。

Kunernetes 管理员

验证 Pod 的创建情况。

验证命名空间和默认配置是否已创建:

kubectl get pods -n postgres-operator
AWS管理员,Kubernetes 管理员

验证PVCs。

使用以下命令验证永久卷声明 (PVCs):

kubectl describe pvc -n postgres-operator
AWS管理员,Kubernetes 管理员
任务描述所需技能

创建运算符。

修改位于的文件内容,使其与以下内容/kustomize/postgres/postgres.yaml相匹配:

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"

这些更新执行以下操作:

  • 调整 Postgre SQL 配置设置以方便访问 Postgre 实例。SQL

  • 包括复制用户、数据库用户和超级用户的配置,以启用流式复制、数据库访问和集群管理。

AWS管理员、DBA、Kubernetes 管理员

部署操作员。

部署PGO操作员以实现在 Kubernetes 环境中简化 Postgre SQL 数据库的管理和操作:

kubectl apply -k kustomize/postgres
AWS管理员、DBA、Kubernetes 管理员

验证部署。

  1. 验证操作员是否已部署:

    kubectl get pods -n postgres-operator --selector=postgres-operator.crunchydata.com/instance-set \ -L postgres-operator.crunchydata.com/role
  2. 验证是否已创建与操作员容器关联的服务资源:

    kubectl get svc -n postgres-operator

从命令输出中,记下主副本 (primary_pod_name) 和只读副本 (read_pod_name)。您将在接下来的步骤中使用它们。

AWS管理员、DBA、Kubernetes 管理员
任务描述所需技能

向主副本写入数据。

使用以下命令连接到 Postgre SQL 主副本并将数据写入数据库:

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

确认只读副本具有相同的数据。

连接到 Postgre 只SQL读副本并检查流式复制是否正常运行:

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

只读副本应具有您在上一步中在主副本中创建的表。

AWS管理员,Kubernetes 管理员

故障排除

事务解决方案

吊舱无法启动。

  • 使用以下命令检查 pod 状态:

    kubectl get pods -n your-namespace
  • 检查日志中是否存在任何错误:

    kubectl logs your-pod-name -n your-namespace
  • 检查 pod 事件中是否存在与你的 pod 相关的任何异常事件:

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

副本明显落后于主数据库。

  • 检查复制延迟:

    SELECT * FROM pg_stat_replication;
  • 确保副本有足够的CPU内存资源。检查资源限制:

    kubectl describe pod your-replica-pod -n your-namespace
  • 验证存储后端的性能是否处于最佳状态。磁盘 I/O 缓慢可能会导致复制延迟。

你无法看见 Postgre SQL 集群的性能和运行状况。

  • 启用 Amazon CloudWatch Logs 并确保将日志发送到亚马逊 CloudWatch 进行分析。有关更多信息,请参阅 Amazon EKS 文档

  • 检查 pg_stat_activity

    SELECT * FROM pg_stat_activity;

复制不起作用。

  • 通过查看以下内容中的复制设置来检查主配置postgresql.conf

    wal_level = replica
    max_wal_senders = 10
    wal_keep_size = 64 # or wal_keep_segments in older versions
  • 确认pg_hba.conf其中包含复制权限:

    host replication replica_user all md5
  • 检查副本配置。确保在副本上正确设置recovery.conf或等效设置(standby.signalprimary_conninfo)。

相关资源