【问题标题】:Services can't communicate because there is not DNS resolving in Kubernetes服务无法通信,因为 Kubernetes 中没有 DNS 解析
【发布时间】:2020-04-23 21:31:17
【问题描述】:

我使用 ClusterIP 类型配置我的服务。我想让他们交流。

服务

apiVersion: v1
kind: Service
metadata:
 labels:
  app: app-backend-deployment
 name: app-backend
spec:
 type: ClusterIP
 ports:
 - port: 8020
   protocol: TCP
   targetPort: 8100
 selector:
  app: app-backend

部署

apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
  app: app-backend
 name: app-backend-deployment
spec:
 replicas: 1
 selector:
    matchLabels:
      app: app-backend
 template:
    metadata:
      labels:
        app: app-backend
    spec:
     containers:
     - name: app-backend
       image: app-backend
       ports:
       - containerPort: 8100
       imagePullPolicy: Never

配置映射

apiVersion: v1
kind: ConfigMap
metadata:
  name: backend-conf # name of configMap
data:
  BACKEND_SERVICE_HOST: app-backend:8020

这就是我传递给前端服务的内容,我想通过 DNS 名称进行 REST 调用,例如 http://app-backend:8020/get/1。但就像我在控制台应用程序中看到的无法解析 DNS 名称 net::ERR_NAME_NOT_RESOLVED

我还检查了 pod nslookup:

busybox nslookup app-backend.default.svc.cluster.local
Server:         10.96.0.10
Address:        10.96.0.10:53

Name:   app-backend.default.svc.cluster.local
Address: 10.106.41.36

然后比较一下

kubectl describe svc app-backend
Name:              app-backend
Namespace:         default
Labels:            app=app-backend-deployment
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"...
Selector:          app=app-backend
Type:              ClusterIP
IP:                10.106.41.36
Port:              <unset>  8020/TCP
TargetPort:        8100/TCP

就像您看到的一样,地址上有相同的 IP,但我不知道在哪里查看为什么 dns 解析器不起作用。 kubectl version Client "v1.15.5", Server Version:"v1.17.3",

【问题讨论】:

  • 您在哪里进行失败的 DNS 查找?该名称仅在集群内有效。
  • “前端服务”是个什么东西?是另一个 Kubernetes pod,还是别的什么?
  • @BurakSerdar 在 pod app-backend-deployment-78856bd74-s2pq5 内
  • @DavidMaze 是的,这是 ngninx 上的另一个服务 Angular 应用程序,具有不同的 pod 和服务
  • 当您说“Angular”时,实际的 REST 请求是否来自浏览器应用程序?那将无法使用 Kubernetes DNS。

标签: kubernetes


【解决方案1】:

由于提供给本地机器的前端服务(Angular 的工作方式),REST 请求无法通过 Kubernetes DNS 与另一个后端服务。我需要通过 Ingress 与他们沟通。由于注释不同,我必须使用 2 Ingress。 Meaby 有一种更好的方法来只使用一个,但是当我只想使用一个 Ingress 时,我无法找到一种方法让它们都工作,使用相同的注释。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 annotations:
  kubernetes.io/ingress.class: nginx
  nginx.ingress.kubernetes.io/rewrite-target: /$2
 name: app-backend-ingress
spec:
 rules:
 - host: app.io
   http:
     paths:
       - path: /api(/|$)(.*)
         backend:
          serviceName: app-backend
          servicePort: 8020
---  
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 annotations:
  kubernetes.io/ingress.class: nginx
  nginx.ingress.kubernetes.io/rewrite-target: /
 name: app-frontend-ingress
spec:
 rules:
 - host: app.io
   http:
     paths:
       - path: /
         backend:
          serviceName: app-frontend
          servicePort: 80

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 2020-02-21
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多