部署到 Kubernetes 后无法看到我的 React 应用程序
Unable to see my react application after deploying into Kubernetes
我已按照此参考将我的简单 React 应用程序部署到 Kubernetes 中。
但是部署后,我在浏览器中看不到我的应用程序。
所以我尝试使用此命令行设置外部 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 部署在该节点上。要获取 Node
的 ExternalIP
,您可以使用命令。
$ kubectl get node -o wide
要获取有关部署了哪些节点、特定 pod 的信息,您可以执行命令
`$ kubectl get po -o wide
NodePort
数字是从范围 30000-32767
.
分配的
重要
请记住配置防火墙以允许此特定端口上的流量,或者如果它只是用于测试,您可以允许整个范围 30000-32767
.
例子
假设您的应用程序 pod 部署在 Node
上 ExternalIP: 35.228.76.198
,而您的 service NodePort
是 31300。
如果您正确配置了防火墙规则并且设置了正确的 containerPort
(您的应用程序必须侦听此端口),当您在浏览器中使用 35.228.76.198:31300
时,您应该可以访问您的应用程序。
在这个选项中,服务是LoadBalancer
类型,这意味着云正在创建LB
和ExternalIP
。您只需在浏览器中输入此 IP 即可访问您的应用程序。但是,请记住 LoadBalancer
是额外付费的。
在此选项中,您必须使用某种 Ingress Controller
。最常见的是 Nginx Ingress Controller。在此选项中,根据您的需要,您可以将 Ingress 创建为 NodePort
或 LoadBalancer
选项。
有用链接
如果您能够访问您的应用程序或者您还有其他问题,请告诉我。
我已按照此参考将我的简单 React 应用程序部署到 Kubernetes 中。
但是部署后,我在浏览器中看不到我的应用程序。
所以我尝试使用此命令行设置外部 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
应该 returnNodeIP
.
如果启用节点的安全组以允许通过端口 NodeIP:NodePort
应该可以访问
31300
. 传入流量,您正在混合使用 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 部署在该节点上。要获取 Node
的 ExternalIP
,您可以使用命令。
$ kubectl get node -o wide
要获取有关部署了哪些节点、特定 pod 的信息,您可以执行命令 `$ kubectl get po -o wide
NodePort
数字是从范围 30000-32767
.
重要
请记住配置防火墙以允许此特定端口上的流量,或者如果它只是用于测试,您可以允许整个范围 30000-32767
.
例子
假设您的应用程序 pod 部署在 Node
上 ExternalIP: 35.228.76.198
,而您的 service NodePort
是 31300。
如果您正确配置了防火墙规则并且设置了正确的 containerPort
(您的应用程序必须侦听此端口),当您在浏览器中使用 35.228.76.198:31300
时,您应该可以访问您的应用程序。
在这个选项中,服务是LoadBalancer
类型,这意味着云正在创建LB
和ExternalIP
。您只需在浏览器中输入此 IP 即可访问您的应用程序。但是,请记住 LoadBalancer
是额外付费的。
在此选项中,您必须使用某种 Ingress Controller
。最常见的是 Nginx Ingress Controller。在此选项中,根据您的需要,您可以将 Ingress 创建为 NodePort
或 LoadBalancer
选项。
有用链接
如果您能够访问您的应用程序或者您还有其他问题,请告诉我。