Service Management
==================

PostgreSQLクラスターには、KubernetesのEDB
Postgresが直接管理する標準のKubernetesネットワークサービスを介してのみアクセスする必要があります。詳細については、
`Service <https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies>`_ を参照してください。

KubernetesのEDB Postgresは、 ``Cluster``
リソースごとに3種類のサービスを定義します。

- ``rw``
  クラスターのプライマリインスタンスへのポイント読み取り/書き込み。

- ``ro`` レプリカを指します使用可能な場合読み取り専用。

- ``r`` クラスター内のPostgreSQLインスタンスを指します読み取り。

デフォルトでは、KubernetesのEDB Postgresは、次の規則で\ ``Cluster``
リソースの上記のすべてのサービスを作成します。

- サービスの名前は、\ ``<CLUSTER_NAME>-<SERVICE_NAME>``
  の形式に従います。

- すべてのサービスは\ ``ClusterIP`` タイプです。

..  Important::
   デフォルトのサービス名は、Kubernetesを使用するためにEDB Postgresのために予約されています。

この設定は、同じKubernetesクラスター内のPostgreSQLにアクセスするためのほとんどのユースケースをカバーしていますが、KubernetesのEDB
Postgresは次のような柔軟性を提供します。

- ``ro`` および/または\ ``r`` デフォルトサービスの作成を無効にします。

- Kubernetesが提供する標準の\ ``Service``
  APIを使用して、独自のサービスを定義します。

これら2つのオプションを組み合わせることができます。

一般的なシナリオは、Kubernetesクラスターの外部からデータベースへのアクセスが必要なDBaaSコンテキストでKubernetesのEDB
Postgresを使用する場合に発生します。このような場合、Kubernetes環境で使用可能な場合、タイプ\ ``LoadBalancer``
の独自のサービスを作成できます。

デフォルトサービスの無効化
--------------------------

:ref:`managed.services.disabledDefaultServices <API Reference - v1.25.1>` を介して、 ``ro`` および\ ``r``
デフォルトサービスの一部またはすべてを無効にできます。

..  Important::
   KubernetesのEDB Postgresはそれに依存してPostgreSQLレプリケーションを保証するため、 `rw` サービスは必須であり、無効にすることはできません。

たとえば、 ``ro`` 読み取り専用と\ ``r``
読み取りサービスの両方を削除する場合は、次の構成を使用できます。

.. code:: yaml


   #  <snip>

   managed:
     services:
       disabledDefaultServices: ["ro", "r"]

独自のサービスの追加
--------------------

..  Important::
   独自のサービスを定義する場合、規約`<CLUSTER_NAME>-<SERVICE_NAME>` に従っているデフォルトの予約サービス名は使用できません。 Kubernetes名前空間でサービスの一意の名前を選択するのはあなたの責任です。

:ref:`managed.services.additional <API Reference - v1.25.1>` を介して追加サービスのリストを定義できます。

``selectorType`` フィールドでサービスタイプ\ ``rw``
などを指定し、オプションで\ ``updateStrategy`` を指定します。

``serviceTemplate`` フィールドは、ネットワーク\ ``Service``
リソースの標準のKubernetes APIにアクセスし、必要に応じて ``metadata``
および\ ``spec`` セクションの両方を定義できます。

``name`` をサービスに提供し、\ ``selector``
フィールドはオペレーターによって管理されるため、定義しないでください。

..  Warning::
   サービステンプレートは、PostgreSQLデータベースへのネットワークアクセスの構成という点で無限の可能性を提供します。これは、サービスが期待どおりに動作することを保証するための、あなたの側の責任の増大を意味します。 KubernetesのEDB Postgresは、セレクターを尊重することを除き、サービス構成を制御できません。

``updateStrategy``
フィールドを使用すると、オペレーターがサービス定義を更新する方法を制御できます。デフォルトでは、オペレーターは\ ``patch``
ストラテジーを使用し、変更をサービスに直接適用します。または、
``replace``
ストラテジーは、既存のサービスを削除し、テンプレートから再作成します。

..  Warning::
   `replace` ストラテジーは、変更されるたびにサービスの中断を発生させます。  ただし、サービスの作成中にのみ設定できる特定のパラメーターを変更するために必要になる場合があります。

たとえば、PostgreSQLデータベースプライマリに単一の\ ``LoadBalancer``
サービスを使用する場合、次の抜粋を使用できます。

.. code:: yaml


   #  <snip>

   managed:
     services:
       additional:
         - selectorType: rw
           serviceTemplate:
             metadata:
               name: "mydb-lb"
               labels:
                 test-label: "true"
               annotations:
                 test-annotation: "true"
             spec:
               type: LoadBalancer

上記の例は、作成したサービスのアノテーションやラベルなどのメタデータを設定する方法も示しています。

Postgresサービスの公開について
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

PostgreSQLサービスをKubernetesクラスターの外部に公開するには、主に3つのユースケースがあります。

- 一時的に、テスト用。

- 永続的に、 **DBaaS目的** 。

- 長期/永久
  簡単または持続的にコンテナ化できず、Kubernetesの外部の仮想マシンまたは物理マシンに存在する必要がある
  **古いアプリケーション** の場合。この使用例はDBaaSに非常に似ています。

パブリックネットワークからデータベースへのアクセスを許可すると、データベースが悪意のあるユーザーからの潜在的な攻撃にさらされる可能性があることに注意してください。

..  Warning::
   外部アクセスを許可する前にデータベースを保護していることを確認するか、Kubernetesクラスターがプライベートネットワークからのみ到達可能であることを確認してください。
