шлюз apollo (федерация) не может подключиться к службам в среде kubernetes
У меня есть опыт работы с graphql, но я впервые пробую apollo federation и 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 приложения узла на локальном хосте на моем ноутбуке, и он работает!
Теперь кубернеты расстаются.
Ниже приведен файл конфигурации развертывания для apollo-gateway. Я подозреваю, что проблема заключается в переменных среды. Как видите, вместоurl
, У меня есть service name
на значениях соответствующих переменных среды. Но из того, что я узнал, мастер кубернетов получит этот "url"(IP-имя кластера) и заменит его IP-адресом соответствующих подов. Так что все должно быть хорошо.
Это хорошо сработало, когда я практиковал кубернете. В своей практике я подключался к модулям redis и postgres через имя clusterIP.
Файл конфигурации развертывания apollo-gateway
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
1 ответ
Когда в сообщении об ошибке говорится, что "поддерживаются только абсолютные URL-адреса", это означает, что настроенный URL-адрес должен включать http://
часть схемы, а также имя хоста. Вы можете исправить это, изменив настройки среды, включив в них
- name: SERVICE1_URL
value: 'http://service1-cluster-ip-service'
Если Служба прослушивает что-то, кроме HTTP-порта 80 по умолчанию, вам также необходимо включить этот номер порта в URL-адрес.