У меня есть опыт работы с graphql, но я впервые пробовал федерацию apollo и kubernetes.
Сначала я попытался разделить свой монолитный сервер graphql на микро-сервисы, используя федерацию apollo. Он работал нормально (ниже рабочий код). Теперь я пытаюсь запустить эти микро-сервисы в кластере kubernetes, но продолжаю иметь проблемы с сетью между шлюзом apollo и другими бэкэнд-сервисами.
С сервера шлюза apollo (когда я пытаюсь запустить его на kubernetes), я получить эту ошибку:
Encountered error when loading auth at auth-cluster-ip-service: Only absolute URLs are supported
Это часть, где I-сервисы добавляются к шлюзу apollo:
const gateway = new ApolloGateway({
serviceList: [
{ name: 'service1', url: process.env.SERVICE1_URL },
{ name: 'service2', url: process.env.SERVICE2_URL },
{ name: 'service3', url: process.env.SERVICE3_URL },
],
buildService({ name, url }) {
return new AuthenticatedDataSource({ name, url });
}
});
Сначала я попробовал в следующей среде переменные
(.env)
SERVICE1_URL =http://localhost:3051
SERVICE2_URL =http://localhost:3052
SERVICE3_URL =http://localhost:3053
Я просто запустил 4 приложения узла на локальном хосте на своем ноутбуке, и это работает!
Теперь часть kubernetes.
Ниже приведен файл конфигурации развертывания для apollo -gateway. Я подозреваю, что проблема заключается в переменных среды. Как видите, вместо url
у меня есть service name
в соответствующих значениях переменных среды. Но из того, что я узнал, мастер kubernetes извлечет этот «url» (имя clusterIP) и заменит IP-адрес соответствующих модулей. Так должно быть хорошо.
Это хорошо работало, когда я практиковал kubernetes. В своей практике я подключался к redis и postgres pods через имя clusterIP.
файл конфигурации apollo-gateway deploymant
apiVersion: apps/v1
kind: Deployment
metadata:
name: gateway-deployment
spec:
replicas: 1
selector:
matchLabels:
component: gateway
template:
metadata:
labels:
component: gateway
spec:
containers:
- name: gateway
image:<docker-id>/gateway
ports:
- containerPort: 4000
env:
- name: ACCESS_TOKEN_SECRET
value: fas69dO2Z15nkev6157
- name: SERVICE1_URL
value: service1-cluster-ip-service
- name: SERVICE2_URL
value: service1-cluster-ip-service
- name: SERVICE3_URL
value: service1-cluster-ip-service
пример файла конфигурации SERVICE cluster-ip
apiVersion: v1
kind: Service
metadata:
name: service1-cluster-ip-service
spec:
type: ClusterIP
selector:
component: service1
ports:
- port: 3051
targetPort: 3051
пример конфигурационного файла развертывания SERVICE
apiVersion: apps/v1
kind: Deployment
metadata:
name: service1-deployment
spec:
replicas: 1
selector:
matchLabels:
component: service1
template:
metadata:
labels:
component: service1
spec:
containers:
- name: auth
image:<docker-id>/service1
ports:
- containerPort: 3051