繁体   English   中英

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

[英]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

一些额外的注意事项:

  • 虽然我目前没有设置它,但我确实在部署文件中有我的 springboot 服务。 我登录到它的 pod 并确保可以访问 react 容器。 它是。
  • 我没有对我的防火墙设置做任何事情(但有点假设我不需要因为使用 springboot 服务的运行工作?)
  • 我在 chrome 开发人员工具中看到了这一点,到目前为止认为它与我的问题无关:crbug/1173575,不推荐使用非 JS 模块文件。 一段时间后,我在主浏览器页面中看到此响应:localhost 未发送任何数据。 ERR_EMPTY_RESPONSE

如果您在本地系统中使用 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。

  1. 将 Service 中的.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。

感谢所有反馈窥视! 在尝试提出的解决方案时,我发现了我的错误,这很愚蠢。 我尝试删除该服务并尝试上面提到的不同端口配置。 解决它的是使用 127.0.0.1:31000 而不是 localhost。 不知道为什么会修复它,但确实如此!

话虽如此,我在查看上述评论时发现了一些评论。

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

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM