Как сделать так, чтобы одна служба Kubernetes взаимодействовала с другой службой Kubernetes?

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

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

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

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

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

person rgaut    schedule 12.11.2018    source источник
comment
Должна ли ваша «серверная» служба быть доступной откуда угодно, кроме «клиентской», или ваша «серверная» служба обращается к кому-либо еще, кроме вашей «клиентской» службы?   -  person Sumit Murari    schedule 13.11.2018
comment
Доступ к сервису сервера также получают другие пользователи, например, через интерфейс командной строки и т. Д.   -  person rgaut    schedule 13.11.2018
comment
Я хотел спросить, используется ли эта `` серверная '' служба также вне кластера, потому что в противном случае нам не нужен балансировщик нагрузки типа службы для нее, и мы можем напрямую получить к нему доступ через имя службы, как упоминалось другими в ответы.   -  person Sumit Murari    schedule 13.11.2018
comment
да, на самом деле доступ к серверу осуществляется и за пределами кластера. но допустим, что сервер относится к типу ClusterIP. Как мы можем получить к нему доступ, просто передав, например, ClusterIP: 9000, чтобы получить доступ к сервису сервера?   -  person rgaut    schedule 14.11.2018
comment
Да, вы можете напрямую использовать ClusterIP: 9000 или имя-службы: 9000 из службы «клиент». если обе службы находятся в разном пространстве имен, тогда "service-name.namespace: 9000"   -  person Sumit Murari    schedule 14.11.2018
comment
Даже если тип службы - 'NodePort' или 'Loadbalancer', ^ комментарий, то есть 'server-service: 9000', также будет работать   -  person Sumit Murari    schedule 14.11.2018


Ответы (2)


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

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

person Bal Chua    schedule 12.11.2018
comment
Настройка livenessProbe и readinessProbe хорошо документирована в кубернетах kubernetes .io / docs / tasks / configure-pod-container /. Как ваше приложение будет внутри них, действительно зависит от вас. - person Bal Chua; 13.11.2018

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

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

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

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

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

person Rushil Basappa    schedule 12.11.2018