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——Kubernetes的介绍和使用 kubeadm方式搭建Kubernetes集群
Kubernetes——Kubernetes资源管理+Kubernetes实战入门