Connecting from an application
==============================

アプリケーションは、同じKubernetesクラスター内のEDB
CloudNativePGクラスターによって作成されたサービスで動作することになっています。

サービスとその管理方法の詳細については、
:ref:`Service Management <Service Management>` セクションを参照してください。

..  Hint::
   アプリケーションでこれらのサービスを使用し、特定のPostgreSQLインスタンスに直接接続することを強くお勧めします。後者はクラスターの有効期間中に変更される可能性があります。

これらのサービスは、次の方法でアプリケーションで使用できます。

- DNS解決

- 環境変数

PostgreSQLに接続するための資格情報には、オペレーターによって生成されたシークレットを使用できます。

..  Seealso::
   接続プーラーとしてPgBouncerを利用し、アプリケーションとPostgreSQLクラスターの間にアクセスレイヤーを作成する方法については、 :ref:`PgBouncerを使用した接続プーリング <PgBouncerを使用した接続プーリング>` を参照してください。

DNS解決
^^^^^^^

Kubernetes
DNSサービスを使用して、特定のサーバーをポイントできます。オペレーターにはKubernetes
DNSサービスが必要です。アプリケーションがPostgreSQLクラスターと同じ名前空間に展開されている場合、サービスの名前を使用してこれを行うことができます。
PostgreSQLクラスターが別の名前空間にある場合、完全な修飾子\ ``service-name.namespace-name``
を使用できます。

DNSが優先および推奨される検出方法です。

環境変数
^^^^^^^^

PostgreSQLクラスターが含まれる同じ名前空間にアプリケーションを展開する場合、環境変数を使用してデータベースに接続することもできます。

たとえば、PostgreSQLクラスターの名前が\ ``pg-database``
であるとすると、アプリケーションで次の環境変数を使用できます。

- ``PG_DATABASE_R_SERVICE_HOST``
  読み取り専用ワークロードのすべてのPostgreSQLインスタンスを指すサービスのIPアドレス

- ``PG_DATABASE_RO_SERVICE_HOST``
  クラスターのすべてのホットスタンバイレプリカをポイントするサービスのIPアドレス

- ``PG_DATABASE_RW_SERVICE_HOST`` クラスターの *プライマリ*
  インスタンスを指すサービスのIPアドレス

シークレット
^^^^^^^^^^^^

PostgreSQLオペレーターは、展開するPostgreSQLクラスターごとに最大2つの\ ``basic-auth``
タイプシークレットを生成します。

- ``[cluster name]-app`` ``.spec.bootstrap.initdb.secret.name``
  を介して既存のシークレットを提供していない場合

- ``[cluster name]-superuser`` ``.spec.enableSuperuserAccess``
  が\ ``true`` に設定されており、\ ``.spec.superuserSecret``
  を使用して別のシークレットを指定していない場合

各シークレットには次のものが含まれます。

- ユーザー名

- パスワード

- RWサービスへのホスト名

- ポート番号

- データベース名

- 作業用 `.pgpass file <https://www.postgresql.org/docs/current/libpq-pgpass.html>`_ 

- `uri <https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING>`_ 

- `jdbc-uri <https://jdbc.postgresql.org/documentation/use/#connecting-to-the-database>`_ 

``-app``
資格情報は、PostgreSQLクラスターに接続するアプリケーションが使用するもので、データベースを
*所有* しているユーザーに対応します。

``-superuser`` のものは、管理目的でのみ使用されることになっており、
``postgres`` ユーザーに対応します。

..  Important::
   ネットワーク上のスーパーユーザーのアクセスはデフォルトで無効になっています。
