【问题标题】:NodePort exposed Port connection refusedNodePort 暴露端口连接被拒绝
【发布时间】:2021-08-03 07:30:27
【问题描述】:

按照关于 Kubernetes 的教程并在日志看起来很好后卡住了,但是暴露的端口不起作用:使用 Chrome / curl 的“连接被拒绝”。

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

posts-srv.yaml - 更新

apiVersion: v1
kind: Service
metadata:
  name: posts-srv
spec:
  type: NodePort
  selector:
    app: posts
  ports:
    - name: posts
      protocol: TCP
      port: 4000
      targetPort: 4000
      nodePort: 32140

posts-depl.yaml - 更新

apiVersion: apps/v1
kind: Deployment
metadata:
  name: posts-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: posts
  template:
    metadata:
      labels:
        app: posts
    spec:
      containers:
        - name: posts
          image: suraniadi/posts
          ports:
            - containerPort: 4000
$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
posts-depl   1/1     1            1           27m
$ kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          27h
posts-srv    NodePort    10.111.64.122   <none>        4000:32140/TCP   21m
$ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
posts-depl-79b6889f89-rxdv2   1/1     Running   0          26m
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-13T13:23:52Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-13T13:15:20Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

【问题讨论】:

  • 请不要包含文字图片或文字图片的链接。包括相关日志和 YAML 源在您的问题中,格式为代码示例(阅读编辑器帮助以获取有关正确格式代码的更多信息)。
  • 谢谢你,@larsks!现在重新编辑。
  • @larsks 希望现在应该没问题!感谢您的反馈!
  • 您尝试连接的实际 URL 是什么?如果你docker run -p 4000:4000 suraniadi/posts同一个镜像在非Kubernetes环境下可以连接吗?
  • 你在 Dockerfile 中暴露了 4000 端口吗?在部署中,您也应该拥有containerPort: 4000

标签: node.js docker kubernetes yaml dockerfile


【解决方案1】:

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

apiVersion: v1
kind: Service
metadata:
  name: posts-srv
spec:
  type: NodePort
  selector:
    app: posts
  ports:
    - port: 4000
      targetPort: 4000
      nodePort: 32140
      protocol: TCP

要连接到 nodePort 服务,请验证是否有任何防火墙服务已启动,然后验证此端口是否已在您的 VM 中启用:(centos 示例)

sudo firewall-cmd  --permanent --add-port=32140/tcp

最后使用任何node IP地址(不是CLusterIP,这个IP是一个INTERNAL-IP在集群外无法访问)和nodePort连接到这个服务::<32140>

【讨论】:

【解决方案2】:

除了@Hajed 的回答(毫无疑问地赞成)我想再次提及Type NodePort Documentation,尤其是下一部分:

请注意,此服务显示为 &lt;NodeIP&gt;:spec.ports[*].nodePort.spec.clusterIP:spec.ports[*].port

为了让您的nodePort 服务按预期工作,请不要忘记使用spec.ports[*].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

几天前回答similar nodePort question - 也检查一下,也许将来会有所帮助。

【讨论】:

  • 试过了。 localhost:32140 不断发送连接被拒绝。
  • 我还更新了初始帖子,添加了更多版本日志和您推荐的文件。
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 2020-08-19
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多