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 从前端应用程序调用
我正在学习 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
.
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 从前端应用程序调用