我正在尝试将我的Dockerized React应用程序部署到Kubernetes . 我相信我已正确定位它,但我无法访问暴露的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镜像推送到私有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应用程序 .
有没有人有建议?
1 回答
简短版本是服务正在侦听集群中每个节点上的相同TCP / IP端口(
34604
),如describe service
的输出中所示:如果您希望通过"nice" URL访问该应用程序,那么您可以使用Ingress控制器进行操作,但这不是唯一的方法 - 将服务更改为
type: LoadBalancer
将为您执行此操作,如果您是在 Cloud 环境中运行,Kubernetes知道如何以编程方式为您创建负载均衡器 .