当前位置: 首页 > 知识库问答 >
问题:

apollo网关(联邦)无法连接到kubernetes环境中的服务

宦兴朝
2023-03-14

我有使用graphql的经验,但这是我第一次尝试apollo federation和Kubernetes。

我首先尝试使用apollo Federation将整体graphql服务器拆分为微服务。它工作得很好(下面是工作代码)。现在我试图在kubernetes集群中运行这些微服务,但是apollo网关和其他后端服务之间的网络问题不断。

从apollo网关服务器(当我尝试在kubernetes上运行它时),我得到以下错误:

在auth-cluster-ip-service加载身份验证时遇到错误:仅支持绝对URL

这是将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。但是根据我所学到的知识,kubernetes master将获取这个“URL”(集群IP名称),并替换为相应POD的IP地址。所以应该没问题。

当我练习库伯内特时效果很好。在我的实践中,我通过集群IP名称连接到redis和postgres Pod。

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

示例服务群集-IP配置文件

apiVersion: v1
kind: Service
metadata:
  name: service1-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: service1
  ports:
    - port: 3051
      targetPort: 3051

服务部署配置文件示例

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个答案

艾奕
2023-03-14

当错误消息显示“仅支持绝对URL”时,这意味着配置的URL需要包括http://方案部分以及主机名。您可以通过更改环境设置来修复此问题

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

如果服务监听的不是默认HTTP端口80,您还需要在URL中包含该端口号。

 类似资料:
  • 我跟踪了服务,当它们部署在localhost中(通过eclipse)时,它们工作得很好。但在部署为单独的docker容器时无法调用rest服务。 我是一个新的docker并且参加了教程来了解这是如何工作的。 祖尔阿皮门路 用户服务 尤里卡注册服务信息 注意:“DE4396A354EA”是“用户服务”的容器id 请提供关于如何解决此问题的指导,并提供任何链接,我可以在这些链接中获得关于在docker

  • 我对kubernetes相当陌生,我正试图在MacBook上使用minikube来编排我的rails应用程序。我的应用程序包括MySQL、Redis和Sidekiq。我在独立的豆荚里运行webapp、sidekiq、redis和数据库。Sidekiq吊舱没有连接到redis吊舱。 sidekiq吊舱的库贝特尔日志是这样说的: 我的webapp.yaml webapp-service.yaml Si

  • 我想连接一个从mqtt设备接收数据的外部网关到我的AWS物联网核心。 在这张图片中,您可以找到(或多或少)该项目的概述。 项目详情 总而言之,我想将上一张图片的物联网网关连接到AWS物联网核心。 我看过很多类似主题的例子,但在其中没有一个能找到我想做的事情。 只有知道我的AWS云帐户的主机名/endpoint并将其放在我的getaway中以向该主机发送数据,才能做到这一点吗? 如何找到我的AWS主

  • 我创建了一个副本zookeeper+kafka集群,使用来自官方孵化器repo的官方kafka图表: 如果我进入动物园管理员舱: 我使用工具测试TCP连通性。我预计会出现通信错误,因为服务器没有使用HTTP,但是如果curl连都不能连接,我不得不用ctrl-C输出,那么TCP连接就不能工作了。 我可以通过访问本地pod: 但是通过服务名连接到Kafka pod不起作用,我必须ctrl-C curl

  • 我试图建立一个Flask应用程序,有Kafka作为一个界面。我使用了一个Python连接器,kafka-python和一个用于Kafka的Docker图像,Spotify/KafkaProxy。 下面是docker-compose文件。 我能够从烧瓶容器运行,并从Kafka容器获取数据包。 当我在本地运行Flask应用程序时,试图通过设置连接到Kafka容器,它可以正常工作。

  • 是什么导致了这个错误,我如何修复它?