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