шлюз apollo (федерация) не может подключиться к сервисам в среде kubernetes - PullRequest
0 голосов
/ 27 марта 2020

У меня есть опыт работы с 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

1 Ответ

2 голосов
/ 02 апреля 2020

Когда в сообщении об ошибке говорится, что «поддерживаются только абсолютные URL-адреса», это означает, что настроенный URL-адрес должен включать часть схемы http://, а также имя хоста. Вы можете исправить это, изменив настройки своей среды, добавив

- name: SERVICE1_URL
  value: 'http://service1-cluster-ip-service'

Если служба прослушивает что-то, отличное от стандартного HTTP-порта 80, вам также необходимо включить этот номер порта в URL.

...