reactjs - 无法访问 Kubernetes 上暴露的 Dockerized React 应用程序
问题描述
我正在尝试将我的 Dockerized React 应用程序部署到 Kubernetes。我相信我已经正确地对其进行了 docker 化,但是我在访问暴露的 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 Registry。我通过像这样运行它来验证容器是否正确运行:
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 控制器的设计目的,但它不是唯一的方法——type: LoadBalancer
如果你在云环境中运行,Kubernetes 知道如何以编程方式创建负载均衡器你。
推荐阅读
- postgresql - 更新 postgres 中的大量行
- javascript - javascript 检查对象中是否有任何数组为空
- javascript - 如何通过使用redux单击按钮在反应数据网格上添加行和列
- swift - 如何在 SwiftUI 中激活动画时读取点击的本地位置?
- postman - 在邮递员收藏中隐藏“无环境”
- flutter - 如何水平添加容器 - 颤振
- c# - 在 Blazor Webassembly 项目中使用 razor 组件库中的资源文件
- mongodb - 如何使用聚合在mongo查询中查找包含特殊字符的字符串
- android - 在 Android 中,在一个 api 调用中列出 api 调用
- xpath - 我如何提取第二个中的内容,CAT5 是我需要提取到 xpath 中的内容