Как сделать так, чтобы один сервис kubernetes общался с другим сервисом kubernetes?

У меня есть две службы (клиент и сервер) обоих типов балансировки нагрузки. Я хотел бы, чтобы клиентский сервис общался с серверным сервисом. Как это сделать программно (через файл 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 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам