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 `_ を使用します。他の多くのコントローラが使用できます :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 次を実行しているマシンからプライマリにアクセスできます。