Как общаться между модулями в сервисе? - PullRequest
0 голосов
/ 24 июня 2018

Предположим, у меня есть сервис, содержащий два пакета. Один из модулей - это HTTP-сервер, а другому необходимо подключить конечную точку REST на этом модуле. Есть ли имя хоста, которое второй модуль может использовать для адресации первого модуля?

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

Обратите внимание, что service - это другое понятие в Docker, чем в K8s. Самый простой способ получить то, что вы хотите, это создать две капсулы; скажем pod-1 и pod-2, с файлом yaml, похожим на этот:

apiVersion: v1
kind: Pod
metadata:
  name: NAME
  labels:
    app: LABEL
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

Скажите, что NAME и LABEL - это nginx и nginx-1, так что теперь у вас есть два модуля с именами nginx и nginx-1 с метками app: nginx и app: nginx-1. На самом деле, поскольку только один из них будет выставлен, другой ярлык не имеет значения.

Теперь вы можете открыть модуль либо с помощью файла yaml, либо из командной строки.

Файл Yaml:

apiVersion: v1
kind: Service
metadata:
  name: server
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: nginx

Командная строка:

kubectl expose pod nginx --port 80 --name server

Если вы теперь обращаетесь ко второму модулю (nginx-1) и curl напрямую к сервису, вы в конечном итоге нажмете на модуль за ним (nginx):

nerus:~/workspace $ kubectl exec -it nginx-1 bash 
root@nginx-1:/# curl -I server 
HTTP/1.1 200 OK
0 голосов
/ 24 июня 2018

Вы можете выставить свой модуль kubectl выставить развертывание --type = имя модуля , затем вы можете использовать описание kubectl Он покажет вам порт номер , Затем вы получаете доступ к вашему модулю http://localhost:portnumber в последней команде .... ** ..... Надеюсь, это поможет.

0 голосов
/ 24 июня 2018

По иронии судьбы, вы ответили на свой вопрос: Service - это стабильное имя и IP-адрес, которые абстрагируются от отдельных приходов и уходов Pod s, на которые он будет направлять трафик, как очень хорошо описано в прекрасное руководство .

Если the-http-pod необходимо достичь the-rest-pod, тогда создайте Service, который соответствует меткам на PodSpec, который создал the-rest-pod, и с этого момента the-http-pod всегда может использовать ${serviceName}.${serviceNamespace}.svc.cluster.local для каждый любой Pod, имеющий соответствующие метки

0 голосов
/ 24 июня 2018

Я предполагаю, что когда вы говорите «сервис», вы не имеете в виду лексикон Kubernetes для объекта Service, иначе ваши два модуля в Service будут идентичны, поэтому давайте начнем с того, что«Служба» означает в земле Kubernetes.

Вам потребуется создать дополнительный объект Kubernetes с именем Service, чтобы получить имя вашего хоста для сервера HTTP * Pod.Когда вы создаете Service, вы определяете .spec.selector, который указывает на набор меток в модуле службы HTTP.Для примера, скажем, метка app: nginx.Имя этого Service объекта станет внутренней DNS-записью, которая может быть запрошена вторым Pod.

Упрощенный пример:

apiVersion: v1
kind: Pod
metadata:
  name: http-service
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
  name: my-http-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

Теперь ваш второй Podможет отправлять запросы в службу HTTP по имени Service, my-http-service.

Стоит также упомянуть, что лучшие практики Kubernetes требуют, чтобы этими Pod управляли такие контроллеры, как Deployment s или ReplicaSet s по разным причинам,включая высокую доступность ваших приложений.

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