Postgresサービスの公開
======================

このセクションでは、PostgreSQLサービスを外部に公開し、NGINX Ingress
Controllerを使用して **Kubernetesクラスターの外部から**
PostgreSQLデータベースへのアクセスを許可する方法について説明します。

 :ref:`クイックスタート <クイックスタート>` に従っている場合、今までに、 ``default``
名前空間の\ ``cluster-example-rw``
プライマリおよび\ ``cluster-example-r``
読み取り専用サービスを介してクラスター内にアクセスできるデータベースが完成しているはずです。どちらのサービスもポート\ ``5432``
を使用します。

ポート\ ``5432``
の外部アクセスからプライマリインスタンスにアクセスできるようにすることにします。
Kubernetesインフラストラクチャに移行する場合の典型的なユースケースは、実際、簡単または持続的に「コンテナ化」できない
**古いアプリケーション**
に代表されるユースケースです。賢明な回避策は、仮想マシンまたは物理サーバーにある可能性が高いアプリケーションが、同じネットワーク内のKubernetesクラスター内のPostgreSQLデータベースにアクセスできるようにすることです。

..  Warning::
   パブリックネットワークからデータベースへのアクセスを許可すると、データベースが悪意のあるユーザーからの潜在的な攻撃にさらされる可能性があります。外部アクセスを許可する前にデータベースが保護されていること、またはKubernetesクラスターがプライベートネットワークからのみ到達可能であることを確認します。

この例では、
Kubernetesプロジェクトによって直接維持され、すべてのKubernetesクラスターで設定できるため、
 `NGINX Ingress Controller <https://kubernetes.github.io/ingress-nginx/>`_  を使用します。他の多くのコントローラが使用できます
 :ref:`Kubernetes documentation <カスタムポッドコントローラ>` を参照してください

包括的なリストについては。

次のことを前提としています。

-  NGINX Ingressコントローラが展開され、正常に動作します

-  クラスターに\ ``LoadBalancer``
   タイプのサービスを作成することが可能です

..  Important::
   入力は、HTTPおよびHTTPSトラフィックを公開する場合にのみ必要です。 NGINX Ingressコントローラはできますが、すべてのIngressオブジェクトが任意のポートまたはプロトコルを公開できるわけではありません。

最初のステップは、 ``tcp-services`` ``ConfigMap``
を作成することです。そのデータフィールドには、外部に公開されたポートと、内部でポイントする名前空間、サービス、ポートに関する情報が含まれています。

.. code:: yaml

   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: tcp-services
     namespace: ingress-nginx
   data:
     5432: default/cluster-example-rw:5432

次に、ドキュメントで提案されているとおりにNGINX Ingress
Controllerをインストールしている場合、\ ``ingress-nginx``
サービスが必要です。公開するには、5432ポートを\ ``ingress-nginx``
サービスに追加する必要があります。イングレスは、ポート5432での着信接続をデータベースにリダイレクトします。

.. code:: yaml

   apiVersion: v1
   kind: Service
   metadata:
     name: ingress-nginx
     namespace: ingress-nginx
     labels:
       app.kubernetes.io/name: ingress-nginx
       app.kubernetes.io/part-of: ingress-nginx
   spec:
     type: LoadBalancer
     ports:
       - name: http
         port: 80
         targetPort: 80
         protocol: TCP
       - name: https
         port: 443
         targetPort: 443
         protocol: TCP
       - name: postgres
         port: 5432
         targetPort: 5432
         protocol: TCP
     selector:
       app.kubernetes.io/name: ingress-nginx
       app.kubernetes.io/part-of: ingress-nginx

使用できます

::

   - --
   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: tcp-services
     namespace: ingress-nginx
   data:
     5432: default/cluster-example-rw:5432

   - --
   apiVersion: v1
   kind: Service
   metadata:
     name: ingress-nginx
     namespace: ingress-nginx
     labels:
       app.kubernetes.io/name: ingress-nginx
       app.kubernetes.io/part-of: ingress-nginx
   spec:
     type: LoadBalancer
     ports:
       - name: http
         port: 80
         targetPort: 80
         protocol: TCP
       - name: https
         port: 443
         targetPort: 443
         protocol: TCP
       - name: postgres
         port: 5432
         targetPort: 5432
         protocol: TCP
     selector:
       app.kubernetes.io/name: ingress-nginx
       app.kubernetes.io/part-of: ingress-nginx

``kubectl`` を使用して適用します。

..  Warning::
   このファイルを直接適用すると、Ingressの`ConfigMap` および`Service` の以前の変更が上書きされます

これで、Kubernetesクラスターの外部からPostgreSQLクラスターに到達できるようになります。

..  Important::
   Ingressからの接続を許可するように`pg_hba` を構成してください。

Minikubeでのテスト
------------------

Minikubeでは、次を実行するイングレスコントローラをセットアップできます。

.. code:: sh

   minikube addons enable ingress

次に、展開にパッチを適用して、ポート5432でのアクセスを許可できます。次の内容を含む\ ``patch.yaml``
という名前のファイルを作成します。

.. code:: yaml

   spec:
     template:
       spec:
         containers:
         - name: controller
           ports:
            - containerPort: 5432
              hostPort: 5432

そして、それを\ ``ingress-nginx-controller`` 展開に適用します。

.. code:: sh

   kubectl patch deployment ingress-nginx-controller --patch "$(cat patch.yaml)" -n ingress-nginx

次を実行しているマシンからプライマリにアクセスできます。

.. code:: sh

   psql -h $(minikube ip) -p 5432 -U postgres
