当前位置: 首页 > 知识库问答 >
问题:

NodePort 在 OpenShift CodeReady 容器中不起作用

周鸿光
2023-03-14

在 CentOS VM 上安装最新的 OpenShift CodeReady 容器,然后在 OpenShift 上运行由 Java 编写的 TCP 服务器应用程序。TCP 服务器正在侦听端口 7777。

运行app,用NodePort将其公开为服务,看起来一切运行良好。pod端口是7777,服务端口是31777。

$ oc get pods -o wide
NAME READY   STATUS    RESTARTS   AGE     IP   NODE         NOMINATED NODE   READINESS GATES
tcpserver-57c9b44748-k9dxg 1/1 Running 0  113m 10.128.0.229  crc-2n9vw-master-0 <none>  <none>

$ oc get svc
NAME               TYPE     CLUSTER-IP      EXTERNAL-IP   PORT(S)                   AGE
tcpserver-ingres  NodePort    172.30.149.98   <none>      7777:31777/TCP            18m

然后获取节点ip,命令显示为192.168.130.11,我可以在我的虚拟机上成功ping通这个IP。

$ oc get nodes -o wide
NAME                 STATUS   ROLES           AGE   VERSION             INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                                                   KERNEL-VERSION                CONTAINER-RUNTIME
crc-2n9vw-master-0   Ready    master,worker   26d   v1.14.6+6ac6aa4b0   192.168.130.11   <none>        Red Hat Enterprise Linux CoreOS 42.81.20191119.1 (Ootpa)   4.18.0-147.0.3.el8_1.x86_64   cri-o://1.14.11-0.24.dev.rhaos4.2.gitc41de67.el8

现在,运行位于我的虚拟机中的客户端应用程序,因为我可以ping通OpenShift节点IP,所以我认为我可以成功运行客户端应用程序。结果是连接超时,我的客户端无法连接运行在OpenShift上的服务器。

请给出如何解决问题的建议,或对问题的任何想法。

共有2个答案

汪高岑
2023-03-14

谢谢及时回复。

关于步骤 1,我不知道我可以在哪里在集群内运行“curl 10.128.0.229:7777/endpoint”,但我通过进入内部 pod 检查 pod 的状态,端口 777 正在按预期侦听。

$ oc rsh tcpserver-57c9b44748-k9dxg
sh-4.2$ netstat -nap | grep 7777
tcp6       0      0 127.0.0.1:7777      :::*     LISTEN      1/java   

关于第2步,在部署pod的节点上运行命令“curllocalhost:31777/endpoint”,它失败了。

$ curl localhost:31777/endpoint
curl: (7) Failed to connect to localhost port 31777: Connection refused

那就是说,31777好像不是OpenShift打开的。

您是否有任何想法如何检查为什么31777未被OpenShift打开。

有关服务定义的更多信息:

apiVersion: v1
kind: Service
metadata:
  name: tcpserver-ingress
  labels:
    app: tcpserver
spec:
  selector:
    app: tcpserver
  type: NodePort
  ports:
    - protocol: TCP
      port: 7777
      targetPort: 7777
      nodePort: 31777

服务状态:

$ oc describe svc tcpserver-ingress
Name:                     tcpserver-ingress
Namespace:                myproject
Labels:                   app=tcpserver
Annotations:              <none>
Selector:                 app=tcpserver
Type:                     NodePort
IP:                       172.30.149.98
Port:                     <unset>  7777/TCP
TargetPort:               7777/TCP
NodePort:                 <unset>  31777/TCP
Endpoints:                10.128.0.229:7777
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
慕和惬
2023-03-14

我理解你的问题。根据您的描述,我可以看到您的节点端口是3177

调试此问题的最佳方法是循序渐进。

步骤1:检查您是否能够使用pod IP和端口访问应用服务器,即curl 10.128.0.229:7777/endpoint集群中的一个节点访问应用服务器。这有助于检查pod是否工作。尽管kubectl描述pod为您提供了一切。

步骤2:之后,在部署pod的节点上,即1192.168.130.11,尝试使用curl localhost:31777/endpoint访问应用服务器。如果这样做有效,Nodeport是可访问的,即您的服务工作正常,没有任何问题。

步骤3:之后,尝试从运行客户端服务器的虚拟机使用< code > curl 192 . 168 . 130 . 11:31777/endpoint 连接到您的节点。只是想让你知道,192。是A类私有ip,所以我假设您的客户端在同一个网络中,并且能够与192.169.130.11:31777通信,或者确保您将各自的192.169.130.11 31777端口开放给拥有客户端服务器的虚拟机ip。

这是一个调试服务和pod问题的小过程。但最好的方法是使用入口和入口控制器,这将帮助您使用url而不是ip地址和端口号与应用服务器进行通信。然而,即使使用入口和入口控制器,调试所有部件是否按预期工作的最佳方法是遵循以下步骤。

请随时让我知道任何问题。

 类似资料:
  • 问题内容: 我想在页脚元素的右边放置文本(foo链接)。 我需要保留页脚显示。 但是当我将其设置为时,span不再起作用。 问题答案: 该属性在flex容器中被忽略。 根据flexbox规范: 3. Flex容器:和显示值 一个伸缩容器为其内容建立一个新的_伸缩格式上下文_。这与建立块格式化上下文相同,除了使用Flex布局而不是块布局。 例如,浮点数不会侵入flex容器,并且flex容器的边距不会

  • 问题内容: 我有这个Docker Compose配置,我只需创建一个NodeJS容器并在其中安装Angular CLI。 之后,我可以使用SSH在容器内进行SSH 。可以正常工作,但似乎不起作用。它已正确启动,控制台中没有错误。但是,如果我访问(我将端口4200映射到80),则不会加载任何内容。 我想念什么吗? 问题答案: 在您的Dockerfile中,您缺少Expose行,例如: 尝试将其放在d

  • 我正在尝试用flex创建一个布局(将是一个音乐播放器)。 我有3个按钮(上一个、播放和下一个,用红色方块表示),我总是希望它们在同一条线上。 然后,我想在按钮右侧显示一些歌曲信息(当前时间、歌曲标题和总时间)。 我几乎总是希望总时间在最右边,歌曲标题填满剩余的宽度(使用),但随着窗口变小,用省略号截断。 有人知道如何调整它以使其正常工作吗? https://jsfiddle.net/13ohs7j

  • 我想在从Debian官方Docker中心仓库派生的docker容器中执行ps命令:

  • 但我也想在集群外访问它。Description输出表示它使用端口30177上的NodePort公开。 但我无法在上访问它

  • 解决方案:docker检查|grep IP获取运行容器ip的postgres,并分别用容器的ip和port更新您的envDB_HOST和DB_PORT。 更新:由于ip地址可能会更改,因此将postgres写入DB_主机是最佳做法。 我一直在寻找一天的时间将数据库从docker容器连接到我的Laravel应用程序,但无论我做了什么尝试,即使我可以通过Postco连接,我也无法迁移我的数据库。我得到