Node.js 节点端口暴露的端口连接被拒绝

Node.js 节点端口暴露的端口连接被拒绝,node.js,docker,kubernetes,yaml,dockerfile,Node.js,Docker,Kubernetes,Yaml,Dockerfile,根据Kubernetes的教程,日志看起来不错,但暴露的端口不起作用,因此被卡住了。使用Chrome/curl的“连接被拒绝” 使用yaml文件通过NodePort/ClusterIP启动服务 posts-srv.yaml-更新 apiVersion:v1 种类:服务 元数据: 姓名:posts srv 规格: 类型:节点端口 选择器: app:posts 端口: -姓名:职位 协议:TCP 港口:4000 目标港:4000 节点端口:32140 posts-depl.yaml-更新 apiV

根据Kubernetes的教程,日志看起来不错,但暴露的端口不起作用,因此被卡住了。使用Chrome/curl的“连接被拒绝”

使用yaml文件通过NodePort/ClusterIP启动服务

posts-srv.yaml-更新

apiVersion:v1 种类:服务 元数据: 姓名:posts srv 规格: 类型:节点端口 选择器: app:posts 端口: -姓名:职位 协议:TCP 港口:4000 目标港:4000 节点端口:32140 posts-depl.yaml-更新

apiVersion:apps/v1 种类:部署 元数据: 姓名:邮政署 规格: 副本:1份 选择器: 火柴标签: app:posts 模板: 元数据: 标签: app:posts 规格: 容器: -姓名:职位 图片:苏拉尼亚迪/波斯特 端口: -集装箱港口:4000
$kubectl获取部署
姓名就绪最新可用年龄
邮政部1/127M
$kubectl获得服务
名称类型CLUSTER-IP外部IP端口年龄
kubernetes ClusterIP 10.96.0.1 443/TCP 27h
发布srv节点端口10.111.64.122 4000:32140/TCP 21m
$kubectl获得豆荚
名称就绪状态重新启动
立柱-depl-79b6889f89-rxdv2 1/1运行0.26米
$kubectl版本
客户端版本:Version.Info{Major:“1”,Minor:“19”,GitVersion:“v1.19.7”,GitCommit:“1dd5338295409edcfff11505e7bb246f0d325d15”,gittrestate:“clean”,BuildDate:“2021-01-13T13:23:52Z”,政府版本:“go1.15.5”,编译器:“gc”,平台:“darwin/amd64”}
服务器版本:Version.Info{Major:“1”,Minor:“19”,GitVersion:“v1.19.7”,GitCommit:“1dd5338295409edcfff11505e7bb246f0d325d15”,gittrestate:“clean”,BuildDate:“2021-01-13T13:15:20Z”,政府版本:“go1.15.5”,编译器:“gc”,平台:“linux/amd64”}

出于结构原因,最好在服务yaml配置文件中指定节点端口,否则kubernetes将从k8s端口范围(30000-32767)中随机分配。 在端口部分,它是一个端口列表,在您的情况下,无需指定名称,请查看更多信息。 这应该适合您:

apiVersion: v1
kind: Service
metadata:
  name: posts-srv
spec:
  type: NodePort
  selector:
    app: posts
  ports:
    - port: 4000
      targetPort: 4000
      nodePort: 32140
      protocol: TCP
要连接到nodePort服务,请验证是否有任何防火墙服务已启动,然后验证是否已在虚拟机中启用此端口:(centos示例)


最后,使用任何节点IP地址(不是群集IP,此IP是群集外部无法访问的内部IP)和节点端口连接到此服务:

除了@Hajed answer(毫无疑问地向上投票)之外,我还要再次提一提,特别是下一部分:

请注意,此服务显示为
:spec.ports[*].nodePort
.spec.clustrip:spec.port[*].port

为了使您的
nodePort
服务按预期工作,请不要忘记使用
spec.port[*]。nodePort

你的服务应该是

apiVersion: v1
kind: Service
metadata:
  name: posts-srv
spec:
  type: NodePort
  selector:
    app: posts
  ports:
    - port: 4000
      targetPort: 4000
      nodePort: 32140 #you can use here 30000-32767 range. Just not forget to open firewall rule for this exact port further
      protocol: TCP

前几天已回答-也请检查,也许将来会有帮助。

请不要包含文字图片或文字图片链接。在您的问题中包括相关日志和YAML源代码,格式为代码示例(有关正确格式代码的更多信息,请阅读编辑器帮助)。谢谢,@larsks!现在重新编辑。@larsks希望现在可以了!谢谢你的反馈!您要连接的实际URL是什么?如果您
docker在非Kubernetes环境中运行-p 4000:4000 suraniadi/posts
相同的映像,您可以连接到它吗?您是否在Dockerfile中公开了端口4000?在部署中,您还应该有
containerPort:4000
。完全按照您的建议进行了尝试。我使用mac,所以端口应该是打开的,默认情况下防火墙是关闭的。我试图点击localhost:32140,但没有成功。另一个问题是我没有任何外部IP地址显示在任何地方
$kubectl get nodes-o wide
对于外部IP地址仍然不显示任何内容。nodePort不配置外部IP节点,此APi资源只会将服务的流量绑定到所有群集节点中的特定端口。请运行$kubectl get svc检查。localhost:32140一直拒绝发送连接。我还更新了初始帖子,添加了更多版本日志和您推荐的文件。
sudo firewall-cmd  --permanent --add-port=32140/tcp
apiVersion: v1
kind: Service
metadata:
  name: posts-srv
spec:
  type: NodePort
  selector:
    app: posts
  ports:
    - port: 4000
      targetPort: 4000
      nodePort: 32140 #you can use here 30000-32767 range. Just not forget to open firewall rule for this exact port further
      protocol: TCP