繁体   English   中英

无法从 kube.netes 集群上的 angular pod 向 Ocelot Gateway 服务发出 HTTP 请求

[英]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 )

我仍然没有弄清楚,但也许我的文件可以帮助您发现设置中的一些差异并帮助您,因为我们的问题非常相似

至于你可以尝试的事情:

  1. 为入口启用 kube.netes 集群。 对于 minikube,请看这里 对于 KinD,请看这里

  2. 像这样将您在入口清单中指定的主机(如果您在本地运行)添加到您的/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
  1. 也许确保您在入口清单中指定了您正在使用的主机。

.

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 网关。

ingress.blazor-spa.yaml

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

ingress.identity-server.yaml

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

ingress.ocelot-gateway.yaml

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

这是我的服务清单。

svc.blazor-spa.yaml

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

svc.identity-server.yaml

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

svc.ocelot-gateway.yaml

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM