部署到 Kubernetes 后无法看到我的 React 应用程序

Unable to see my react application after deploying into Kubernetes

我已按照此参考将我的简单 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

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

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

  • 您的 Deployment 好像少了一个 targetPort
  • kubectl get nodes 应该 return NodeIP.
  • 如果启用节点的安全组以允许通过端口 31300. 传入流量,
  • NodeIP:NodePort 应该可以访问

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

问题根本原因

在您的设置中,您使用的是 NodePort,因此您需要使用具有 NodePort 的节点的 ExternalIP,即 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 部署在该节点上。要获取 NodeExternalIP,您可以使用命令。 $ 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类型,这意味着云正在创建LBExternalIP。您只需在浏览器中输入此 IP 即可访问您的应用程序。但是,请记住 LoadBalancer 是额外付费的。

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

有用链接

如果您能够访问您的应用程序或者您还有其他问题,请告诉我。