Я намагався знайти спосіб визначення служби в одному просторі імен, який посилається на Pod, який працює в іншому просторі імен. Я знаю, що контейнери в Pod, що працює в, namespaceA
можуть отримати доступ до serviceX
визначеного namespaceB
, посилаючись на нього в кластері DNS як serviceX.namespaceB.svc.cluster.local
, але я б краще не мав коду всередині контейнера, щоб знати про місцезнаходження serviceX
. Тобто я хочу, щоб код просто шукав, serviceX
а потім мав доступ до нього.
Документація Kubernetes говорить про те, що це можливо. Це говорить про те, що одна з причин того, що ви б визначили службу без селектора, полягає в тому, що ви хочете вказати свою послугу на службу в іншому просторі імен або на іншому кластері .
Це підказує мені, що я повинен:
- Визначте
serviceX
послугу вnamespaceA
без селектора (оскільки ПОД, який я хочу вибрати, не входитьnamespaceA
). - Визначте послугу (яку я також зателефонував
serviceX
) уnamespaceB
, а потім - Визначити об'єкт в Endpoints
namespaceA
до точки , щобserviceX
вnamespaceB
.
Саме цей третій крок я не зміг здійснити.
Спочатку я спробував визначити об’єкт Кінцевих точок таким чином:
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
не переадресували до Pod namespaceB
-, вони вичерпалися. Дивлячись на налаштування iptables, схоже, що для цього потрібно було б зробити попереднє маршрутизацію NAT двічі.
Єдиним , що я знайшов , що працювало - але не є задовільним рішенням - це для пошуку фактичного IP - адреси Pod , що забезпечує serviceX
в namespaceB
і помістити цю адресу в об'єкті Endpoints в namespaceA
. Звичайно, це не задовільно, тому що IP-адреса Pod може змінитися з часом. Ось цю проблему IP-адреси служб вирішувати.
Отже, чи є спосіб виконати те, що здається обіцянкою документації, що я можу вказати службу в одному просторі імен на службу, що працює в іншому просторі імен?
Коментолог запитав, чому ви хочете це зробити - ось випадок використання, який має для мене сенс, принаймні:
Скажімо, у вас є система багатоорендарів, яка також включає загальну функцію доступу до даних, якою можна ділитися між орендарями. Тепер уявіть, що ця функція доступу до даних має різні смаки із загальними API, але різними характеристиками. Деякі орендарі отримують доступ до одного з них, інші орендарі мають доступ до іншого.
Кожні орендарі працюють у власних просторах імен, але кожен повинен отримати доступ до однієї з цих загальних служб доступу до даних, яка обов'язково буде знаходитися в іншому просторі імен (оскільки до неї звертаються кілька орендарів). Але ви не хочете, щоб орендар повинен змінити свій код, якщо підписка зміниться, щоб отримати доступ до високоефективної послуги.
Потенційним рішенням (найчистішим, про яке я можу придумати, якби воно працювало) є включення визначення служби у простір імен кожного орендаря для служби доступу до даних, з кожним з яких налаштовано для відповідної кінцевої точки. Це визначення послуги було б налаштовано так, щоб вказувати на належну послугу доступу до даних, яку кожен орендар має право використовувати.