шлюз 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-адрес.

Другие вопросы по тегам