Как сделать так, чтобы один сервис 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 сервера.