如何让快速网关在 Kubernetes 中工作?

Posted

技术标签:

【中文标题】如何让快速网关在 Kubernetes 中工作?【英文标题】:How to get express-gateway working in kubernetes? 【发布时间】:2021-05-05 23:46:04 【问题描述】:

我正在构建一个微服务应用程序,我在其中使用 nginx-ingress 连接所有运行良好的服务,但现在我想添加一些高级功能,例如 jwt-authentication。我没有在每个服务中实现它,而是认为我会使用 API 网关并选择 express-gateway,因为它看起来很容易设置。我在本地测试了所有东西(没有 docker/kubernetes),一切都在不到 5 分钟的时间内按预期工作。

我的问题是我无法让网关将请求传递给实际的服务。请求到达网关。我在 Ubuntu 上使用 minikube 并在我的主机文件中添加了一个主机,这样我就不必记住 minikube IP。 通常我通过https://app.dev/api/users/signup 联系我的服务。

这是我的 gateway.config.yaml

http:
  port: 8080
apiEndpoints:
  auth:
    host: '*'
    path: '/api/users/*'
serviceEndpoints:
  authsrv:
    url: 'http://localhost:3000/'
policies:
  - basic-auth
  - cors
  - expression
  - key-auth
  - log
  - oauth2
  - proxy
  - rate-limit
pipelines:
  auth:
    apiEndpoints:
      - auth
    policies:
      - proxy:
          - action:
              serviceEndpoint: authsrv 
              changeOrigin: true

apiEnpoints 用于配置您调用的路由,而 serviceEndpoints 是网关调用的,因此是微服务的内部 IP。我认为这是我不知道实际主机是什么或网关如何获取此信息的问题。当我使用 ingress-nginx 时,我不必指定微服务的主机。因为每次启动它的权利都不同,所以我不明白我必须在这里做什么。有什么建议吗?可悲的是,快递网关没有关于如何使用 kubernetes 进行设置的文档,文档只是说它可能): 这是我的其余配置:my-service-depl.yaml(简单的 NodeJS express 应用)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: henryfoster/auth
---
apiVersion: v1
kind: Service
metadata:
  name: auth-srv
spec:
  selector:
    app: auth
  ports:
    - name: auth
      protocol: TCP
      port: 3000
      targetPort: 3000

ingress-srv.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  backend:
    serviceName: gateway
    servicePort: 8080
gateway-depl.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gateway
spec:
  selector:
    matchLabels:
      app: gateway
  replicas: 1
  template:
    metadata:
      labels:
        app: gateway
    spec:
      containers:
        - name: gateway
          image: henryfoster/gateway
          env:
            - name: LOG_LEVEL
              value: info
---
apiVersion: v1
kind: Service
metadata:
  name: gateway
spec:
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: gateway
  type: ClusterIP

express-gateway: Dockerfile

FROM expressgateway/express-gateway
COPY ./config/ /var/lib/eg/

【问题讨论】:

【参考方案1】:

现在我明白了。在 Kubernetes 内部,服务名称是其 IP 的域,因此要在 Kubernetes 内部调用服务,在这种情况下我必须使用服务名称:auth-srv。 而不是:

serviceEndpoints:
  authsrv:
    url: 'http://localhost:3000/'

使用服务名称作为主机:

serviceEndpoints:
  authsrv:
    url: 'http://auth-srv:3000/'

【讨论】:

以上是关于如何让快速网关在 Kubernetes 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Alt+Shift+Enter 在 WebStorm 中工作?

kubernetes集群中工作节点Noready故障处理

SYS_TIME 功能现在在 kubernetes 中工作

Kubernetes 中工作节点上的连接被拒绝错误

无法让查询在 Angular 中工作

如何让别名在所有 shell 中工作?