Kubernetes:Frontend-Pod 无法解析 Backend-Service 的 dns(使用 Minikube)

Kubernetes: Frontend-Pod cannot resolve dns of Backend-Service (using Minikube)

我正在学习 Kubernetes,但我 运行 在我的本地 Minikube(Docker 驱动程序)中遇到了 API 的问题。 我有一个 pod 运行ning 一个 angluar-client,它试图到达后端 pod。前端 Pod 由 NodePort 服务公开。后端 pod 通过 ClusterIP 服务暴露给集群。

但是当我尝试从前端访问 clusterip 服务时,dns transpile-svc.default.svc.cluster.local 无法解析。 error message in the client

dns 应该可以正常工作。我按照这个 https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/ 并从我可以 nslookup.

的地方部署了一个 dnsutils pod
winpty kubectl exec -i -t dnsutils -- nslookup transpile-svc.default
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   transpile-svc.default.svc.cluster.local
Address: 10.99.196.82

这是 clusterIP 服务的 .yaml 文件

apiVersion: v1
kind: Service
metadata:
  name: transpile-svc
  labels: 
    app: transpile
spec:
  selector:
    app: transpile
  ports:
  - port: 80
    targetPort: 80

即使我将 IP 硬编码到前端的请求中,我得到的响应也是空的。 我验证了后端 pod 工作正常,当我将其作为 NodePort 公开时,我可以使用浏览器访问 api。

我在这里错过了什么?我被这个问题困扰了很长一段时间,但我没有找到任何解决方案。

DNS 主机名 *.*.svc.cluster.local 只能从 kubernetes 集群中解析。您应该在前端 javascript 代码中使用 http://NODEIP:NODEPORT 或 url 由 minikube service transpile-svc --url 提供,在 kubernetes 集群之外的浏览器中 运行。

如果前端pod是nginx那么你可以在docs

中描述的nginx配置文件中如下配置后端服务名称
upstream transpile {
    server transpile;
}

server {
    listen 80;

    location / {
        proxy_pass http://transpile-svc;
    }
}

由于您的前端应用程序从集群外部调用您的应用程序,因此您也需要将后端应用程序暴露给外部网络。

有两种方法:通过将 transpile-svc 服务更改为负载均衡器类型来直接公开它,或者引入一个入口控制器(例如带有 Ingres 对象的 Nginx 入口控制器)来处理所有重定向

在 minikube 中将服务公开为负载均衡器的步骤

1.Change 您的服务 transpile-svc 输入 LoadBalancer 2.Run 命令 minikube 服务 transpile-svc 公开服务,即分配一个 IP。 3. 运行 kubectl get services 获取外部IP分配。使用 IP:POST 从前端应用程序调用