

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 PGO 在 Amazon EKS 上簡化 PostgreSQL 部署
<a name="streamline-postgresql-deployments-amazon-eks-pgo"></a>

*Shalaka Dengale，Amazon Web Services*

## 摘要
<a name="streamline-postgresql-deployments-amazon-eks-pgo-summary"></a>

此模式整合來自 Crunchy Data (PGO) 的 Postgres Operator 與 Amazon Elastic Kubernetes Service (Amazon EKS)，以簡化雲端原生環境中的 PostgreSQL 部署。PGO 提供在 Kubernetes 中管理 PostgreSQL 資料庫的自動化和可擴展性。當您將 PGO 與 Amazon EKS 結合時，它會形成強大的平台，以有效率地部署、管理和擴展 PostgreSQL 資料庫。

此整合提供下列主要優點：
+ 自動化部署：簡化 PostgreSQL 叢集部署和管理。
+ 自訂資源定義 (CRDs)：** **使用 Kubernetes 基本概念進行 PostgreSQL 管理。
+ 高可用性：支援自動容錯移轉和同步複寫。
+ 自動化備份和還原：** **簡化備份和還原程序。
+ 水平擴展：** **啟用 PostgreSQL 叢集的動態擴展。
+ 版本升級：促進滾動升級，減少停機時間。
+ 安全性：強制執行加密、存取控制和身分驗證機制。

## 先決條件和限制
<a name="streamline-postgresql-deployments-amazon-eks-pgo-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ [在 Linux、macOS 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 第 2 版](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。  macOS
+ [AWS CLI Config](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html)，從命令列連接 AWS 資源。
+ [eksctl](https://github.com/eksctl-io/eksctl#installation)，在 Linux、macOS 或 Windows 上安裝和設定。
+ `kubectl`，已安裝並設定為存取 Amazon EKS 叢集上的資源。如需詳細資訊，請參閱 Amazon [EKS 文件中的設定 kubectl 和 eksctl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。 
+ 您的電腦終端機已設定為存取 Amazon EKS 叢集。如需詳細資訊，請參閱《Amazon EKS 文件》中的[設定您的電腦與叢集通訊](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#eks-configure-kubectl)。

**產品版本**
+ Kubernetes 1.21–1.24 版或更新版本 （請參閱 [PGO 文件](https://access.crunchydata.com/documentation/postgres-operator/5.2.5/))。
+ PostgreSQL 10 版或更新版本。此模式使用 PostgreSQL 第 16 版。

**限制**
+ 有些 AWS 服務 無法全部使用 AWS 區域。如需區域可用性，請參閱[AWS 服務 依區域](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)頁面，然後選擇服務的連結。

## Architecture
<a name="streamline-postgresql-deployments-amazon-eks-pgo-architecture"></a>

**目標技術堆疊 **
+ Amazon EKS
+ Amazon Virtual Private Cloud (Amazon VPC)
+ Amazon Elastic Compute Cloud (Amazon EC2)

**目標架構 **

![使用 PGO 搭配三個可用區域和兩個複本、PgBouncer 和 PGO 運算子的架構。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/4c164012-7527-4ebe-b6a7-c129600328d6/images/26a5572b-405b-4634-b96a-91254c3ea2c1.png)


此模式建置的架構包含具有三個節點的 Amazon EKS 叢集。每個節點在後端的一組 EC2 執行個體上執行。此 PostgreSQL 設定遵循主要複本架構，對於大量讀取的使用案例特別有效。架構包含下列元件：
+ **主要資料庫容器 (pg-primary)** 託管主 PostgreSQL 執行個體，其中所有寫入操作都會導向。
+ **次要複本容器 (pg-replica)** 託管從主要資料庫複寫資料並處理讀取操作的 PostgreSQL 執行個體。
+ **PgBouncer** 是 PGO 隨附的 PostgreSQL 資料庫輕量型連線集區器。它位於用戶端和 PostgreSQL 伺服器之間，並做為資料庫連線的媒介。
+ **PGO** 會在此 Kubernetes 環境中自動化 PostgreSQL 叢集的部署和管理。
+ **Patroni** 是一種開放原始碼工具，可管理和自動化 PostgreSQL 的高可用性組態。它包含在 PGO 中。當您在 Kubernetes 中使用 Patroni 搭配 PGO 時，它在確保 PostgreSQL 叢集的彈性和容錯能力方面扮演重要角色。如需詳細資訊，請參閱 [Patroni 文件](https://patroni.readthedocs.io/en/latest/)。

工作流程包含以下步驟：
+ **部署 PGO 運算子**。您可以在在 Amazon EKS 上執行的 Kubernetes 叢集上部署 PGO 運算子。這可以透過使用 Kubernetes 資訊清單或 Helm Chart 來完成。此模式使用 Kubernetes 資訊清單。
+ **定義 PostgreSQL 執行個體**。當運算子執行時，您可以建立自訂資源 CRs)，以指定 PostgreSQL 執行個體的所需狀態。這包括儲存、複寫和高可用性設定等組態。
+ **運算子管理**。您可以透過 CRs 等 Kubernetes API 物件與運算子互動，以建立、更新或刪除 PostgreSQL 執行個體。
+ **監控和維護**。您可以監控在 Amazon EKS 上執行的 PostgreSQL 執行個體的運作狀態和效能。運算子通常會為監控目的提供指標和記錄。您可以視需要執行例行維護任務，例如升級和修補。如需詳細資訊，請參閱 Amazon EKS 文件中的[監控叢集效能和檢視日誌](https://docs.aws.amazon.com/eks/latest/userguide/eks-observe.html)。
+ **擴展和備份**：您可以使用運算子提供的功能來擴展 PostgreSQL 執行個體和管理備份。

此模式不包含監控、維護和備份操作。

**自動化和擴展**
+ 您可以使用 CloudFormation 自動建立基礎設施。如需詳細資訊，請參閱[《Amazon EKS 文件》中的使用 建立 CloudFormation](https://docs.aws.amazon.com/eks/latest/userguide/creating-resources-with-cloudformation.html) Amazon EKS 資源。
+ 您可以使用 GitVersion 或 Jenkins 建置號碼來自動化資料庫執行個體的部署。

## 工具
<a name="streamline-postgresql-deployments-amazon-eks-pgo-tools"></a>

**AWS 服務**
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。 
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。

**其他工具**
+ [eksctl](https://eksctl.io/) 是在 Amazon EKS 上建立叢集的簡單命令列工具。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) 是一種命令列公用程式，用於對 Kubernetes 叢集執行命令。
+ [PGO](https://github.com/CrunchyData/postgres-operator) 可自動化和擴展 Kubernetes 中 PostgreSQL 資料庫的管理。

## 最佳實務
<a name="streamline-postgresql-deployments-amazon-eks-pgo-best-practices"></a>

遵循下列最佳實務，以確保部署順暢且高效：
+ **保護您的 EKS 叢集**。實作 EKS 叢集的安全最佳實務，例如針對服務帳戶 AWS Identity and Access Management (IRSA)、網路政策和 VPC 安全群組使用 (IAM) 角色。限制對 EKS 叢集 API 伺服器的存取，並使用 TLS 加密節點和 API 伺服器之間的通訊。
+ **確保在 Amazon EKS 上執行的 PGO 和 Kubernetes 之間的版本相容性**。有些 PGO 功能可能需要特定的 Kubernetes 版本或引入相容性限制。如需詳細資訊，請參閱 PGO 文件中的[元件與相容性](https://access.crunchydata.com/documentation/postgres-operator/5.2.5/references/components/)。
+ 規劃 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](https://github.com/aws/amazon-vpc-cni-k8s) ，以進行網路政策強制執行和流量隔離。
+ 考慮效能、耐用性和可擴展性等因素，為您的 PostgreSQL 資料庫**選擇適當的儲存選項**。使用 Amazon Elastic Block Store (Amazon EBS) 磁碟區或 AWS 受管儲存服務進行持久性儲存。如需詳細資訊，請參閱 [Amazon EKS 文件中的使用 Amazon EBS 存放 Kubernetes 磁碟區](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)。
+ **使用基礎設施做為程式碼 (IaC) 工具** CloudFormation ，例如在 Amazon EKS 上自動化 PGO 的部署和組態。定義基礎設施元件，包括 EKS 叢集、聯網和 PGO 資源，做為一致性、可重複性和版本控制的程式碼。

## 史詩
<a name="streamline-postgresql-deployments-amazon-eks-pgo-epics"></a>

### 建立 IAM 角色
<a name="create-an-iam-role"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 IAM 角色。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | AWS 管理員 | 

### 建立 Amazon EKS 叢集
<a name="create-an-eks-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon EKS 叢集。 | 如果您已部署叢集，請略過此步驟。否則， AWS 帳戶 請使用 `eksctl`、Terraform 或 在您目前的 中部署 Amazon EKS 叢集 CloudFormation。此模式使用 `eksctl`進行叢集部署。此模式使用 Amazon EC2 做為 Amazon EKS 的節點群組。如果您想要使用 AWS Fargate，請參閱 [eksctl 文件](https://eksctl.io/usage/schema/#managedNodeGroups)中的`managedNodeGroups`組態。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | AWS 管理員、Terraform 或 eksctl 管理員、Kubernetes 管理員 | 
| 驗證叢集的狀態。 | 執行下列命令以查看叢集中節點的目前狀態：<pre>kubectl get nodes</pre>如果您遇到錯誤，請參閱 Amazon EKS 文件的[故障診斷一節](https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html)。 | AWS 管理員、Terraform 或 eksctl 管理員、Kubernetes 管理員 | 

### 建立 OIDC 身分提供者
<a name="create-an-oidc-identity-provider"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟用 IAM OIDC 提供者。 | 作為 Amazon EBS 容器儲存介面 (CSI) 驅動程式的先決條件，您必須為叢集擁有現有的 IAM OpenID Connect (OIDC) 提供者。使用下列命令啟用 IAM OIDC 提供者：<pre>eksctl utils associate-iam-oidc-provider --region={region} --cluster={YourClusterNameHere} --approve</pre>如需此步驟的詳細資訊，請參閱 [Amazon EKS 文件](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)。 | AWS 管理員 | 
| 為 Amazon EBS CSI 驅動程式建立 IAM 角色。 | 使用下列`eksctl`命令為 CSI 驅動程式建立 IAM 角色：<pre>eksctl create iamserviceaccount \<br />  --region {RegionName} \<br />  --name ebs-csi-controller-sa \<br />  --namespace kube-system \<br />  --cluster {YourClusterNameHere} \<br />  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \<br />  --approve \<br />  --role-only \<br />  --role-name AmazonEKS_EBS_CSI_DriverRole</pre>如果您使用加密的 Amazon EBS 磁碟機，則必須進一步設定政策。如需說明，請參閱 [Amazon EBS SCI 驅動程式文件](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#installation-1)。 | AWS 管理員 | 
| 新增 Amazon EBS CSI 驅動程式。 | 使用下列`eksctl`命令來新增 Amazon EBS CSI 驅動程式：<pre>eksctl create addon \<br />  --name aws-ebs-csi-driver \<br />  --cluster <YourClusterName> service-account-role-arn arn:aws:iam::$(aws sts get-caller-identity \<br />  --query Account \<br />  --output text):role/AmazonEKS_EBS_CSI_DriverRole \<br />  --force</pre> | AWS 管理員 | 

### 安裝 PGO
<a name="install-pgo"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製 PGO 儲存庫。 | 複製 PGO 的 GitHub 儲存庫：<pre>git clone https://github.com/CrunchyData/postgres-operator-examples.git </pre> | AWS DevOps | 
| 提供建立服務帳戶的角色詳細資訊。 | 若要授予 Amazon EKS 叢集對所需 AWS 資源的存取權，請在位於 [GitHub](https://github.com/CrunchyData/postgres-operator/blob/main/config/rbac/cluster/service_account.yaml) 的`service_account.yaml`檔案中，指定您先前建立之 OIDC 角色的 Amazon Resource Name (ARN)。<pre>cd postgres-operator-examples</pre><pre>---<br />metadata:<br />  annotations:<br />    eks.amazonaws.com/role-arn: arn:aws:iam::<accountId>:role/<role_name> # Update the OIDC role ARN created earlier</pre> | AWS 管理員、Kubernetes 管理員 | 
| 建立命名空間和 PGO 先決條件。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | Kubernetes 管理員 | 
| 驗證 Pod 的建立。 | 確認命名空間和預設組態已建立：<pre>kubectl get pods -n postgres-operator</pre> | AWS 管理員、Kubernetes 管理員 | 
| 驗證 PVCs。 | 使用下列命令來驗證持久性磁碟區宣告 PVCs)：<pre>kubectl describe pvc -n postgres-operator</pre> | AWS 管理員、Kubernetes 管理員 | 

### 建立和部署 運算子
<a name="create-and-deploy-an-operator"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立運算子。 | 修改位於 的檔案內容`/kustomize/postgres/postgres.yaml`以符合下列項目：<pre>spec:<br />  instances:<br />    - name: pg-1<br />      replicas: 3<br />  patroni:<br />    dynamicConfiguration:<br />      postgresql:<br />      pg_hba:<br />        - "host all all 0.0.0.0/0 trust" # this line enabled logical replication with programmatic access<br />        - "host all postgres 127.0.0.1/32 md5"<br />      synchronous_mode: true<br />  users:<br />  - name: replicator<br />    databases:<br />      - testdb<br />    options: "REPLICATION"</pre>這些更新會執行下列動作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | AWS 管理員、DBA、Kubernetes 管理員 | 
| 部署 運算子。 | 部署 PGO 運算子，以在 Kubernetes 環境中啟用 PostgreSQL 資料庫的簡化管理和操作：<pre>kubectl apply -k kustomize/postgres</pre> | AWS 管理員、DBA、Kubernetes 管理員 | 
| 驗證部署。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html)從命令輸出中，記下主要複本 (`primary_pod_name`) 和僅供讀取複本 (`read_pod_name`)。您將在後續步驟中使用這些項目。 | AWS 管理員、DBA、Kubernetes 管理員 | 

### 驗證串流複寫
<a name="verify-streaming-replication"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將資料寫入主要複本。 | 使用以下命令連線至 PostgreSQL 主要複本，並將資料寫入資料庫：<pre>kubectl exec -it <primary_pod_name> bash -n postgres-operator</pre><pre>psql</pre><pre>CREATE TABLE customers (firstname text, customer_id serial, date_created timestamp);<br />\dt</pre> | AWS 管理員、Kubernetes 管理員 | 
| 確認僅供讀取複本具有相同的資料。 | 連線至 PostgreSQL 僅供讀取複本，並檢查串流複寫是否正常運作：<pre>kubectl exec -it {read_pod_name} bash -n postgres-operator</pre><pre>psql</pre><pre>\dt</pre>僅供讀取複本應該具有您在上一個步驟中於主要複本中建立的資料表。 | AWS 管理員、Kubernetes 管理員 | 

## 疑難排解
<a name="streamline-postgresql-deployments-amazon-eks-pgo-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| Pod 不會啟動。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 
| 複本明顯落後於主要資料庫。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 
| 您無法查看 PostgreSQL 叢集的效能和運作狀態。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 
| 複寫無法運作。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 

## 相關資源
<a name="streamline-postgresql-deployments-amazon-eks-pgo-resources"></a>
+ [Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/amazon-elastic-kubernetes-service.html) (*AWS 白皮書上的部署選項概觀*)
+  [CloudFormation](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/aws-cloudformation.html) (*AWS 白皮書上的部署選項概觀*)
+ [開始使用 Amazon EKS – eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) (*Amazon EKS 使用者指南*)
+ [設定 kubectl 和 eksctl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) (*Amazon EKS 使用者指南*)
+ [為 OpenID Connect 聯合建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html) (*IAM 使用者指南*)
+ [設定 的設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)(*AWS CLI 使用者指南*)
+ [Crunchy Postgres for Kubernetes 文件](https://access.crunchydata.com/documentation/postgres-operator/latest)
+ [Crunch & Learn：適用於 Kubernetes 5.0 的 Crunchy Postgres](https://www.youtube-nocookie.com/embed/IIf9WZO3K50) （影片）