

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 の Postgres オペレーター (PGO) を Amazon Elastic Kubernetes Service (Amazon EKS) と統合して、クラウドネイティブ環境での PostgreSQL デプロイを合理化します。PGO は、Kubernetes で PostgreSQL データベースを管理するための自動化とスケーラビリティを提供します。PGO を Amazon EKS と組み合わせると、PostgreSQL データベースを効率的にデプロイ、管理、スケーリングするための堅牢なプラットフォームが形成されます。

この統合には、次のような主な利点があります。
+ 自動デプロイ: PostgreSQL クラスターのデプロイと管理を簡素化します。
+ カスタムリソース定義 (CRD):** **PostgreSQL 管理に Kubernetes プリミティブを使用します。
+ 高可用性: 自動フェイルオーバーと同期レプリケーションをサポートします。
+ 自動バックアップと復元:** **バックアップと復元プロセスを合理化します。
+ 水平スケーリング:** **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)」。
+ コマンドラインから AWS リソースを接続する [AWS CLI Config](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html)。
+ Linux、macOS、または Windows にインストールして設定されている [eksctl](https://github.com/eksctl-io/eksctl#installation)。
+ `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 のサービス by Region](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)」をご確認ください。特定のエンドポイントについて確認するには、「[サービスエンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)」ページを参照し、サービスのリンクを選択してください。

## アーキテクチャ
<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 を 3 つのアベイラビリティーゾーン、2 つのレプリカ、PgBouncer、PGO オペレーターとともに使用するためのアーキテクチャ。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/4c164012-7527-4ebe-b6a7-c129600328d6/images/26a5572b-405b-4634-b96a-91254c3ea2c1.png)


このパターンでは、3 つのノードがある Amazon EKS クラスターを含むアーキテクチャを構築します。各ノードは、バックエンドの一連の EC2 インスタンス上で実行されます。この PostgreSQL セットアップはプライマリレプリカアーキテクチャに準拠しており、読み取り負荷の高いユースケースに特に効果的です。アーキテクチャには、以下のコンポーネントが含まれます。
+ **プライマリデータベースコンテナ (pg-primary)**: すべての書き込み操作を指示するメインの PostgreSQL インスタンスをホストします。
+ **セカンダリレプリカコンテナ (pg-replica)**: プライマリデータベースからデータをレプリケートし、読み取り操作を処理する PostgreSQL インスタンスをホストします。
+ **PgBouncer**: PGO に含まれている PostgreSQL データベース用の軽量接続プーラーです。これはクライアントと PostgreSQL サーバーの間に位置し、データベース接続の中継役として機能します。
+ **PGO**: この Kubernetes 環境で PostgreSQL クラスターのデプロイと管理を自動化します。
+ **Patroni**: PostgreSQL の高可用性設定を管理および自動化するオープンソースツールです。PGO に含まれています。Kubernetes で PGO とともに Patroni を使用すると、PostgreSQL クラスターのレジリエンスと耐障害性を確保する上で重要な役割を果たします。詳細については、[Patroni のドキュメント](https://patroni.readthedocs.io/en/latest/)を参照してください。

ワークフローのステップは次のとおりです。
+ **PGO オペレーターのデプロイ**: Amazon EKS で実行される Kubernetes クラスターに PGO オペレーターをデプロイします。これは、Kubernetes マニフェストまたは Helm チャートを使用して実行できます。このパターンでは、Kubernetes マニフェストを使用します。
+ **PostgreSQL インスタンスの定義**: オペレーターが実行されたら、カスタムリソース (CR) を作成して、PostgreSQL インスタンスの目的の状態を指定します。これには、ストレージ、レプリケーション、高可用性設定などの設定が含まれます。
+ **オペレーター管理**: CR などの Kubernetes API オブジェクトを通じてオペレーターをやり取りし、PostgreSQL インスタンスを作成、更新、または削除します。
+ **モニタリングとメンテナンス**: Amazon EKS で実行されている PostgreSQL インスタンスの状態とパフォーマンスをモニタリングできます。多くの場合、オペレーターはモニタリングのためにメトリクスとログ記録を提供します。必要に応じて、アップグレードやパッチ適用などの定期的なメンテナンスタスクを実行できます。詳細については、Amazon EKS ドキュメントの「[クラスターのパフォーマンスをモニタリングし、ログを表示する](https://docs.aws.amazon.com/eks/latest/userguide/eks-observe.html)」を参照してください。
+ **スケーリングとバックアップ**: オペレーターが提供する機能を使用して、PostgreSQL インスタンスをスケーリングし、バックアップを管理できます。

このパターンでは、モニタリング、メンテナンス、およびバックアップ操作については説明しません。

**自動化とスケール**
+ を使用して CloudFormation インフラストラクチャの作成を自動化できます。詳細については、Amazon EKS ドキュメントの「[CloudFormationを使用して Amazon EKS リソースを作成する](https://docs.aws.amazon.com/eks/latest/userguide/creating-resources-with-cloudformation.html)」を参照してください。
+ 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 のサービス を通じて を操作するのに役立つオープンソースツールです。

**その他のツール**
+ [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 クラスターを保護します**。サービスアカウント (IRSA)、ネットワークポリシー、VPC セキュリティグループの AWS Identity and Access Management (IAM) ロールの使用など、EKS クラスターのセキュリティのベストプラクティスを実装します。EKS クラスター API サーバーへのアクセスを制限し、TLS を使用してノードと API サーバー間の通信を暗号化します。
+ Amazon EKS で実行されている PGO と Kubernetes の**バージョン互換性を確保**します。一部の PGO 機能では、特定の Kubernetes バージョンが要求される場合や、互換性の制限が生じる場合があります。詳細については、PGO ドキュメントの「[Components and Compatibility](https://access.crunchydata.com/documentation/postgres-operator/5.2.5/references/components/)」を参照してください。
+ CPU、メモリ、ストレージなど、PGO デプロイの**リソース割り当てを計画**します。PGO とそれが管理する PostgreSQL インスタンスの両方のリソース要件を考慮してください。リソースの使用状況をモニタリングし、必要に応じてリソースをスケーリングします。
+ **高可用性を実現するように設計**します。高可用性を実現するように PGO デプロイを設計し、ダウンタイムを最小限に抑え、信頼性を確保します。複数のアベイラビリティーゾーンに複数の PGO レプリカをデプロイして、耐障害性を確保します。
+ PGO が管理する PostgreSQL データベースの**バックアップおよび復元手順を適用**します。Kubernetes および Amazon EKS と互換性がある PGO またはサードパーティーのバックアップソリューションが提供する機能を使用します。
+ PGO デプロイの**モニタリングとログ記録を設定**し、パフォーマンス、状態、イベントを追跡します。メトリクスのモニタリングには Prometheus、視覚化には Grafana などのツールを使用します。トラブルシューティングと監査のために PGO ログを取得するようログ記録を設定します。
+ PGO、PostgreSQL インスタンス、Kubernetes クラスター内のその他のサービス間の通信を許可するように**ネットワークを適切に設定**します。ネットワークポリシーの適用とトラフィックの分離には、Amazon VPC ネットワーク機能と、Calico や [Amazon VPC CNI](https://github.com/aws/amazon-vpc-cni-k8s) などの Kubernetes ネットワークプラグインを使用します。
+ パフォーマンス、耐久性、スケーラビリティなどの要素を考慮して、PostgreSQL データベースに**適したストレージオプションを選択**します。永続的ストレージには、Amazon Elastic Block Store (Amazon EBS) ボリュームまたは AWS マネージドストレージサービスを使用します。詳細については、Amazon EKS ドキュメントの「[Amazon EBS で Kubernetes ボリュームを保存する](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)」を参照してください。
+ などの**Infrastructure as Code (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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| IAM ロールを作成します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | AWS 管理者 | 

### Amazon EKS クラスターを作成します。
<a name="create-an-eks-cluster"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon EKS クラスターを作成します。 | 既にクラスターをデプロイしている場合は、このステップをスキップします。それ以外の場合は、`eksctl`、Terraform、または AWS アカウント を使用して Amazon EKS クラスターを現在の にデプロイします CloudFormation。このパターンでは、クラスターのデプロイに `eksctl` を使用します。このパターンでは、Amazon EKS のノードグループとして Amazon EC2 を使用します。を使用する場合は AWS Fargate、[eksctl ドキュメント](https://eksctl.io/usage/schema/#managedNodeGroups)`managedNodeGroups`の設定を参照してください。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | AWS 管理者、Terraform または eksctl 管理者、Kubernetes 管理者 | 
| クラスターのステータスを検証します。 | 次のコマンドを実行して、クラスターのノードの現在のステータスを確認します。<pre>kubectl get nodes</pre><br />エラーが発生した場合は、Amazon EKS ドキュメントの[トラブルシューティングセクション](https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html)を参照してください。 | AWS 管理者、Terraform または eksctl 管理者、Kubernetes 管理者 | 

### OIDC ID プロバイダーを作成する
<a name="create-an-oidc-identity-provider"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| IAM OIDC プロバイダーを有効にします。 | Amazon EBS Container Storage Interface (CSI) ドライバーの前提条件として、クラスターに既存の IAM OpenID Connect (OIDC) プロバイダーが必要です。<br />次のコマンドを使用して、IAM OIDC プロバイダーを有効化します。<pre>eksctl utils associate-iam-oidc-provider --region={region} --cluster={YourClusterNameHere} --approve</pre><br />このステップの詳細については、[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><br />暗号化された 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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 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 リソースネーム (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/ja_jp/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | Kubernetes 管理者 | 
| ポッドの作成を確認します。 | 名前空間とデフォルト設定が作成されていることを確認します。<pre>kubectl get pods -n postgres-operator</pre> | AWS 管理者、Kubernetes 管理者 | 
| PVC を確認します。 | 次のコマンドを使用して、永続ボリュームのクレーム (PVC) を確認します。<pre>kubectl describe pvc -n postgres-operator</pre> | AWS 管理者、Kubernetes 管理者 | 

### オペレーターを作成してデプロイする
<a name="create-and-deploy-an-operator"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| オペレーターを作成します。 | `/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><br />これらの更新により、以下が実行されます。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/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/ja_jp/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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| プライマリレプリカにデータを書き込みます。 | 次のコマンドを使用して、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><br />リードレプリカには、前のステップでプライマリレプリカで作成したテーブルが必要です。 | AWS 管理者、Kubernetes 管理者 | 

## トラブルシューティング
<a name="streamline-postgresql-deployments-amazon-eks-pgo-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| ポッドが起動しません。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 
| レプリカがプライマリデータベースに対して大幅に遅延しています。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/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/ja_jp/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 
| レプリケーションが機能しません。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/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: Crunchy Postgres for Kubernetes 5.0](https://www.youtube-nocookie.com/embed/IIf9WZO3K50) (ビデオ)