![](/img/trans.png)
[英]Cannot make GET request to service from angular pod on kubernetes cluster
[英]Cannot make HTTP requests to Ocelot Gateway service from angular pod on kubernetes cluster
我有 ASP.NET CORE 6.0 应用程序,其中 Ocelot 用作其他微服务的入口点。 现在所有系统都部署在 Kube.netes 上。 此外,我有一个带有 RESTFUL API 调用的 Angular 应用程序。 问题是我无法使用 Kube.netes 服务名称将请求从前端发送到后端。
我通过添加 LoadBalancer 服务在 Kube.netes 上测试了 Ocelot 网关。 到目前为止一切正常。 下面是Ocelot 网关 JSON 文件的代码:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "catalogapi-clusterip-srv",
"Port": 80
}
],
"AuthenticationOptions": {
"AuthenticationProviderKey": "Bearer",
"AllowScopes": []
}
],
"GlobalConfiguration": {
"BaseUrl": "http://homey-gateway-clusterip-srv:80"
}
}
网关的 Kube.netes Yaml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: homey-gateway-depl
spec:
replicas: 1
selector:
matchLabels:
app: homey-gateway
template:
metadata:
labels:
app: homey-gateway
spec:
containers:
- name: homey-gateway
image: ******
imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: homey-gateway-clusterip-srv
spec:
type: ClusterIP
selector:
app: homey-gateway
ports:
- name: homey-gateway
protocol: TCP
port: 80
targetPort: 80
我还为网关添加了一个 LoadBalancer 来测试路由是否正常工作
apiVersion: v1
kind: Service
metadata:
name: homey-gateway-loadbalancer
spec:
type: LoadBalancer
selector:
app: homey-gateway
ports:
- name: homey-gateway-port
protocol: TCP
port: 9090
targetPort: 80
显然,负载均衡器按预期运行,我可以看到路由运行良好。
现在,Angular 申请:
apiVersion: apps/v1
kind: Deployment
metadata:
name: homey-depl
spec:
replicas: 1
selector:
matchLabels:
app: homey
template:
metadata:
labels:
app: homey
spec:
containers:
- name: homey
image: *****
imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: homey-clusterip-srv
spec:
type: ClusterIP
selector:
app: homey
ports:
- name: homey
protocol: TCP
port: 80
targetPort: 80
为了在本地测试它,我添加了一个 NodePort 以确保我可以在浏览器上获取应用程序。
apiVersion: v1
kind: Service
metadata:
name: homey-srv
labels:
name: homey
spec:
type: NodePort
selector:
app: homey
ports:
- nodePort: 32391
protocol: TCP
port: 80
targetPort: 80
这也很好用。
现在我想从前端到后端进行 API HTTP 调用。 我尝试立即使用 Kube.netes 后端 clusterip 名称,例如: http://homey-gateway-clusterip-srv:80
。 但是,这不起作用并导致Failed to load resource:.net::ERR_NAME_NOT_RESOLVED
它工作的唯一方法是使用我在 LoadBalancer 中导出的端口来测试网关,因此: http://localhost:9090
。
我在 Stackoverflow 中看到了类似的问题: Cannot make GET request to service from angular pod on kube.netes cluster
因此,我为后端和前端添加了一个 Ingress.networking,如下所示Backend:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-homey-backend-srv
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
rules:
- http:
paths:
- path: /backend
pathType: Prefix
backend:
service:
name: homey-gateway-clusterip-srv
port:
number: 80
和Frontend:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-homey-frontend-srv
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- http:
paths:
- path: /frontend
pathType: Prefix
backend:
service:
name: homey-clusterip-srv
port:
number: 80
这种方法不起作用我收到HTTP Error 404.0 - Not Found
我不确定如何执行此操作或如何配置它。 请通过分享我需要遵循的步骤来帮助我,或者至少告诉我是否需要修改 Ocelot 网关文件或 Kube.netes 配置中的任何内容。 我花了很多时间在这上面没有结果。 任何帮助,将不胜感激。 谢谢!
最近几天我遇到了一个非常相似的问题。 我有一个 Blazor SPA、一个 Duende Identity Server 和一个 Ocelot API 网关,它位于我不想暴露在外部的内部服务前面。
我的具体问题是我的 Blazor SPA(前端)无法通过我的 ocelot 网关,因为网关无法连接到身份服务器。
Blazor SPA ---> Ingress Proxy at ( https://ocelot-gateway.com ) ---> Ocelot Gateway Pod -x-> Identity Server via Ingress ( https://identity.com )
我仍然没有弄清楚,但也许我的文件可以帮助您发现设置中的一些差异并帮助您,因为我们的问题非常相似
至于你可以尝试的事情:
像这样将您在入口清单中指定的主机(如果您在本地运行)添加到您的/etc/hosts
文件中。 确保使用127.0.0.1
而不是 localhost。 我不记得我在哪里读到的,但基本上我认为它与您的本地机器和 docker 以不同方式定义本地主机有关。
127.0.0.1 identity.com 127.0.0.1 pinpoint.com 127.0.0.1 ocelot-gateway.com
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-com
spec:
rules:
- host: example.com
http:
paths:
- path: /frontend
pathType: Prefix
backend:
service:
name: homey-clusterip-srv
port:
number: 80
- path: /backend
pathType: Prefix
backend:
service:
name: homey-gateway-clusterip-srv
port:
number: 80
我在 KinD K8s 集群中运行我的 pod。
我正在使用 Ingress 对象公开我的 Blazor SPA、身份服务器和 Ocelot API 网关。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pinpoint-spa
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: selfsigned-issuer
nginx.ingress.kubernetes.io/service-upstream: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: pinpoint.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: pinpoint-spa
port:
name: http
tls:
- hosts:
- pinpoint.com
secretName: pinpoint-tls-cert
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: identity-com
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: selfsigned-issuer
nginx.ingress.kubernetes.io/service-upstream: "true"
spec:
rules:
- host: identity.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: identity-service
port:
name: http
tls:
- hosts:
- identity.com
secretName: pinpoint-tls-cert
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ocelot-gateway-com
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: selfsigned-issuer
nginx.ingress.kubernetes.io/service-upstream: "true"
spec:
rules:
- host: ocelot-gateway.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ocelot-gateway
port:
name: http
tls:
- hosts:
- ocelot-gateway.com
secretName: pinpoint-tls-cert
这是我的服务清单。
apiVersion: v1
kind: Service
metadata:
name: pinpoint-spa
spec:
type: ClusterIP
selector:
app: pinpoint-spa
ports:
- name: http
port: 80
targetPort: http
protocol: TCP
- name: https
port: 443
targetPort: https
protocol: TCP
apiVersion: v1
kind: Service
metadata:
name: identity-service
spec:
type: ClusterIP
selector:
app: identity-service
ports:
- name: http
port: 80
targetPort: http
protocol: TCP
- name: https
port: 443
targetPort: https
protocol: TCP
apiVersion: v1
kind: Service
metadata:
name: ocelot-gateway
spec:
type: ClusterIP
selector:
app: ocelot-gateway
ports:
- name: http
port: 80
targetPort: http
protocol: TCP
- name: https
port: 443
targetPort: https
protocol: TCP
这是我的ocelot.json
。
"GlobalConfiguration": {
"BaseUrl": "https://ocelot-gateway.com",
"ServiceDiscoveryProvider": {
"Namespace": "default",
"Type": "kube"
}
}
希望这会有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.