別の名前空間で実行されているポッドにリンクするサービスを、1つの名前空間で定義する方法を探しています。で実行されているポッド内のコンテナは、クラスタDNSでとして参照することで定義されたにnamespaceA
アクセスできることを知っていますが、コンテナ内のコードでの場所を知る必要はありません。つまり、コードでルックアップして、それにアクセスできるようにします。serviceX
namespaceB
serviceX.namespaceB.svc.cluster.local
serviceX
serviceX
Kubernetesのドキュメントでは、これが可能であることを示唆しています。セレクタなしでサービスを定義する理由の1つは、サービスを別の名前空間または別のクラスタのサービスにポイントしたいということです。
それは私に私がすべきことを示唆しています:
- セレクタなしで
serviceX
サービスをで定義しますnamespaceA
(選択したいPODがにないためnamespaceA
)。 - でサービス(これも
serviceX
)を定義し、namespaceB
次に - で
namespaceA
指すようserviceX
にEndpointsオブジェクトを定義しnamespaceB
ます。
私が達成できなかったのは、この3番目のステップです。
まず、Endpointsオブジェクトを次のように定義してみました。
kind: Endpoints
apiVersion: v1
metadata:
name: serviceX
namespace: namespaceA
subsets:
- addresses:
- targetRef:
kind: Service
namespace: namespaceB
name: serviceX
apiVersion: v1
ports:
- name: http
port: 3000
それは論理的なアプローチのようであり、明らかにそれが何のtargetRef
ためにあるのか。しかし、これによりip
、addresses
配列内のフィールドは必須であるというエラーが発生しました。だから、私の次の試みが固定CLUSTERIPアドレスを割り当てることだったserviceX
中namespaceB
、およびIPフィールドにいることを置く(ことに注意してくださいservice_cluster_ip_range
として構成され192.168.0.0/16
、そして192.168.1.1
ためCLUSTERIPとして割り当てられたserviceX
中にnamespaceB
、serviceX
中にnamespaceA
自動で異なるCLUSTERIPを割り当てられた192.168.0.0/16
サブネット) :
kind: Endpoints
apiVersion: v1
metadata:
name: serviceX
namespace: namespaceA
subsets:
- addresses:
- ip: 192.168.1.1
targetRef:
kind: Service
namespace: namespaceB
name: serviceX
apiVersion: v1
ports:
- name: http
port: 3000
それは受け入れられましたが、serviceX
in へのアクセスnamespaceA
はポッドに転送されませんでしたnamespaceB
-彼らはタイムアウトしました。iptablesの設定を見ると、NATプレルーティングを2回実行する必要があったようです。
しかし、満足のいく解決策ではありません- -私は働いていた検索をした唯一のものは提供ポッドの実際のIPアドレスをルックアップするためにあるserviceX
中でのnamespaceB
そして内のエンドポイントのオブジェクトにそのアドレスを置きますnamespaceA
。もちろん、ポッドのIPアドレスは時間とともに変化する可能性があるため、これは満足のいくものではありません。それが解決すべきサービスIPの問題です。
それで、あるネームスペースのサービスを別のネームスペースで実行されているサービスにポイントできるというドキュメントの約束のように思われるものを満たす方法はありますか?
なぜこれをしたいのかとコメントした人が質問しました-少なくとも私にとって意味のある使用例を以下に示します:
テナント間で共有できる共通のデータアクセス機能も含まれているマルチテナントシステムがあるとします。ここで、共通のAPIを持つこのデータアクセス関数にはさまざまなフレーバーがあり、パフォーマンス特性が異なると想像してください。一部のテナントはそのうちの1つにアクセスでき、他のテナントは別のテナントにアクセスできます。
各テナントのポッドは独自の名前空間で実行されますが、各ポッドはこれらの一般的なデータアクセスサービスの1つにアクセスする必要があり、サービスは別の名前空間にある必要があります(複数のテナントによってアクセスされるため)。ただし、より高性能なサービスにアクセスするためにサブスクリプションが変更された場合、テナントがコードを変更する必要はありません。
可能性のある解決策(それが機能したとしても、私が考えることができる最もクリーンな解決策)は、データアクセスサービスの各テナントの名前空間にサービス定義を含め、それぞれを適切なエンドポイント用に構成することです。このサービス定義は、各テナントが使用する資格がある適切なデータアクセスサービスを指すように構成されます。