我尝试使用 kubernetes 一段时间了,我偶然发现了一个我无法解决的问题。 我正在尝试部署一个 React 前端和一个 Rust 后端应用程序(作为两个容器/Pod 之间通信的情况),一切正常,它们似乎都在工作,并且可以使用
minikube service <name-of-service>
访问前端,问题是前端尝试从后端获取数据但失败并出现多个错误:
Websocket connection to 'ws://<minikube-ip>/ws' failed
GET 'http://backend:8080/test' net::ERR_NAME_NOT_RESOLVED
(也许这就是问题所在?)Failed to fetch
我一直在尝试更改用于创建部署和服务的 .yaml 文件,并查看了其他人尝试做同样事情的多种方法,但似乎没有任何帮助,因为他们只透露了他们的规范.yaml 文件
这就是我的前端部署和服务 .yaml 文件的样子:
apiVersion: apps/v1
kind: Deployment
metadata:
name: client-deployment
labels:
app: client
spec:
replicas: 1
selector:
matchLabels:
app: client
template:
metadata:
labels:
app: client
tier: frontend
spec:
containers:
- name: client
image: quan1um/react-test:latest
imagePullPolicy: Always
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: client-service
spec:
selector:
app: client
tier: frontend
ports:
- protocol: "TCP"
port: 3000
targetPort: 3000
type: LoadBalancer
后端:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: quan1um/rust-actix-test:latest
ports:
- name: http
containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 8080
targetPort: http
type: ClusterIP
正如你从我的错误消息中看到的,我的前端尝试从
http://backend:8080
获取数据,我确实意识到这是行不通的,因为这个获取请求发生在浏览器上,而浏览器不知道 kubernetes 上的服务以及他们的名字。
尽管我只在前端使用 React,但我已经看到 nginx 配置文件使用 .yaml 服务文件中指定的名称作为服务器配置块,我对此也很好奇
如果您想从 K8s 外部(即浏览器)调用任何内容,您需要公开并ingress。
使用 minikube 则稍微复杂一些。看看这个示例。
你需要这样的东西:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /backend
pathType: Prefix
backend:
service:
name: backend
port:
number: 8080