NodePort在OpenShift CodeReady容器中不起作用

时间:2019-12-18 18:29:44

标签: kubernetes openshift

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

运行应用程序并将其作为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,我可以在我的VM上成功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

现在,运行一个位于我的VM中的客户端应用程序,因为我可以ping OpenShift Node IP,所以我认为我可以成功运行该客户端应用程序。结果是连接超时,我的客户端无法连接在OpenShift上运行的服务器。

请提供有关如何解决问题的建议,或有关此问题的任何想法。

2 个答案:

答案 0 :(得分:0)

我了解您的问题。按照您的描述,我可以看到您的Node端口是31777

调试此问题的最佳方法是逐步进行。

步骤1: 检查您是否能够使用Pod IP和端口(即curl 10.128.0.229:7777/endpoint)从群集中的一个节点访问应用程序服务器。这有助于您检查Pod是否正常工作。即使kubectl describe pod为您提供了一切。

步骤2: 之后,在部署了Pod的节点上,即192.168.130.11,尝试使用curl localhost:31777/endpoint访问您的应用服务器。如果可行,则可以访问Nodeport,即您的服务运行正常,没有任何问题。

步骤3: 之后,尝试使用运行客户端服务器的vm中的curl 192.168.130.11:31777/endpoint连接到您的节点。请注意,192。是A类私有IP,因此我假设您的客户端位于同一网络中并且能够与192.169.130.11:31777进行通信,或者确保您打开各自的777.169.130.11的31777端口以具有客户端服务器的vm ip。

这是调试服务和Pod问题的一个小过程。但是最好的方法是使用入口和入口控制器,这将帮助您使用URL而不是IP地址和端口号与您的应用服务器进行通信。但是,即使使用Ingress和Ingress控制器,调试所有部件的最佳方法仍可以按预期方式工作。

如有任何问题,请随时告诉我。

答案 1 :(得分:-1)

感谢及时回答。

关于步骤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的节点上运行命令“ curl localhost:31777 / endpoint”,失败。

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

这意味着31777似乎没有被OpenShift打开。

您是否有任何想法如何检查OpenShift未打开31777的原因。

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

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>
相关问题