使用 PGO 简化 Amazon EKS 上的 PostgreSQL 部署
Shalaka Dengale,Amazon Web Services
摘要
此模式会将来自 Crunchy Data 的 Postgres Operator(PGO)与 Amazon Elastic Kubernetes Service(Amazon EKS)集成在一起,以便简化云原生环境中的 PostgreSQL 部署。PGO 能够以自动化、可扩展的方式来管理 Kubernetes 中的 PostgreSQL 数据库。将 PGO 与 Amazon EKS 结合使用时,它将成为一个强大的平台,用于高效地部署、管理和扩展 PostgreSQL 数据库。
这一集成提供了下面这些主要优势:
自动部署:简化 PostgreSQL 集群的部署和管理。
自定义资源定义(CRD):使用 Kubernetes 基元来管理 PostgreSQL。
高可用性:支持自动失效转移和同步复制。
自动备份和恢复:简化备份和还原过程。
水平扩展:为 PostgreSQL 集群启用动态扩展。
版本升级:帮助进行滚动升级,并最大限度地减少停机时间。
安全性:实施加密、访问控制和身份验证机制。
先决条件和限制
先决条件
一个活跃的 AWS 账户。
AWS 命令行界面(AWS CLI)版本 2,已在 Linux、macOS 或 Windows 上安装并配置。
AWS CLI Config,用于从命令行连接 AWS 资源。
eksctl
,已在 Linux、macOS 或 Windows 上安装并配置。 kubectl,已安装并配置为访问 Amazon EKS 集群上的资源。有关详情,请参阅 Amazon EKS 文档中的设置 kubectl 和 eksctl。您的计算机终端被配置为访问 Amazon EKS 集群。有关详情,请参阅 Amazon EKS 文档中的将计算机配置为与您的集群通信。
产品版本
Kubernetes 版本 1.21 到 1.24 或更高版本(请参阅 PGO 文档
)。 PostgreSQL 版本 10 或更高版本。此模式使用 PostgreSQL 版本 16。
限制
部分 AWS 服务在有些 AWS 区域不可用。有关区域可用性,请参阅按区域划分的 AWS 服务
。有关特定端点,请参阅服务端点和配额页面,然后选择相应服务的链接。
架构
目标技术堆栈
Amazon EKS
Amazon Virtual Private Cloud(Amazon VPC)
Amazon Elastic Compute Cloud(Amazon EC2)
目标架构

此模式将构建一个架构,其中包含一个具有三个节点的 Amazon EKS 集群。每个节点都在后端的一组 EC2 实例上运行。此 PostgreSQL 设置遵循主副本架构,这对于需要执行大量读取操作的使用案例特别有效。此架构包括以下组件:
主数据库容器(pg-primary)托管着主 PostgreSQL 实例,所有写入操作都将定向到此实例。
辅助副本容器(pg-replica)托管着 PostgreSQL 实例,这些实例将从主数据库复制数据并处理读取操作。
PgBouncer 是一款轻量级连接池程序,适用于 PGO 中包含的 PostgreSQL 数据库。它位于客户端与 PostgreSQL 服务器之间,并充当各个数据库连接的媒介。
在此 Kubernetes 环境中,PGO 可以自动部署和管理 PostgreSQL 集群。
Patroni 是一款开源工具,负责管理和自动执行 PostgreSQL 的高可用性配置。它包含在 PGO 中。当在 Kubernetes 中将 Patroni 与 PGO 结合使用时,它将发挥至关重要的作用,确保 PostgreSQL 集群的弹性和容错能力。有关详情,请参阅 Patroni 文档
。
此工作流包含以下步骤:
部署 PGO Operator。您需要将 PGO Operator 部署到 Amazon EKS 上运行的 Kubernetes 集群上。可以使用 Kubernetes 清单或 Helm 图表来完成此操作。此模式使用 Kubernetes 清单。
定义 PostgreSQL 实例。当 Operator 运行时,您可以创建自定义资源(CR),以便为 PostgreSQL 实例指定所需的状态。这包括存储、复制和高可用性设置等配置。
Operator 管理。您可以通过 Kubernetes API 对象(例如 CR)与 Operator 进行交互,以便创建、更新或删除 PostgreSQL 实例。
监控和维护。您可以监控 Amazon EKS 上运行的 PostgreSQL 实例的运行状况和性能。Operator 通常会提供用于进行监控的指标和日志记录功能。您可以根据需要执行例行维护任务,例如升级和修补。有关详情,请参阅 Amazon EKS 文档中的监控集群性能和查看日志。
扩展和备份:您可以使用 Operator 提供的功能来扩展 PostgreSQL 实例以及管理备份。
此模式不包含监控、维护和备份操作。
自动化和扩展
您可以使用 CloudFormation 来自动创建基础设施。有关详情,请参阅 Amazon EKS 文档中的使用 CloudFormation 创建 Amazon EKS 资源。
您可以使用 GitVersion 或 Jenkins 内部版本号来自动部署数据库实例。
工具
AWS 服务
Amazon Elastic Kubernetes Service(Amazon EKS)可帮助您在 AWS 上运行 Kubernetes,而无需安装或维护您自己的 Kubernetes 控制面板或节点。
AWS Command Line Interface(AWS CLI)是一款开源工具,可帮助您在命令行 shell 中通过命令与 AWS 服务 进行交互。
其他工具
最佳实践
请遵循以下最佳实践,以便确保顺利、高效地进行部署:
保护您的 EKS 集群。为您的 EKS 集群实施安全最佳实践,例如使用服务账户的 AWS Identity and Access Management(IAM)角色(IRSA)、网络策略和 VPC 安全组。限制对 EKS 集群 API 服务器的访问,并使用 TLS 对节点与 API 服务器之间的通信进行加密。
确保 Amazon EKS 上运行的 PGO 版本与 Kubernetes 版本兼容。有些 PGO 功能可能需要特定的 Kubernetes 版本,或者引入了兼容性限制。有关详情,请参阅 PGO 文档中的组件和兼容性
。 为 PGO 部署规划资源分配,包括 CPU、内存和存储。考虑 PGO 以及它管理的 PostgreSQL 实例的资源需求。监控资源使用情况,并根据需要来扩展资源。
专为高可用性而设计。设计您的 PGO 部署以便实现高可用性,从而最大限度地减少停机时间并确保可靠性。跨多个可用区部署 PGO 的多个副本,以便获得容错能力。
为 PGO 管理的 PostgreSQL 数据库实施备份和还原程序。使用 PGO 提供的功能,或者使用与 Kubernetes 和 Amazon EKS 兼容的第三方备份解决方案。
为 PGO 部署设置监控和日志记录,以便跟踪性能、运行状况和事件。使用 Prometheus 等工具来监控指标,并使用 Grafana 进行可视化。配置日志记录以便捕获 PGO 日志,从而进行问题排查和审核。
正确配置网络,以便能够在 PGO、PostgreSQL 实例以及 Kubernetes 集群中的其他服务之间进行通信。使用 Amazon VPC 联网功能和 Kubernetes 联网插件(例如 Calico 或 Amazon VPC CNI
)来实施网络策略和隔离流量。 考虑性能、持久性和可扩展性等因素,为 PostgreSQL 数据库选择合适的存储选项。使用 Amazon Elastic Block Store(Amazon EBS)卷,或者 AWS 托管式存储服务来进行持久存储。有关详情,请参阅 Amazon EKS 文档中的使用 Amazon EBS 存储 Kubernetes 卷。
使用基础设施即代码(IaC)工具(例如 CloudFormation),在 Amazon EKS 上自动部署和配置 PGO。将基础设施组件(包括 EKS 集群、网络和 PGO 资源)定义为代码,以便实现一致性、可重复性和版本控制。
操作说明
| 任务 | 说明 | 所需技能 |
|---|---|---|
创建一个 IAM 角色。 |
| AWS 管理员 |
| 任务 | 说明 | 所需技能 |
|---|---|---|
创建一个 Amazon EKS 集群。 | 如果您已部署一个集群,请跳过此步骤。否则,请使用 注意此模式将 Amazon EC2 用作 Amazon EKS 的一个节点组。如果希望使用 AWS Fargate,请参阅 eksctl 文档
| AWS 管理员、Terraform 或 eksctl 管理员、Kubernetes 管理员 |
验证此集群的状态。 | 运行如下命令,查看此集群中的节点的当前状态:
如果遇到错误,请参阅 Amazon EKS 文档中的问题排查部分。 | AWS 管理员、Terraform 或 eksctl 管理员、Kubernetes 管理员 |
| 任务 | 说明 | 所需技能 |
|---|---|---|
启用 IAM OIDC 提供程序。 | Amazon EBS Container Storage Interface(CSI)驱动程序的一个先决条件是,您的集群必须具有一个现有的 IAM OpenID Connect(OIDC)提供程序。 使用如下命令,启用 IAM OIDC 提供程序:
有关此步骤的详情,请参阅 Amazon EKS 文档。 | AWS 管理员 |
为 Amazon EBS CSI 驱动程序创建一个 IAM 角色。 | 使用如下
如果使用加密的 Amazon EBS 驱动器,您必须进一步配置此策略。有关说明,请参阅 Amazon EBS SCI 驱动程序文档 | AWS 管理员 |
添加 Amazon EBS CSI 驱动程序。 | 使用如下
| AWS 管理员 |
| 任务 | 说明 | 所需技能 |
|---|---|---|
克隆 PGO 存储库。 | 为 PGO 克隆 GitHub 存储库:
| AWS DevOps |
提供用于创建服务账户的角色详细信息。 | 要授权 Amazon EKS 集群访问所需的 AWS 资源,请指定您之前在
| AWS 管理员、Kubernetes 管理员 |
创建此命名空间和 PGO 先决条件。 |
| Kunernetes 管理员 |
确认已创建容器组(pod)。 | 确认已创建此命名空间和默认配置:
| AWS 管理员、Kubernetes 管理员 |
验证 PVC。 | 使用如下命令,验证持久卷声明(PVC):
| AWS 管理员、Kubernetes 管理员 |
| 任务 | 说明 | 所需技能 |
|---|---|---|
创建一个 Operator。 | 修改位于
这些更新将执行以下操作:
| AWS 管理员、数据库管理员、Kubernetes 管理员 |
部署此 Operator。 | 部署此 PGO Operator,以便能够简化 Kubernetes 环境中的 PostgreSQL 数据库的管理和操作:
| AWS 管理员、数据库管理员、Kubernetes 管理员 |
验证部署。 |
从命令输出中,记下主副本( | AWS 管理员、数据库管理员、Kubernetes 管理员 |
| 任务 | 说明 | 所需技能 |
|---|---|---|
向主副本写入数据。 | 使用以下命令,连接到 PostgreSQL 主副本,并向数据库写入数据:
| AWS 管理员、Kubernetes 管理员 |
确认只读副本具有相同的数据。 | 连接到 PostgreSQL 只读副本,并检查流式复制功能是否正常运行:
只读副本应当具有您在上一步中在主副本中创建的表。 | AWS 管理员、Kubernetes 管理员 |
问题排查
| 问题 | 解决方案 |
|---|---|
容器组(pod)无法启动。 |
|
副本明显落后于主数据库。 |
|
您无法了解 PostgreSQL 集群的性能和运行状况。 |
|
复制功能无法正常工作。 |
|
相关资源
Amazon Elastic Kubernetes Service(AWS 上的部署选项概述白皮书)
CloudFormation(AWS 上的部署选项概述白皮书)
开始使用 Amazon EKS – eksctl(《Amazon EKS 用户指南》)
设置 kubectl 和 eksctl(《Amazon EKS 用户指南》)
创建用于 OpenID Connect 联合身份验证的角色(《IAM 用户指南》)
配置用于 AWS CLI 的设置(《AWS CLI 用户指南》)