我想將我的 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
My assumption is that everything is in place at this point and I should be able to open a browser to hit localhost:31000. I expected to see that spinning react symbol for their landing page just like I do when I only run a local docker container.
Here is it all running:
$ 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
Some extra things to note:
- Although I don't have it setup currently I did have my springboot service in the deployment file. I logged into it's pod and ensured the react container was reachable. It was.
- I havent done anything with my firewall settings (but sort of assume I dont have to since the run with the springboot service worked?)
- 我在 chrome 開發人員工具中看到了這一點,到目前為止認為它與我的問題無關:crbug/1173575,不推薦使用非 JS 模塊檔案。一段時間后,我在主瀏覽器頁面中看到此回應:localhost 未發送任何資料。ERR_EMPTY_RESPONSE
uj5u.com熱心網友回復:
如果您在本地系統中使用 minikube 使用 Kubernetes,那么它將不適用于 localhost:3000,因為它運行在擁有私有 IP 地址的 minikube 集群中,因此您應該 minikube service <servicename>在終端中嘗試使用 localhost:3000 而不是它顯示了您的服務的 URL。
uj5u.com熱心網友回復:
您不需要 Service 來將埠轉發到 pod。您只需直接轉發即可
kubectl port-forward <pod-name> <local-port>:<pod-port>
這會在選定埠 ( <local-port>)上的本地計算機和pod-name選定 pod 埠 ( <pod-port>)上的pod ( )之間創建“隧道” 。
然后你可以卷曲你的豆莢
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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331100.html
標籤:反应原生 码头工人 Kubernetes
下一篇:為什么我在試圖運行我的iOS應用時得到錯誤"'FirebaseCore/FirebaseCore.h'檔案未找到"?
