Я хотел бы создать клиент/серверный фреймворк в Kubernetes, чтобы каждый клиент мог обрабатывать часть задачи, а сервер нечасто использовать для синхронизации. Я использую Python для создания своего сервера и клиентов с FastAPI для сервера.
В качестве очень маленького примера сервер выглядит так. из fastapi импортировать FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
со следующим файлом докеров
FROM python
COPY server.py /
COPY requirements.txt /
RUN pip install -r requirements.txt
CMD [ "fastapi", "run", "server.py", "--port", "8000"]
Клиент выглядит так.
import requests
try:
f = requests.get("http://0.0.0.0:8000")
print(f.text)
except Exception as e:
print(e)
exit(5)
Со следующим файлом докеров:
FROM python
COPY client.py /
COPY requirements.txt /
RUN pip install -r requirements.txt
CMD [ "python", "client.py" ]
и yaml kubernetes выглядит так
apiVersion: v1
kind: Deployment
metadata:
name: server
spec:
selector:
matchLabels:
app: server
replicas: 1
template:
metadata:
labels:
app: server
spec:
containers:
- name: server
image: server
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Deployment
metadata:
name: client
spec:
selector:
matchLabels:
app: client
replicas: 1
template:
metadata:
labels:
app: client
spec:
containers:
- name: client
image: client
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
После создания контейнеров (docker build -t ...
), их загрузки (kind load docker-image ...
) и применения yaml (kubectl apply -f app.yaml
) я могу просмотреть журналы и увидеть, что сервер работает, но клиент получает ошибку connection refused
.
Я предполагаю, что мне нужно использовать что-то, чтобы открыть порты помимо того, что я уже сделал, но я не могу понять, что именно.
🤔 А знаете ли вы, что...
Python активно используется в научных и инженерных вычислениях.
Как упоминалось в комментариях @MO, вам необходимо использовать DNS-имя службы вместо IP-адреса в вашей настройке. Поэтому измените IP http://0.0.0.0 с именем службы на что-то вроде http://<my-svc>.<my-namespace>
.
В kubernetes вам необходимо использовать службу для предоставления пода внутри кластера. Сервисы K8s действуют как уровень абстракции, который позволяет структурированно получать доступ к модулям в кластере. Поэтому вам необходимо создать службу для предоставления доступа к модулю (серверу) и предоставить стабильное DNS-имя, которое может использовать клиент. После завершения создания службы вы можете обновить имя DNS в сценарии и заставить клиента использовать этот DNS для доступа к серверу (модулю).
Вы можете определить службу следующим образом:
apiVersion: v1
kind: Service
metadata:
name: server-service
spec:
selector:
app: server
ports:
- protocol: TCP
port: 80
targetPort: 8000
Используйте эту службу в клиентском скрипте примерно так
import requests
try:
f = requests.get("http://server-service")
print(f.text)
except Exception as e:
print(e)
exit(5)
Это поможет клиенту реже обращаться к серверу для синхронизации.