我已经开始研究 k8s,但我在本地工作时遇到了一些问题,我有 2 个应用程序(node+nextjs)+ 1 个数据库(pg),数据库由 docker 提供服务(我使用
host.docker.internal
连接到它),而这 2 个应用程序是 docker 镜像。
k8s非常简单:2个服务+2个部署+1个入口,这是入口文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
spec:
ingressClassName: nginx
rules:
- host: local.api.my-app.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-api
port:
number: 4001
- host: local.my-app.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-frontend
port:
number: 3000
local.my-app.com
是nextjs,它正在向api发送请求http://local.api.my-app.com
服务器端和客户端,在我的/etc/hosts
中我添加了:
127.0.0.1 local.api.my-app.com
127.0.0.1 local.my-app.com
问题是,当 nextjs 应用程序向
local.api.my-app.com
(服务器端)发送请求时,我收到此错误:
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 80
我想因为在
/etc/hosts
中这个主机名指向本地主机而不是host.minikube.internal
,但同时在客户端发送请求时我将请求发送到自定义主机名,我该如何解决这个问题?
之前我在入口中使用路径而不是域,一切都工作正常
我假设您需要从外部访问这两个主机名。
推荐:
您应该考虑在 集群 DNS 中使用来发现集群内部的每个应用程序,而不是在每个 pod 中的
/etc/hosts
文件中进行硬编码。
您的 nextjs 服务 -> service-frontend..svc.cluster.local 您的 API 服务 -> service-api..svc.cluster.local
入口控制器/资源通常仅用于外部访问(集群外部)