React从本地机器上的docker映像工作,但无法从kubernetes访问.服务看起来配置正确



我想把我的docker映像运行到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

然后在我的本地机器上打开一个端口到服务的nodeport:

PS C:WINDOWSsystem32> kubectl port-forward pod/demo-854f4d78f6-qv4mt 31000:3000
Forwarding from 127.0.0.1:31000 -> 3000

我的假设是,在这一点上一切都在适当的地方,我应该能够打开浏览器来点击localhost:31000。我希望在他们的着陆页上看到旋转的react符号,就像我只运行本地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

注意事项:

  • 虽然我没有设置它目前我有我的springboot服务在部署文件。我登录了它的舱确保反应容器是可访问的。。
  • 我没有做任何与我的防火墙设置(但假设我不需要因为运行与springboot服务工作?)
  • 我在chrome开发者工具中看到这个,到目前为止我认为它与我的问题无关:crbug/1173575,非js模块文件已弃用。一段时间后,我在主浏览器页面看到了这个响应:

localhost didn’t send any data.
ERR_EMPTY_RESPONSE

如果你在本地系统中使用minikube使用Kubernetes,那么它将无法与localhost:3000一起工作,因为它运行在minikube集群中,该集群拥有私有IP地址,所以不要尝试localhost:3000,你应该在终端中尝试minikube service <servicename>this,它会显示你的服务的URL。

感谢大家的反馈!在尝试提出的解决方案时,我发现了我的错误,这是相当愚蠢的。我尝试删除服务并尝试上面提到的不同端口配置。解决方法是使用127.0.0.1:31000代替localhost。不知道为什么修复它,但它做到了!

我在看上面的评论时发现了一些评论。

  1. 我发现,无论我是否定义了服务,如果不进行端口转发,我都无法访问集群。
  2. ContainerPort在我的理解中是kubernetes在pod到pod的通信上工作,并且从用户的角度来看不会影响应用程序的功能(可能是错误的!)
  3. 很高兴知道minikube,我正在考虑尝试一下,如果我这样做,我会知道为什么端口3000停止工作。

感谢

您不需要Service来端口转发到pod。你只需要直接转发到它

kubectl port-forward <pod-name> <local-port>:<pod-port>

这会创建一个"隧道"。在选定的端口(<local-port>)上的本地机器和您的pod (pod-name)之间,在选定的pod的端口(<pod-port>)上。
然后你可以用

卷曲你的pod
curl localhost:<local-port>

如果你真的想使用一个Service,那么端口转发到Service(在你的例子中是service/demo) + Service端口,但它最终会被转换为POD的IP。

  1. 将服务中的.spec.port.[0].targetPort更改为与部署中的.spec.template.spec.containers.port.containerPort相同,因此在您的情况下:
...
- port: 3000
targetPort: 80
...
  1. 端口转发到服务,带有服务端口
kubectl port-forward service/demo 8080:3000

然后用

卷曲你的服务
curl localhost:8080

如果在同一服务下有更多的pod,则会产生副作用。端口转发几乎总是连接到同一个pod。

相关内容

  • 没有找到相关文章

最新更新