Kubernetes — внутрикластерные контейнеры, получающие доступ к внекластерным службам

задняя часть Микросервисы контейнер Docker

Адрес гитхаба: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, но можно указать порт. Используйте его по мере необходимости!