Vanilla JS ERR_NAME_NOT_RESOLVED 是一个 minikube 集群
Vanilla JS ERR_NAME_NOT_RESOLVED on minikube cluster
我在本地 minikube 集群上有一个最小的 Web 应用程序 运行ning。
后端在 /be/test/hi
处公开了一个 API 并且服务名称也是。
当我从前端向后端发送 GET 请求时,我得到:
main.js:15 GET http://be/be/test/hi net::ERR_NAME_NOT_RESOLVED
如果我从前端 POD 运行 nslookup be
获得正确的 dns 解析,并且 运行ning
curl be/be/test/hi
我从后端得到了正确的响应(一个简单的 'Hello world' 字符串)
我错过了什么?
backend.yaml
apiVersion: v1
kind: Service
metadata:
name: be
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: be
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: be
spec:
replicas: 1
selector:
matchLabels:
app: be
template:
metadata:
labels:
app: be
spec:
containers:
- name: be
image: kubebe
imagePullPolicy: Never
ports:
- containerPort: 8080
frontend.yaml
apiVersion: v1
kind: Service
metadata:
name: fe
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: fe
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 1
selector:
matchLabels:
app: fe
template:
metadata:
labels:
app: fe
spec:
containers:
- name: fe
image: kubefe
imagePullPolicy: Never
ports:
- containerPort: 8080
main.js
const URL="http://be/be/test/hi"
function httpGetAsync(){
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
console.log(xmlHttp.responseText);
}
xmlHttp.open("GET", URL, true);
xmlHttp.send(null);
}
前端 Dockerfile(kubefe 镜像):
FROM centos/httpd-24-centos7:2.4
RUN mkdir -p /var/www/html/fe
COPY ./index.html ./main.js /var/www/html/fe/
编辑:我已经解决了我的问题,但我认为实际问题仍未得到解答。
为了解决这个问题,我简单地从 url 中删除了协议和主机,并在 /etc/httpd/conf.d/default-site.conf
中设置了代理规则
默认-site.conf
<VirtualHost *:8080>
ProxyPreserveHost Off
ProxyRequests Off
ProxyPass /be/ http://be/be/
</VirtualHost>
您的前端代码 (javascript) 正在您的浏览器中执行,而不是在 kubernetes 集群 (nginx pod) 中执行
这里有 3 个选项,
- 为您的前端创建一个 NodePort 服务
- 依赖kubeproxy做端口转发
- 创建入口
我在本地 minikube 集群上有一个最小的 Web 应用程序 运行ning。
后端在 /be/test/hi
处公开了一个 API 并且服务名称也是。
当我从前端向后端发送 GET 请求时,我得到:
main.js:15 GET http://be/be/test/hi net::ERR_NAME_NOT_RESOLVED
如果我从前端 POD 运行 nslookup be
获得正确的 dns 解析,并且 运行ning
curl be/be/test/hi
我从后端得到了正确的响应(一个简单的 'Hello world' 字符串)
我错过了什么?
backend.yaml
apiVersion: v1
kind: Service
metadata:
name: be
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: be
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: be
spec:
replicas: 1
selector:
matchLabels:
app: be
template:
metadata:
labels:
app: be
spec:
containers:
- name: be
image: kubebe
imagePullPolicy: Never
ports:
- containerPort: 8080
frontend.yaml
apiVersion: v1
kind: Service
metadata:
name: fe
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: fe
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 1
selector:
matchLabels:
app: fe
template:
metadata:
labels:
app: fe
spec:
containers:
- name: fe
image: kubefe
imagePullPolicy: Never
ports:
- containerPort: 8080
main.js
const URL="http://be/be/test/hi"
function httpGetAsync(){
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
console.log(xmlHttp.responseText);
}
xmlHttp.open("GET", URL, true);
xmlHttp.send(null);
}
前端 Dockerfile(kubefe 镜像):
FROM centos/httpd-24-centos7:2.4
RUN mkdir -p /var/www/html/fe
COPY ./index.html ./main.js /var/www/html/fe/
编辑:我已经解决了我的问题,但我认为实际问题仍未得到解答。
为了解决这个问题,我简单地从 url 中删除了协议和主机,并在 /etc/httpd/conf.d/default-site.conf
中设置了代理规则默认-site.conf
<VirtualHost *:8080>
ProxyPreserveHost Off
ProxyRequests Off
ProxyPass /be/ http://be/be/
</VirtualHost>
您的前端代码 (javascript) 正在您的浏览器中执行,而不是在 kubernetes 集群 (nginx pod) 中执行
这里有 3 个选项,
- 为您的前端创建一个 NodePort 服务
- 依赖kubeproxy做端口转发
- 创建入口