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 サービスに追加する必要があります。 Ingress は、ポート 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