我正在尝试通过Kubernetes部署ReactJs应用程序和Express-GraphQL服务器。但是我在设置入口以将流量路由到两个服务时遇到麻烦。具体来说,我无法再到达后端。
当我将React前端和Express后端作为单独的服务并公开它们时,它运行良好。但是现在我正在尝试启用HTTPS和DNS。并通过Ingress路由到他们两个人。
这是我的服务Yaml文件
apiVersion: v1
kind: Service
metadata:
name: bpmclient
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
run: bpmclient
type: NodePort
apiVersion: v1
kind: Service
metadata:
name: bpmserver
namespace: default
spec:
ports:
- port: 3090
protocol: TCP
targetPort: 3090
selector:
run: bpmserver
type: NodePort
和我的入口...
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: bpm-nginx
annotations:
kubernetes.io/ingress.global-static-ip-name: bpm-ip
networking.gke.io/managed-certificates: bpmclient-cert
ingress.kubernetes.io/enable-cors: "true"
ingress.kubernetes.io/cors-allow-origin: "https://example.com"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /v2/*
backend:
serviceName: bpmserver
servicePort: 3090
- path: /*
backend:
serviceName: bpmclient
servicePort: 80
通过此设置,我已经能够使用https成功访问客户端。但是我再也无法通过客户端或浏览到后端了。我收到502服务器错误。但是我检查了后端Pod的日志,除了404日志之外什么都看不到。
我的前端通过example.com/v2/graphql到达后端。当我在计算机上本地运行它时,我转到localhost:3090 / graphql。因此,如果路由正确完成,我看不到为什么得到404。
答案 0 :(得分:1)
我在这里看到了几处可能出错的东西:
入口对象应在与其路由的服务相同的名称空间中创建。我看到您在服务的Yaml中指定了namespace: default
,但在Ingress中没有指定。
我不知道您使用的是哪个Ingress版本,但在0.22.0之后符合documentation
使用注释的入口定义 nginx.ingress.kubernetes.io/rewrite-target不向后 与以前的版本兼容。在0.22.0及更高版本中,任何 请求URI中需要传递给 重新编写的路径必须在捕获组中明确定义。
path:
应该嵌套在backend:
之后,捕获组应该添加到nginx.ingress.kubernetes.io/rewrite-target: /
中的数字占位符中,例如$1
所以您应该尝试这样的事情:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: bpm-nginx
namespace: default
annotations:
kubernetes.io/ingress.global-static-ip-name: bpm-ip
networking.gke.io/managed-certificates: bpmclient-cert
ingress.kubernetes.io/enable-cors: "true"
ingress.kubernetes.io/cors-allow-origin: "https://example.com"
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: bpmserver
servicePort: 3090
path: /v2/?(.*)
- backend:
serviceName: bpmclient
servicePort: 80
path: /?(.*)
请告诉我是否有帮助。