Если у вас есть два отдельных кластера kubernetes например, локальный экземпляр Minikube и некоторый другой удаленный кластер kubernetes , и вы хотите, чтобы они могли взаимодействовать с одним другой, вы можете использовать для этой цели так называемые службы без селекторов .
Вы можете рассматривать удаленный kubernetes кластер как любой другой внешний ресурс (например, сервер базы данных, работающий на отдельная машина / VM), и вы можете представить его внутри вашего кластера. Обычно мы открываем что-то, что выполняется на нашем k8s кластере извне, но в этом случае мы хотим предоставить внешний ресурс внутри нашего кластера, как если бы он был еще одним внутренним ресурсом. С точки зрения Pods
он фактически выглядит как внутренний ресурс, который доступен в локальном кластерном домене, точно так же, как внутренние ресурсы, предоставляемые простой службой ClusterIP
.
Давайте кратко рассмотрим как этого добиться. Это очень хорошо объяснено в этом разделе официальных документов kubernetes:
Службы, чаще всего абстрактные для доступа к бобам Kubernetes, но они также могут абстрагировать другие типы бэкэндов. Например:
- Вы хотите иметь кластер внешней базы данных в рабочем состоянии, но в своей тестовой среде вы используете свои собственные базы данных.
- Вы хотите, чтобы ваша служба указывала на службу в другое пространство имен или другой кластер.
- Вы переносите рабочую нагрузку в Kubernetes. Оценивая подход, вы запускаете только часть своих бэкэндов в Kubernetes.
В любом из этих сценариев ios вы можете определить Сервис без селектора Pod. Например:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
Поскольку эта служба не имеет селектора, соответствующий объект конечной точки не создается автоматически. Вы можете вручную сопоставить Службу с сетевым адресом и портом, где она работает, добавив объект Endpoint вручную:
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: 192.0.2.42
ports:
- port: 9376
Если между упомянутыми dev существует только сетевое подключение и промежуточные среды, в которых вы можете использовать Services без селекторов . Если вам нужен кластер Minikube для подключения к чему-либо, выставленному на 192.0.2.42:9376
с помощью вашего промежуточного кластера, вам просто нужно использовать этот IP в ваших Конечных точках определение объекта. Служба определена для прослушивания по порту 80
, поэтому она будет в конечном итоге предоставлена вам Minikube Pods
через этот стандартный порт.
Самое большое преимущество такого решения заключается в том, что такое Service
делает указанный c внешний ресурс внутренне доступным для приложений, работающих в Pods
в локальном k8s кластере , и они могут ссылаться на него, используя его DNS-имя , т.е. service-name
в пределах тот же namespace
или по полному доменному имени <my-service-name>.<namespace>.svc.cluster.local
из любого namespace
, для всего кластера.
Если ваш внешний ресурс доступен под доменным именем , вы может также рассмотреть возможность использования ExternalName , который является специальным типом службы без селектора , и в этом случае вам не нужно настраивать вручную любые объекты Endpoints
. Его определение может выглядеть так:
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com