Как сделать так, чтобы одна служба kubernetes общалась с другой службой kubernetes? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть два сервиса (клиент и сервер) обоих типов балансировщика нагрузки. Я хотел бы, чтобы клиентский сервис общался с серверным сервисом. Как это сделать программно (через файл yaml и т. Д.).

Более явно клиент запускает код Python, в котором ему нужен доступ к внешнему IP-адресу сервера. Однако я знаю только имя службы сервера, а не внешний ip.

Конечно, один из способов решения этой проблемы - сначала запустить сервер, получить внешний ip и добавить его в файл yaml клиента. Я ищу решение, как доступ к внешнему IP, просто зная имя службы.

Клиент и сервер находятся в одном кластере kubernetes.

Client.yaml Клиент запускает веб-сервер и, если кто-то нажимает URL, объявленный веб-сервером demo.py, следует позвонить в службу сервера. Я думал о способе получить сервер external-ip программно здесь, однако я открыт для предложений.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name:client-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: client
    spec:
      containers:
      - name: client-container
        image: client_image:latest
        command:
          - "python"
          - "/root/demo.py"
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: client-service
  name: client-service
spec:
  ports:
  - port: 5000
    targetPort: 5000
  selector:
    app: inception-client
  type: LoadBalancer

Server.yaml : он предоставляет службу на порту 9000, которую клиент должен вызвать.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: server-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: server
    spec:
      containers:
      - name: server-container
        image: server_image:latest
        command:
        - <Command to start a server which listens on port 9000>
        ports:
        - containerPort: 9000
---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: server-service
  name: server-service
spec:
  ports:
  - port: 9000
    targetPort: 9000
  selector:
    app: server
  type: LoadBalancer

Ответы [ 2 ]

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

Поскольку вы не указали, где находятся серверы, давайте рассмотрим оба случая.

Случай 1: службы находятся в одном кластере

Использовать имя службы вместо IP-адреса хоста. kube-proxy преобразует имя службы в IP-адрес (внутренний).

Случай 2. Службы не находятся в одном кластере.

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

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

Клиенту нужно знать только имя службы kubernetes, связанной с сервером. Kubernetes будет обрабатывать маршрутизацию к нужному модулю сервера. Указание балансировщика нагрузки также неявно создает кластеризатор. Какое клиентское приложение Python может использовать.

Вы можете предоставить в своем клиентском коде тест готовности, который проверяет, работает ли сервер, таким образом, вы можете быть уверены, что когда сервер будет готов, клиент также может начать принимать запросы.

...