gpt4 book ai didi

reactjs - 无法访问 Kubernetes 上公开的 Dockerized React 应用程序

转载 作者:行者123 更新时间:2023-11-28 21:52:08 25 4
gpt4 key购买 nike

我正在尝试将我的 Dockerized React 应用程序部署到 Kubernetes。我相信我已经正确地对它进行了 dockerized,但是我在访问暴露的 pod 时遇到了问题。

我没有 Docker 或 Kubernetes 方面的经验,因此不胜感激。

我的 React 应用只是由 Tomcat 提供的静态文件(来自 npm run build)。

我的 Dockerfile 在下面。综上所述,我将我的应用程序放在Tomcat文件夹中并暴露端口8080。

FROM private-docker-registry.com/repo/tomcat:latest

EXPOSE 8080:8080

# Copy build directory to Tomcat webapps directory
RUN mkdir -p /tomcat/webapps/app
COPY /build/sample-app /tomcat/webapps/app

# Create a symbolic link to ROOT -- this way app starts at root path
(localhost:8080)

RUN ln -s /tomcat/webapps/app /tomcat/webapps/ROOT

# Start Tomcat
ENTRYPOINT ["catalina.sh", "run"]

我构建 Docker 镜像并将其推送到私有(private) Docker 注册表。我通过像这样运行它来验证容器是否正确运行:

docker run -p 8080:8080 private-docker-registry.com/repo/sample-app:latest

然后,如果我转到 localhost:8080,我会看到我的 React 应用程序的主页。

现在,我遇到的问题是部署到 Kubernetes 和从外部访问应用程序。

这是我的 deployment.yaml 文件:

kind: Deployment
apiVersion: apps/v1beta2
metadata:
name: sample-app
namespace: dev
labels:
app: sample-app
spec:
replicas: 1
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: sample-app
image: private-docker-registry.com/repo/sample-app:latest
ports:
- containerPort: 8080
protocol: TCP
nodeSelector:
TNTRole: luxkube
---
kind: Service
apiVersion: v1
metadata:
name: sample-app
labels:
app: sample-app
spec:
selector:
app: sample-app
type: NodePort
ports:
- port: 80
targetPort: 8080
protocol: TCP

我通过运行创建部署和服务 kubectl --namespace=dev create -f deployment.yaml

Output of 'describe deployment'

Name: sample-app
Namespace: dev
CreationTimestamp: Sat, 21 Jul 2018 12:27:30 -0400
Labels: app=sample-app
Annotations: deployment.kubernetes.io/revision=1
Selector: app=sample-app
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=sample-app
Containers:
sample-app:
Image: private-docker-registry.com/repo/sample-app:latest
Port: 8080/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: sample-app-bb6f59b9 (1/1 replicas created)
Events: <none>

Output of 'describe service'

Name: sample-app
Namespace: fab-dev
Labels: app=sample-app
Annotations: <none>
Selector: app=sample-app
Type: NodePort
IP: 10.96.29.199
Port: <unset> 80/TCP
TargetPort: 8080/TCP
NodePort: <unset> 34604/TCP
Endpoints: 192.168.138.145:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>

现在我不知道应该使用哪个 IP 和端口来访问该应用程序。我尝试了所有组合,但没有一个组合加载我的应用程序。我相信端口应该是 80,所以如果我只有 IP,我应该能够转到浏览器并通过转到 http://访问 React 应用程序。

有人有什么建议吗?

最佳答案

简短的版本是服务在集群中的每个节点上监听相同的 TCP/IP 端口 (34604),如 describe service 的输出所示>:

NodePort:                 <unset>  34604

如果您希望通过“漂亮”的 URL 访问应用程序,您需要一个负载平衡器,它可以将主机名转换为集群内 IP 和端口组合。这就是 Ingress Controller 的设计目的,但这不是唯一的方法——如果您在云环境中运行,将服务更改为 type: LoadBalancer 将为您完成此操作Kubernetes 知道如何以编程方式为您创建负载均衡器。

关于reactjs - 无法访问 Kubernetes 上公开的 Dockerized React 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51458535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com