Connectivity#

PGDクラスター内の安全なネットワーク通信に関する情報には次のものが含まれます。

サービス#

PGDクラスター内のリソースは、Kubernetesサービスを介してアクセスできます。すべてのPGDグループは、それらのいくつかを管理します。つまり

  • ノードごとに1つのサービス、内部通信_node service_に使用されます。

  • グループ内の任意のノードに到達する_group service_。主にEDB CloudNativePGグローバルクラスターがクラスター内の新しいグループを検出するために使用します。

  • アプリケーションがPGDプロキシを使用して透過的にグループの書き込みリーダーに到達できるようにする_proxy service_。

  • PGDプロキシを透過的に使用して、アプリケーションがグループの_read nodes_に到達できるようにする_proxy-r service_。このサービスはデフォルトで無効になっており、.spec.proxySettings.enableReadNodeRouting 設定によって制御されます。

注釈

_read nodes_という用語は、書き込みリーダーとして指定されていないノードを指します。 PGDグループでは、各ノードは書き込みを処理できます。書き込みリーダーは、 proxy service を介して書き込みを処理するように指定された選択されたノードです。一方、 proxy-r service が到達する_read nodes_も書き込み可能ですが、 write SQLコマンドが`proxy-r service` に送信されないことを確認するのはユーザーの責任です。詳細については、 Read-only routing with PGD Proxy を参照してください。

これらのサービスを使用する例については、 アプリケーションからの接続 を参照してください。

Basic architecture of an EDB CloudNativePG Global Cluster PGD group

Basic architecture of an EDB CloudNativePG Global Cluster PGD group#

各サービスは、マニフェストの.spec.connectivity セクションのカスタマイズ可能なテンプレートから生成されます。

すべてのサービスは、すべてのKubernetesクラスターのすべてのPGDノードからFQDNを使用して到達可能である必要があります。 ドメイン名解決 を参照してください。

EDB CloudNativePG Global Clusterは、次のレベルでサービスを簡単にカスタマイズできる可用性を提供するサービステンプレートフレームワークを提供します。

  • ノードサービステンプレート 各PGDノードは、 .spec.connectivity.nodeServiceTemplate セクションで構成できるサービスを使用して到達可能です。

  • グループサービステンプレート 各PGDグループには、グループ全体の単一のエントリポイントであり、 .spec.connectivity.groupServiceTemplate セクションで構成できるグループサービスがあります。

  • プロキシサービステンプレート 各PGDグループには、PGDプロキシを介してグループ書き込みリーダーに到達するプロキシサービスがあり、 .spec.connectivity.proxyServiceTemplate セクションで構成できます。これは、アプリケーションのエントリーポイントサービスです。

  • プロキシ読み取りサービステンプレート 各PGDグループには、PGDプロキシを介してグループ読み取りノードに到達するプロキシサービスがあり、 .spec.proxySettings.enableReadNodeRouting で有効にでき、.spec.connectivity.proxyReadServiceTemplate セクションで構成できます。これは、アプリケーションのエントリーポイントサービスです。

テンプレートを使用して、LoadBalancerサービスを作成したり、任意のアノテーションとラベルをサービスに追加して、Kubernetesシステムで使用可能な他のコンポーネントと統合したり、外部DNS名を作成したり、生成されたロードバランサーを調整したりできます。

次に、LoadBalancerプロキシサービスを作成するプロキシサービステンプレートの例を示します。

spec:
  connectivity:
    ...
    proxyServiceTemplate:
      metadata:
        annotations:
        ...
      spec:
        loadBalancerSourceRanges:
        - 0.0.0.0/0
        ports:
        - name: postgres
          port: 5432
          protocol: TCP
          targetPort: 5432
        type: LoadBalancer
      updateStrategy: patch

ドメイン名解決#

EDB CloudNativePG グローバルクラスターは、 PGDグループ内のすべてのリソースがFQDNを持つことを保証し、慣例により、 PGDグループ名をそれらのすべてのプレフィックスとして使用します。

その結果、 PGDグループのドメイン名を定義することが想定されます。これは、 .spec.connectivity.dns セクションを介して行うことができます。このセクションは、2つのフィールドでリソースのFQDNを生成する方法を制御します。

  • domain — 使用するPGDグループ内のすべてのオブジェクトのドメイン名必須。

  • hostSuffix — PGDグループの各サービスに追加するサフィックスオプショナル。

TLS構成#

EDB CloudNativePGグローバルクラスターでは、PGDクラスター内のリソースが安全な接続を介して通信する必要があります。 PostgreSQLの SSL connections のネイティブサポートに依存しています

セキュリティを向上させるためにTLSプロトコルを使用してクライアント/サーバー通信を暗号化します。

現在、EDB CloudNativePGグローバルクラスターでは、 cert-manager をインストールする必要があります。 Cert-managerは、Kubernetes環境の標準として広く認識されているため、動的証明書をプロビジョニングするツールとして選択されました。

spec.connectivity.tls セクションでは、ノード間の通信がどのように発生するかを説明します。 TLSの構成の詳細については、 'Certificates' を参照してください。

アプリケーションからの接続#

同じKubernetesクラスター内またはクラスターの外部から実行されているアプリケーションからPGDグループに接続するのは、簡単な手順です。どちらの場合も、 app ユーザーとしてPGDグループのプロキシサービスに接続します。プロキシサービスは、接続しているプロキシサービスに応じて、PGDグループの書き込みリーダーまたは読み取りノードに接続をルーティングするLoadBalancerサービスです。

クラスター内からの接続#

クラスター内から接続する場合、プロキシサービス名を使用してPGDグループに接続できます。プロキシサービス名は、PGDグループ名と-proxy 、およびPGDGroup カスタムリソースの.spec.connectivity.dns セクションで定義されたオプションのホストサフィックスで構成されます。

たとえば、 PGDグループ名がmy-group で、ホストサフィックスが.my-domain.com の場合、プロキシサービス名はmy-group-proxy.my-domain.com になります。

接続する前に、アプリユーザーのシークレットからアプリユーザーのパスワードを取得する必要があります。アプリユーザー名はspec.pgd.ownerName によって定義され、アプリユーザーシークレットはspec.pgd.ownerCredentialsSecret によって定義されます

次のコマンドを使用して、シークレットからユーザー名とパスワードを取得できます。

kubectl get secret <app user secret> -o jsonpath={.data.username} | base64 --decode
kubectl get secret <app user secret> -o jsonpath={.data.password} | base64 --decode

これにより、 PGDグループへの接続文字列のすべての部分が揃います。

postgresql://<app-user>:<app-password>@<proxy-service-name>:5432/<database>

または、 psql 呼び出しの場合

psql -U <app-user> -h <proxy-service-name> <database>

app-user およびapp-password は、シークレットから取得した値であり、 database は、spec.pgd.databaseName で定義された、接続するデータベースの名前です。デフォルトは、アプリユーザーのapp です。

Kubernetesクラスターの外部からの接続#

Kubernetesクラスターの外部から接続する場合、一般的には、 Ingress リソースまたは load balancer が必要です。環境での動作の詳細については、クラウドプロバイダーまたはローカルインストールを確認してください。

イングレスとロードバランサーでは、接続をPGDプロキシに転送するためにポッドセレクターが必要です。それらを構成するときは、次のラベルを使用することをお勧めします。

  • k8s.pgd.enterprisedb.io/group — PGDグループ名を設定します。

  • k8s.pgd.enterprisedb.io/workloadType — pgd-proxy に設定します。

ローカル開発にKindまたは他のソリューションを使用している場合、外部からPGDグループにアクセスする最も簡単な方法は、プロキシサービスへのポート転送を使用することです。次のコマンドを使用して、ローカルマシンのポート5432をプロキシサービスに転送できます。

kubectl port-forward svc/my-group.my-domain.com 5432:5432

my-group.my-domain.com は、前の例のプロキシサービス名です。