【问题标题】:Unable to see my react application after deploying into Kubernetes部署到 Kubernetes 后看不到我的反应应用程序
【发布时间】:2021-03-26 09:23:20
【问题描述】:

我已按照此参考将我的简单 React 应用程序部署到 Kubernetes。

https://medium.com/bb-tutorials-and-thoughts/aws-deploying-react-app-with-nodejs-backend-on-eks-e5663cb5017f

但部署后,我在浏览器中看不到我的应用程序。

所以我尝试使用此命令行设置外部 IP 地址

kubectl patch svc XXX -p '{"spec":{"externalIPs":["10.2.8.19"]}}'

参考在这里 Assign External IP to a Kubernetes Service

但是我在浏览器中看不到我的应用程序部署。 http://10.2.8.192:3000

这是我的 deployment.yml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: test-app
  name: test-app
spec:
  replicas: 5
  selector:
    matchLabels:
      app: test-app
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: test-app
    spec:
      containers:
      - image: XXX.dkr.ecr.XXX.amazonaws.com/XXX/XXX:v1
        name: test-app
        imagePullPolicy: Always
        resources: {}
        ports:
          - containerPort: 3000
status: {}

---

apiVersion: v1
kind: Service
metadata:
  name: test-app
  labels:
    run: test-app
spec:
  ports:
  - port: 3000
    protocol: TCP
  selector:
    app: test-app
  type: NodePort

请给我任何建议。谢谢...

【问题讨论】:

  • 嗨,麦克斯!您是否可以通过网络访问节点?你能ping通吗?
  • 我需要在 EC2 实例中使用公共 IP 地址 ping 吗?
  • 或者你的意思是在 Kubernetes 中使用 nodeport ping?
  • 您使用的是什么 Kubernetes?如果是 EKS,将服务更改为 type: LoadBalancer 将导致它创建一个 AWS 负载均衡器,您可以使用它来访问该服务。如果是 type: NodePort,那么您可以使用任何节点的 IP 地址或 DNS 名称以及 kubectl get service 列表中的第二个 31300 端口号来访问它。
  • 我现在正在使用 NodePort。节点的 IP 地址是什么?

标签: reactjs docker kubernetes amazon-eks amazon-ecr


【解决方案1】:

您正在混合使用 2 种方式在外部公开服务。您想使用NodePort,但您正在设置ExternalIP

问题根源

在您的设置中,您使用的是NodePort,因此您需要将节点的ExternalIPNodePort 一起使用,即31300(下面有更多详细信息)。

在此设置中在NodePort 服务中设置ExternalIP 是没有意义的(10.2.8.19 也是InternalIP,它只允许您在集群中连接)。

在您的示例中,您尝试使用您的application port 号码访问应用程序,但您应该使用服务nodePort 号码,即31300

注意

服务可以将任何传入端口映射到目标端口。默认情况下,为方便起见,targetPort 设置为与端口字段相同的值。

暴露应用程序

通常,您有 3 种主要方式来公开您的应用程序:

我无权访问medium 文章,但我猜在本教程中使用了NodePort

在此配置中,您必须使用serviceType: NodePort。要使用nodeport 进行连接,您必须使用ExternalHostIP:NodePort。当您使用云环境时,您的虚拟机应该已经有ExternalIP

ExternalHostIP 是节点的 IP 地址,部署了应用程序端点 pod。要获取Node 中的ExternalIP,您可以使用命令。 $ kubectl get node -o wide

要获取有关部署了哪个节点、特定 pod 的信息,您可以执行命令 `$ kubectl get po -o wide

NodePort 号码是从30000-32767 范围内分配的。

重要 请记住配置防火墙以允许此特定端口上的流量,或者如果只是为了测试,您可以允许整个范围30000-32767

示例 假设您的应用程序 pod 部署在 NodeExternalIP: 35.228.76.198 上,而您的 service NodePort 是 31300。

如果您正确配置了防火墙规则并且设置了正确的containerPort(您的应用程序必须在此端口上侦听),那么当您在浏览器中使用35.228.76.198:31300 时,您应该可以访问您的应用程序。

在此选项中,服务为LoadBalancer 类型,这意味着云正在使用ExternalIP 创建LB。您只需在浏览器中输入此 IP 即可访问您的应用程序。但是,请记住LoadBalancer 是额外付费的。

在此选项中,您必须使用某种Ingress Controller。最常见的是Nginx Ingress Controller。在此选项中,根据您的需要,您可以将 Ingress 创建为 NodePortLoadBalancer 选项。

有用的链接

如果您能够联系到您的申请或者您还有其他问题,请告诉我。

【讨论】:

    【解决方案2】:

    如果您想使用NodePort 公开您的应用程序,您可以查看How do I expose the Kubernetes services running on my Amazon EKS cluster?

    • 您的Deployment 似乎缺少targetPort
    • kubectl get nodes 应该返回 NodeIP
    • 如果您启用节点的安全组以允许通过端口 31300 的传入流量,NodeIP:NodePort 应该是可访问的。

    【讨论】:

    • 如何获取 NodeIP? “kubectl get nodes”返回每个节点的内部 IP 地址。我应该在 EC2 实例中使用公共地址吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多