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