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