[英]React works from docker image on localmachine but unreachable from kubernetes. service looks to be configured correctly
我想将我的 docker 镜像运行 react 放入 kubernetes 并能够访问主页。 我能够在本地docker run --rm -p 3000:3000 reactdemo
来获得主页。 当我尝试部署到我的 kubernetes(通过 docker-desktop 在本地运行)时,我没有得到任何响应,直到最终超时。
我在下面使用 springboot docker 映像尝试了相同的过程,并且能够在浏览器中获得简单的 json 响应。
下面是我的 Dockerfile、部署 yaml(其中包含服务)以及我正在运行以尝试获取结果的命令。 士气低落,任何帮助将不胜感激!
Dockerfile:
# pull official base image
FROM node
# set working directory
RUN mkdir /app
WORKDIR /app
# install app dependencies
COPY package.json /app
RUN npm install
# add app
COPY . /app
#Command to build ReactJS application for deploy might not need this...
RUN npm run build
# start app
CMD ["npm", "start"]
部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: reactdemo
image: reactdemo:latest
imagePullPolicy: Never
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: demo
spec:
type: NodePort
selector:
app: demo
ports:
- port: 3000
targetPort: 3000
protocol: TCP
nodePort: 31000
selector:
app: demo
然后我在本地机器上打开一个端口到服务的节点端口:
PS C:\WINDOWS\system32> kubectl port-forward pod/demo-854f4d78f6-qv4mt 31000:3000
Forwarding from 127.0.0.1:31000 -> 3000
我的假设是此时一切就绪,我应该能够打开浏览器访问 localhost:31000。 我希望看到他们登陆页面的旋转反应符号,就像我只运行本地 docker 容器时所做的那样。
这是一切运行:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/demo-854f4d78f6-7dn7c 1/1 Running 0 4s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demo NodePort 10.111.203.209 <none> 3000:31000/TCP 4s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo 1/1 1 1 4s
NAME DESIRED CURRENT READY AGE
replicaset.apps/demo-854f4d78f6 1 1 1 4s
一些额外的注意事项:
如果您在本地系统中使用 minikube 使用 Kubernetes,那么它将不适用于 localhost:3000,因为它运行在拥有私有 IP 地址的 minikube 集群中,所以不要尝试 localhost:3000,您应该尝试minikube service <servicename>
这在您的终端中,它显示了您的服务的 URL。
您不需要 Service 来将端口转发到 pod。 您只需直接转发即可
kubectl port-forward <pod-name> <local-port>:<pod-port>
这会在选定端口 ( <local-port>
) 上的本地计算机和选定 pod 端口 ( <pod-port>
) 上的 pod ( pod-name
) 之间创建“隧道”。
然后你可以卷曲你的豆荚
curl localhost:<local-port>
如果你真的想使用一个服务,那么端口转发到服务(在你的情况下是service/demo
)+服务端口,但它最终会被转换成 POD 的 IP。
.spec.port.[0].targetPort
更改为与部署中的.spec.template.spec.containers.port.containerPort
相同,因此在您的情况下:...
- port: 3000
targetPort: 80
...
kubectl port-forward service/demo 8080:3000
然后用卷曲你的服务
curl localhost:8080
如果同一服务下有更多 pod,这会产生副作用。 端口转发几乎总是连接到同一个 pod。
感谢所有反馈窥视! 在尝试提出的解决方案时,我发现了我的错误,这很愚蠢。 我尝试删除该服务并尝试上面提到的不同端口配置。 解决它的是使用 127.0.0.1:31000 而不是 localhost。 不知道为什么会修复它,但确实如此!
话虽如此,我在查看上述评论时发现了一些评论。
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.