Адрес гитхаба:GitHub.com/Qingpressfan/От…
Как правило, на предприятии существует много микросервисов.В процессе постепенной контейнеризации некоторые сервисы будут находиться вне кластера и не будут контейнеризированы, например базы данных, в то время как некоторые сервисы, которые были контейнеризированы и зависят от этих сервисов, будут находиться в процессе перехода. process. , который требует, чтобы контейнеры внутри кластера обращались к службам за пределами кластера.
Чтобы служба не прерывалась в процессе контейнеризации, необходимо разрешить контейнерам внутри кластера Kubernetes доступ к службам вне кластера.Как это сделать?Используете ли вы внешний IP или внешнее имя rds в файле конфигурации каждого приложения? Таким образом, после контейнеризации внешнего приложения необходимо изменить файл конфигурации приложения, которое ранее зависело от приложения, и переупаковать контейнер, что, очевидно, не является хорошим решением. Наша привлекательность заключается в том, что в процессе контейнеризации всех приложений все приложения могут быть легко интегрированы,ExternalName
Оба типа Service и EndPoint могут соответствовать нашим требованиям, давайте рассмотрим их отдельно.
Служба типа ExternalName
В среде Docker, поскольку Docker Engine поставляется с DNS-сервером, мы используем容器名
Для доступа к другим контейнерам, потому что контейнер нестабилен, когда контейнер выйдет из строя и перезапустит контейнер с тем же образом, IP-адрес изменится, поэтому мы не используем IP для доступа к другим контейнерам; аналогично, в кластере Kubernetes, поскольку мы используемkube-DNS
, мы часто используем имя службы для доступа к службе, а объект ресурса службы может гарантировать, что копия контейнера за ним всегда является последним IP-адресом.
Поэтому мы можем использовать эту функцию для сопоставления имени службы и адреса внешней службы, чтобы доступ к имени службы был таким же, как доступ к внешней службе. Например, следующий пример будетsvc1
иxxx.xxx.xxx.xxx
установил отношение эквивалентности.
kind: Service
apiVersion: v1
metadata:
name: svc1
namespace: default
spec:
type: ExternalName
externalName: somedomain.org
Установить конечную точку для службы
В кластере Kubernetes разные копии одной и той же микрослужбы будут предоставлять единое имя службы внутри кластера или за его пределами (в зависимости от типа службы, доступной для внешнего мира).EndPoint
,EndPoint
Решите проблему сопоставления с контейнером, вEndPoint
Вы можете указать не только IP контейнера в кластере, но и IP вне кластера, мы можем использовать эту возможность для использования сервисов вне кластера.
EndPoint
Недостатком этого метода является то, что вы можете указать только IP и не можете использовать URL-адреса, такие как URL-адреса, такие как RDS-адреса.В этом случае вы можете использовать толькоExternalName
решать.
apiVersion: v1
kind: Service
metadata:
name: mysql-production
spec:
ports:
- port: 3306
---
kind: Endpoints
apiVersion: v1
metadata:
name: mysql-production
namespace: default
subsets:
- addresses:
- ip: 192.168.1.25
ports:
- port: 3306
Суммировать
В этой статье представлены два метода доступа к внешним службам внутри кластера.ExternalName
тип службы подходит для того, как внешние службы используют доменные имена, недостатком является невозможность указания порта;EndPoint
Метод подходит для случая, когда внешний сервис является IP, но можно указать порт. Используйте его по мере необходимости!