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 タイプのサービスを作成できます

重要

イングレスは、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

使用できます

- --
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 を使用して適用します。

警告

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

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

重要

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

Minikubeでのテスト

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

minikube addons enable ingress

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

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

そしてそれをingress-nginx-controller デプロイメントに適用します。

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

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

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