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