【问题标题】:apollo gateway (federation) fails to connect to services in kubernetes environmentapollo 网关(联邦)无法连接到 kubernetes 环境中的服务
【发布时间】:2020-07-08 00:30:18
【问题描述】:

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

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

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

Encountered error when loading auth at auth-cluster-ip-service: Only absolute URLs are supported

这是我服务添加到 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

我只是在笔记本电脑上的 localhost 上运行了 4 个节点应用程序,它就可以工作了!

现在是 Kubernetes 部分。

下面是 apollo-gateway 的部署配置文件。我怀疑问题出在环境变量中。如您所见,我在相应的环境变量值上有service name,而不是url。但据我所知,kubernetes master 会获取这个“url”(clusterIP 名称)并替换为相应 pod 的 IP 地址。所以应该没问题。

我在练习 Kubernetes 时效果很好。在我的实践中,我通过 clusterIP 名称连接到 redis 和 postgres pod。

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

【问题讨论】:

  • 错误信息提示您需要使用完整的工作 URL; http://service1-cluster-ip-service:3051.
  • 我试过了,还是报错:Encountered error when loading auth at http://service1-cluster-ip-service:3051: request to http://service1-cluster-ip-service:3051/ failed, reason: connect ECONNREFUSED 10.107.81.47:3051
  • @DavidMaze wow.. 这确实有效.. 我很傻。这是一个完全不同的问题。基本上我需要在启动 api 网关之前运行其他服务。目前,我暂时添加了setTimeout 来解决这个问题。谢谢!
  • @SihoonKim 从 kubernetes 的角度来看,您的服务和部署似乎还可以,您有什么方法可以测试该令牌是否正确?您可以尝试 kubectl run -it --rm ubuntu --generator=run-pod/v1 --image=ubuntu -- /bin/bash 运行 ubuntu pod 并从发出 apt update &amp;&amp; apt install curl -y 的 pod 内部手动测试您的连接,并尝试使用您的授权令牌将您的请求 curl 发送到 http://service1-cluster-ip-service:3051。让我知道您是否可以手动连接到该服务。
  • @DavidMaze 指出了问题所在,通过对 apollo 网关服务器进行调整,它就可以工作了!

标签: docker kubernetes apollo apollo-federation


【解决方案1】:

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

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

如果服务正在侦听默认 HTTP 端口 80 以外的其他内容,您还需要在 URL 中包含该端口号。

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 2015-02-22
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    相关资源
    最近更新 更多