如何让快速网关在 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 中工作?的主要内容,如果未能解决你的问题,请参考以下文章