0

我正在构建一个微服务应用程序,在其中我使用 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 快递应用程序)

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

入口-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

快递网关:Dockerfile

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

1 回答 1

1

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

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

使用服务名称作为主机:

serviceEndpoints:
  authsrv:
    url: 'http://auth-srv:3000/'
于 2021-02-01T19:40:53.720 回答