Exposing Postgres Services

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

クイックスタート を実行した場合、 default 名前空間の

cluster-example-rw (プライマリ)および cluster-example-r (読み取り専用)サービスを介してクラスター内でアクセスできるデータベースが必要になります。両方のサービスはポート 5432 を使用します。

ポート 5432 の外部アクセスからプライマリインスタンスにアクセスできるmakeにしたいとします。 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`` を使用して適用できます。

警告

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

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

重要

イングレスからの接続を許可するように pg_hba を設定してください。

Minikubeでのテスト

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

minikube addons enable ingress

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

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