Я создаю веб-приложение, которое включает React внешний интерфейс и node.js (express) сервер, Интерфейс выполняет внутренний вызов API для сервера express, а сервер express затем выполняет внешний вызов API для сбора некоторых данных. Интерфейс и сервер находятся в разных контейнерах в одном и том же модуле Kubernetes.
Сервис внешнего интерфейса представляет собой nginx:1.14.0-alpine
образ. Файлы stati c создаются (npm build
) в конвейере CI, а каталог build
копируется в образ во время docker build
. package.json
содержит прокси-ключ "proxy": "http://localhost:8080"
, который направляет трафик c из приложения в localhost:8080
- это порт, который сервер express прослушивает для внутреннего вызова API. Я думаю, что клавиша proxy
не будет иметь никакого отношения после того, как файлы будут упакованы в stati c файлы и переданы в nginx
образ?
При локальном запуске, то есть при запуске npm start
вместо npm build
, это все работает. Сервер express принимает запросы API, отправленные внешним интерфейсом через порт 8080
.
Сервер express - это простая служба, которая добавляет аутентификацию к вызову API, который интерфейс делает, вот и все. Но аутентификация опирается на секреты как переменные среды, что делает их несовместимыми с React. Сервер запускается с помощью команды node server.js
; локально серверная служба успешно прослушивает (app.listen(8080)
) вызовы API от внешнего интерфейса React, добавляет некоторую аутентификацию к запросу, затем делает запрос к внешнему API и передает ответ обратно во внешний интерфейс после его получения.
На производстве, в стручке Кубернетеса, все не так просто. Трафи c из React-интерфейса , проксирующего через сервер узла , теперь должен обрабатываться kubernetes, и я не смог понять это.
Может быть важно отметить, что нет никаких обстоятельств, при которых интерфейс будет напрямую выполнять любые внешние вызовы API, все они будут go через сервер .
React frontend Dockerfile
FROM nginx:1.14.0-alpine
# Copy static files
COPY client/build/ /usr/share/nginx/html/
# The rest has been redacted for brevity but is just copying of favicons etc.
Express Node Server
FROM node:10.16.2-alpine
# Create app directory
WORKDIR /app
# Install app dependencies
COPY server/package*.json .
RUN npm install
EXPOSE 8080
CMD [ "node", "server.js" ]
Kubernetes Manifest
- Отредактировано для краткости
apiVersion: apps/v1beta1
kind: Deployment
containers:
- name: frontend
image: frontend-image:1.0.0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- mountPath: /etc/nginx/conf.d/default.conf
name: config-dir
subPath: my-config.conf
- name: server
image: server-image:1.0.0
imagePullPolicy: IfNotPresent
volumes:
- name: config-tmpl
configMap:
name: app-config
defaultMode: 0744
- name: my-config-directory
emptyDir: {}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: my-namespace
data:
my-conf.conf: |-
server {
listen 80;
server_name _;
location api/ {
proxy_pass http://127.0.0.1:8080/;
}
.....