【问题标题】:Kubernetes(minikube) + React Frontend + .netcore api + Cluster IP service + ingress + net::ERR_NAME_NOT_RESOLVEDKubernetes(minikube) + React Frontend + .netcore api + 集群 IP 服务 + ingress + net::ERR_NAME_NOT_RESOLVED
【发布时间】:2019-10-17 00:18:50
【问题描述】:

从 React JS 前端调用时,无法解析托管在 Minikube 上的 ClusterIP 服务的 API。

我的应用程序的基本架构如下 React --> .NET 核心 API

这两个组件都作为 ClusterIP 服务托管。我创建了一个入口服务,其中包含指向 React 组件和 .NET 核心 API 的 http 路径。

但是,当我尝试从浏览器调用它时,反应应用程序会呈现,但对 API 的调用失败并显示 网络::ERR_NAME_NOT_RESOLVED

以下是 .yml 文件


1。反应应用程序

apiVersion: v1
kind: Service
metadata:
    name: frontend-clusterip
spec:
    type: ClusterIP
    ports:
    - port: 59000
        targetPort: 3000
    selector:
    app: frontend

2。 .NET 核心 API

apiVersion: v1
kind: Service
metadata:
    name: backend-svc-nodeport
spec:
    type: ClusterIP
    selector:
    app: backend-svc
    ports:
    - port: 5901
        targetPort: 59001

3。入口服务

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
    name: ingress-service
    annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
    rules:
    - http:
        paths:
        - path: /?(.*)
            backend: 
            serviceName: frontend-clusterip
            servicePort: 59000
        - path: /api/?(.*)
            backend:
            serviceName: backend-svc-nodeport
            servicePort: 5901

4。前端部署

apiVersion: apps/v1
kind: Deployment
metadata:
    name: frontend
spec:
    selector:
    matchLabels:
        app: frontend
    replicas: 1
    template:
        metadata:
        labels:
        app: frontend
    spec:
        containers:
        - name: frontend
        image: upendra409/tasks_tasks.frontend
        ports:
        - containerPort: 3000
        env:
        - name: "REACT_APP_ENVIRONMENT"
            value: "Kubernetes"
        - name: "REACT_APP_BACKEND"
            value: "http://backend-svc-nodeport"
        - name: "REACT_APP_BACKENDPORT"
            value: "5901"

这是我在浏览器中遇到的错误:

xhr.js:166 GET 
http://backend-svc-nodeport:5901/api/tasks net::ERR_NAME_NOT_RESOLVED

我在前端容器中安装 curl 以进入前端 pod 以尝试使用上述 URL 连接后端 API,但该命令不起作用

C:\test\tasks [develop ≡ +1 ~6 -0 !]> kubectl exec -it frontend-655776bc6d-nlj7z --curl http://backend-svc-nodeport:5901/api/tasks

Error: unknown flag: --curl

【问题讨论】:

  • 未知标志 curl 是因为双破折号和 curl 之间没有空格。它应该是 --curl,而不是 --curl。
  • 谢谢Suren,现在我得到了api的回复。但是本地机器中的浏览器仍然抛出同样的错误
  • 你是如何从浏览器发出请求的?你不会http://backend-svc-nodeport:5901/api/tasks 对吧?
  • @Upendra 你好,能否提供以下信息:集群环境、kubernetes 版本、网络插件和版本。
  • @Suren,我有一个在 minikube 中运行的 React JS 前端。

标签: reactjs kubernetes .net-core kubernetes-ingress


【解决方案1】:

您从本地计算机收到此错误,因为 ClusterIP 服务类型错误,无法从集群外部访问。正如 kubernetes 中提到的,documentation ClusterIP 只能从集群内部访问。

发布服务(ServiceTypes)

对于应用程序的某些部分(例如前端),您可以 想要将服务公开到外部 IP 地址上,即在外部 您的集群。

KubernetesServiceTypes允许你指定什么样的Service 你要。默认为ClusterIP

Type 值及其行为是:

  • ClusterIP:在集群内部 IP 上公开服务。选择此值使服务只能从 簇。这是默认的ServiceType
  • NodePort: 在每个节点的 IP 上的静态端口( NodePort)。 ClusterIP 服务,NodePort 服务路线,是自动创建的。您将可以联系 NodePort 服务,来自集群外部,通过请求 <NodeIP>:<NodePort>.
  • LoadBalancer: 使用云提供商的负载均衡器在外部公开服务。 NodePortClusterIP 服务,外部负载 平衡器路由是自动创建的。
  • ExternalName: 将服务映射到externalName 字段的内容(例如 foo.bar.example.com),通过返回 CNAME 记录

    以其价值。未设置任何类型的代理。

    注意:您需要 CoreDNS 1.7 或更高版本才能使用ExternalName 类型。

我建议改用NodePortLoadBalancer 服务类型。

有关示例,请参阅上述文档链接。

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2022-01-18
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多