Kubernetes:ERR_NAME_NOT_RESOLVED

Posted

技术标签:

【中文标题】Kubernetes:ERR_NAME_NOT_RESOLVED【英文标题】:Kubernetes: ERR_NAME_NOT_RESOLVED 【发布时间】:2019-07-18 09:13:07 【问题描述】:

我在 GKE 中部署了一个 mongo db、Spring Boot BE、Angular 应用程序。我的 FE 服务是一个负载均衡器,它需要与我的 BE 连接以获取数据,但我的浏览器中出现控制台错误:GET http://contactbe.default.svc.cluster.local/contacts net::ERR_NAME_NOT_RESOLVED。我的 FE 需要使用 /contacts 端点来获取数据。我在我的 Angular 应用程序中使用我的 BE 服务 (contactbe.default.svc.cluster.local) 中的 DNS。这是我用来创建部署的 yml 文件:

apiVersion: v1
kind: Service
metadata:
  name: mongo
  labels:
    run: mongo
spec:
  type: NodePort
  ports:
  - port: 27017
    targetPort: 27017
    protocol: TCP
  selector:
    run: mongo
---
apiVersion: apps/v1beta1
kind: Deployment
metadata: 
  name: mongo
spec:
  template:
    metadata:
      labels:
        run: mongo
    spec:
      containers:
      - name: mongo
        image: mongo
        ports:
        - containerPort: 27017
---        
apiVersion: v1
kind: Service
metadata:
  name: contactbe
  labels:
    app: contactbe
spec:
  type: NodePort 
  ports:
  - port: 8181
    targetPort: 8181
    protocol: TCP
  selector:
    app: contactbe
---
apiVersion: apps/v1beta1
kind: Deployment
metadata: 
  name: contactbe
spec:
  template:
    metadata:
      labels:
        app: contactbe
    spec:
      containers:
      - name: contactbe
        image: glgelopfalcon/k8s_contactbe:latest
        ports:
        - containerPort: 8181
---
apiVersion: apps/v1beta1 # for versions before 1.9.0 use apps/v1beta2 
kind: Deployment 
metadata: 
  name: angular-deployment 
spec: 
  selector: 
    matchLabels: 
      app: angular 
  replicas: 2 # tells deployment to run 2 pods matching the template 
  template: 
    metadata: 
      labels: 
        app: angular 
    spec: 
      containers: 
      - name: angular 
        image: glgelopfalcon/my-angular-app:latest 
        ports: 
        - containerPort: 80
--- 
# https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service  
kind: Service 
apiVersion: v1 
metadata: 
  name: angular-service 
spec: 
  selector: 
    app: angular 
  ports: 
  - port: 80
    targetPort: 80
    protocol: TCP
  type: LoadBalancer 

我搜索了很多,但我仍然没有找到解决这个问题的方法。如果有人可以伸出援助之手,我将不胜感激。

Console error

【问题讨论】:

如果我理解正确,呼叫是通过服务从 angular-service 应用程序向 contactbe 应用程序发出的,对吗?该错误意味着 DNS 问题。连接到其中一个 angular pod 并运行相同的请求:kubectl exec -it [angular_pod_name] -- curl contactbe.default.svc.cluster.local:8181/contact。如果 angular 没有安装 curl,你可以改用 wget 【参考方案1】:

检查您的负载平衡器是否打开端口 27017 作为您向端口 27017 发送的请求

否则您可以将服务节点端口更改为 80,目标端口将相同

【讨论】:

你好苛刻,我不明白你的建议。你能否提供更多细节或代码sn-ps?我是K8S的新手。提前谢谢你。 检查负载均衡器上的开放端口 Mongo Db 正在监听 27017 端口。我的负载均衡器正在使用端口 80。此外,我的负载均衡器还有端口节点端口目标端口协议 80 31011 80 TCP【参考方案2】:

URL 中缺少端口#。试试下面

contactbe.default.svc.cluster.local:8181/contacts

【讨论】:

出现同样的错误:contactbe.default.svc.cluster.local:8181/contacts:1 加载资源失败:net::ERR_NAME_NOT_RESOLVED 你能像下面这样直接在contactbe pod中点击url并确认结果。 curl localhost:8181/联系人 我得到了成功的结果。 curl localhost:8181/contacts ["id":"01","name":"Gerardo","email":"gag@gmail.com","phone":"1111","lastName":"Lopez" ]root@contactbe-54d479d774-zf5b8:/usr/app# 。嗯,我很困惑。 什么意思? pod 正在工作,但为什么我无法从前端获取它? 似乎 pod 没有绑定到服务。共享“kubectl get ep”的输出【参考方案3】:

我找到了解决方案。我从后端更改了服务类型。我使用的是负载均衡器而不是 ClusterIP,它按预期工作

【讨论】:

为什么?通常我们不需要将后端服务暴露给外部世界,并且应该保持友好:仅 ClusterIP。可能还有其他解决方案。 你能解决吗?我遇到了同样的问题。

以上是关于Kubernetes:ERR_NAME_NOT_RESOLVED的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes - Kubernetes部署Kubernetes Dashbaord

kubernetes学习01—kubernetes介绍

Kubernetes——Kubernetes的介绍和使用 kubeadm方式搭建Kubernetes集群

Kubernetes——Kubernetes资源管理+Kubernetes实战入门

Kubernetes——Kubernetes资源管理+Kubernetes实战入门

kubernetes 提供啥功能