Postgresサービスの公開

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

クイックスタート に従った場合、 default

名前空間のcluster-example-rw (プライマリ)およびcluster-example-r (読み取り専用)サービスを介してクラスター内にアクセスできるデータベースが作成されているはずです。どちらのサービスもポート 5432 を使用します。

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

警告

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

この例では、 NGINX Ingress Controller を使用します。これは、Kubernetesプロジェクトによって直接維持され、すべてのKubernetesクラスターでセットアップできるためです。他にも多くのコントローラーが利用できます(包括的なリストについては Kubernetes documentation を参照)。

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

  • NGINX Ingressコントローラーがデプロイされ、正常に動作しています

  • クラスターにLoadBalancer タイプのサービスを作成できます

重要

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

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

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の着信接続をデータベースにリダイレクトします。

  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

:ref:`cluster-expose-service.yaml <samples/cluster-expose-service.yaml>` を使用し、 ``kubectl`` を使用して適用できます。

警告

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

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

重要

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

Minikubeでのテスト

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

minikube addons enable ingress

次に、 tcp-service ConfigMap にパッチを適用して、Ingressのポート5432の接続をプライマリにリダイレクトします。

kubectl patch configmap tcp-services -n kube-system \
  --patch {"data":{"5432":"default/cluster-example-rw:5432"}}

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

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

それをnginx-ingress-controller deployment に適用します。

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

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

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