我想把我的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。不知道为什么修复它,但它做到了!
我在看上面的评论时发现了一些评论。
- 我发现,无论我是否定义了服务,如果不进行端口转发,我都无法访问集群。
- ContainerPort在我的理解中是kubernetes在pod到pod的通信上工作,并且从用户的角度来看不会影响应用程序的功能(可能是错误的!)
- 很高兴知道minikube,我正在考虑尝试一下,如果我这样做,我会知道为什么端口3000停止工作。
您不需要Service来端口转发到pod。你只需要直接转发到它
kubectl port-forward <pod-name> <local-port>:<pod-port>
这会创建一个"隧道"。在选定的端口(<local-port>
)上的本地机器和您的pod (pod-name
)之间,在选定的pod的端口(<pod-port>
)上。
然后你可以用
curl localhost:<local-port>
如果你真的想使用一个Service,那么端口转发到Service(在你的例子中是service/demo
) + Service端口,但它最终会被转换为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。