Как заставить несколько стручков общаться друг с другом на kubernetes - PullRequest
0 голосов
/ 11 ноября 2019

Я новичок в Kubernetes и пытаюсь развернуть приложение для Kubernetes через microk8s. Приложение содержит бэкэнд Python-флаконов, угловой интерфейс, базу данных Redis и MySQL. Я развернул изображения в нескольких модулях, и статус показывает «работает», но блоки не взаимодействуют друг с другом.

Затем приложение полностью докеризуется и функционирует на уровне докера. Перед развертыванием в kubernetes мой флеш-хост был 0.0.0.0, а mysql host был «service name» в docker-compose.yaml, но в настоящее время я заменил его на сервисные имена yu-файла kubernetes.

Кроме того, в угловом интерфейсеЯ изменил URL для подключения к резервной копии как http://localhost:5000 на http://backend -service , где backend-service - это имя (dns), указанное в файле backend-service.yml. Но это также не внесло никаких изменений. Может кто-нибудь сказать мне, как я могу заставить эти модули взаимодействовать?

Я могу получить доступ только к внешнему интерфейсу после того, как развертывание rest не подключено.

Вывод списка файлов службы и развертывания angular, backend.

 apiVersion: v1
 kind: Service
 metadata:
   name: angular-service
 spec:
   type: NodePort
   selector:
     name: angular
   ports:
     - protocol: TCP
       nodePort: 30042
       targetPort: 4200
       port: 4200

 apiVersion: v1
 kind: Service
 metadata:
   name: backend-service
 spec:
   type: ClusterIP
   selector:
     name: backend
   ports:
     - protocol: TCP
       targetPort: 5000
       port: 5000

Заранее спасибо!

( Модифицированные сервисные файлы )

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Для внутренней связи между различными микроуслугами в Kubernetes следует использовать Service типа ClusterIP . На самом деле это тип по умолчанию , поэтому, даже если вы не укажете его в файле определения Service yaml, Kubernetes предполагает, что вы хотите создать ClusterIP. Он создает виртуальный внутренний IP-адрес (доступный в вашем кластере Kubernetes) и предоставляет ваш кластерный компонент (микросервис) в качестве единой точки входа , даже если он поддерживается многими модулями.

Предположим, у вас есть внешнее приложение, которое должно взаимодействовать с внутренним компонентом, которое запускается в 3 разных модулях. Служба ClusterIP обеспечивает единую точку входа и управляет балансировкой нагрузки между различными модулями, равномерно распределяя запросы между ними.

Вы можете получить доступ к службе ClusterIP, указав ее IP-адрес и порт, доступный для компонента приложения. на. Обратите внимание, что вы можете определить другой порт (называемый port в Service определении) для Service для прослушивания, отличный от фактического порта, используемого вашим приложением (обозначается как targetPort в вашем Service определении). Хотя к Service можно получить доступ по его адресу ClusterIP, все компоненты, которые взаимодействуют с модулями, внутренне выставленными им , должны использовать его DNS-имя . Это просто имя Service, которое вы создали, если все компоненты приложения размещены в одном пространстве имен. Если некоторые компоненты находятся в разных пространствах имен, вам необходимо использовать полное доменное имя, чтобы они могли обмениваться данными между пространствами имен.

Ваши Service файлы определений могут выглядеть следующим образом:

apiVersion: v1
kind: Service
metadata:
  name: angular-service
spec:
  type: ClusterIP ### may be ommited as it is a default type
  selector:
    name: angular ### should match your labels defined for your angular pods
  ports:
  - protocol: TCP
    targetPort: 4200 ### port your angular app listens on
    port: 4200 ### port on which you want to expose it within your cluster

apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  type: ClusterIP ### may be ommited as it is a default type
  selector:
    name: backend ### should match your labels defined for your backend pods
  ports:
  - protocol: TCP
    targetPort: 5000 ### port your backend app listens on
    port: 5000 ### port on which you want to expose it within your cluster

Вы можете найти подробное описание этой темы в официальной Kubernetes документации .


NodePort имеет совершенно другую функцию. Это может быть использовано, например, чтобы выставить ваше внешнее приложение на определенный порт на IP вашего узла. Обратите внимание, что если у вас есть кластер Kubernetes, состоящий из множества узлов, и ваши внешние модули размещены на разных узлах, для доступа к вашему приложению вам нужно использовать 3 разных IP-адреса. В таком случае вам нужен дополнительный балансировщик нагрузки. Если вы используете какое-то облачное платформенное решение и хотите открыть интерфейсную часть своего приложения для внешнего мира, лучше использовать сервисный тип LoadBalancer (вместо использования NodePort).

0 голосов
/ 11 ноября 2019

Вы можете реализовать правило входа для этого следующим образом -

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    kubernetes.io/ingress.class: nginx
  name: ingress-rule
spec:
  rules:
  - host: test.example.io
    http:
      paths:
      - path: /(.*)
        backend:
          serviceName: angular-service
          servicePort: port-number
      - path: /api/(.*)
        backend: 
          serviceName: backend-service
          servicePort: port-number

В своем приложении переднего плана вы можете добавить URL-адрес службы бэкэнда как

host/api/{your_uri}

Это поможет вам. Хост представляет DNS, упомянутый в файле правил входа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...