当前位置: 首页 > 知识库问答 >
问题:

无法访问Kubernetes上公开的停靠React应用程序

东方建修
2023-03-14

我正在尝试将我的Docked React应用程序部署到Kubernetes。我相信我已经正确对接了,但我无法访问暴露的吊舱。

我没有在Docker或Kubernetes工作的经验,所以任何帮助都将不胜感激。

我的反应应用程序只是从Tomcat提供的静态文件(从npm运行构建)。

我的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注册表。我通过这样运行它来验证容器是否正确运行:

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

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

现在,我遇到的麻烦是部署到库伯内特斯并从外部访问应用程序。

这是我的部署。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部署创建了部署和服务。亚马尔

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应用程序。

有人有什么建议吗?

共有2个答案

仉伟兆
2023-03-14

我相信你现在已经找到了答案:),我在这里着陆是因为我面临着这个问题。为自己解决了,希望这对每个人都有帮助。

以下是可以帮助您的:

  1. 部署你的应用程序(比如:react app)

将服务端口发布为3000、目标端口3000、节点端口(自动选择32250)

kubectl get svc react-app --namespace=notesui-dev
NAME          TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
react-app   NodePort   10.23.22.55   <none>        3000:32250/TCP   48m

Yaml:(样本)

apiVersion: v1
kind: Service
  name: react-app
  namespace: app-dev
spec:
  selector: <workload>
  ports:
  - nodePort: 32250
    port: 3000
    protocol: TCP
    targetPort: 3000

  type: NodePort
status: {}

在浏览器上访问应用程序:

http://<Host>:32250/index

是pod运行的节点ip。如果应用程序在多个节点上运行(缩放)。它是每个节点上的NodePort设置。应用程序可以访问:

http://<Host1>:32250/index
http://<Host2>:32250/index
邢良才
2023-03-14

简而言之,服务监听集群中每个节点上的相同TCP/IP端口(34604),如描述服务输出所示:

NodePort:                 <unset>  34604

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

 类似资料:
  • 名称:示例-服务 命名空间:默认 标签:run=load-balancer-example 注释: 选择器:run=load-balancer-example 类型:nodeport IP:10.108.214.162 端口:9090/tcp 目标端口:9090/tcp 节点端口:31105/tcp endpoint:192.168.1.23:9090,192.168.1.24:9090 会话关联

  • 我在Google Container Engine上部署了一个容器,它运行良好。现在,我想公开它。 这个应用程序是一个侦听2个端口的服务。使用kubectl公开部署,我创建了2个负载均衡器,每个端口一个。 我制作了两个负载平衡器,因为kubectl expose命令似乎不允许使用多个端口。虽然我在kubectl上将其定义为type=LoadBalancer,但一旦在GKE上创建了它们,它们就被定义

  • 亲爱的,我已经部署了如下示例服务: 当我执行get nodes-o wide时,如下所示, 任何帮助。谢了。

  • 我是kubernetes的新手,我尝试使用Kubernete运行小型应用程序。我创建了docker镜像并使用minikube运行它。所以应用程序非常简单,它只打印hello world。 我的dockerfile文件: deployment.yaml 我运行命令: 创建deployment.yaml 输出是: 服务/myhelloworldservice已创建 创建的部署.apps/我的问候世界

  • 下列服务正在运行: 返回错误 重新构建URL到:http://localhost:8080/ 正在尝试127.0.0.1... 连接到127.0.0.1端口8080失败:连接被拒绝 连接到本地主机端口8080失败:连接被拒绝 关闭连接0卷:(7)无法连接到本地主机端口8080:连接被拒绝 我使用以下指南https://github.com/kubernetes/kubernetes/tree/ma

  • 我使用Micronaut 3.2.3和Kubernetes集成,从配置映射和机密中注入配置值。 依赖: bootstrap.yml 如您所见,应用程序配置图包括kafka.brokers值: 我添加了一个简单的单例类,用于检查是否可以注入项目: 日志跟踪似乎表明这些配置映射已被正确访问: 但是,应用程序崩溃,因为它找不到它: